import { type Repository } from './dataTypes.ts'
import flatPatchesFunc from './flatPatches.js'

export type PatchPage = {
  repoName: string,
  branchName: string,
  commits: Array<ReturnType<Repository['commits']['get']>>,
  pageNumber: number,
}
let paginatedPatches: Array<PatchPage> | null = null

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

  const flatPatches = await flatPatchesFunc(repos)

  paginatedPatches = []
  const patchesPerPage = 30

  flatPatches.forEach((patch) => {
    const index = paginatedPatches.findIndex((page) => {
      return (
        page.repoName === patch.repoName
        && page.branchName == patch.branchName
        && page.commits.length <= patchesPerPage
      )
    })

    if (index === -1) {
      const pageNumber = paginatedPatches.filter(page => (page.repoName === patch.repoName && page.branchName === patch.branchName)).length + 1
      paginatedPatches.push({
        repoName: patch.repoName,
        branchName: patch.branchName,
        commits: [patch.commit],
        // current page number is one more than "how many items in paginatedPatches already
        // have repoName as their repo name.
        pageNumber,
      })
    }
    else {
      paginatedPatches[index].commits.push(patch.commit)
    }
  })

  return paginatedPatches
}

