import { type Repository } from "./dataTypes.ts"

let cachedFlatFiles: Array<FlatFileEntry> | null = null
export type FlatFileEntry = {
  file: string,
  refName: string,
  repoName: string,
  type: 'branch' | 'tag',
}

export default (repos: Array<Repository>) : Array<FlatFileEntry> => {
  if (cachedFlatFiles !== null) { return cachedFlatFiles }

  const itemsFromRefFileList: (ref: Repository['tags'][0], repoName: string, refType: 'branch' | 'tag') => Array<FlatFileEntry> = (ref, repoName, refType) => {
    return Array.from(ref.fileList.keys()).map((file) => {
      return {
        file,
        refName: ref.name,
        repoName: repoName,
        type: refType,
      }
    })
  }

  const branches: FlatFileEntry[] = repos.flatMap((repo) => {
    return repo.branches.flatMap(branch => itemsFromRefFileList(branch, repo.name, 'branch'))
  })

  const tags: FlatFileEntry[] = repos.flatMap((repo) => {
    return repo.tags.flatMap(tag => itemsFromRefFileList(tag, repo.name, 'tag'))
  })

  cachedFlatFiles = [...branches, ...tags]

  return cachedFlatFiles
}
