import m from 'mithril'
import render from 'mithril-node-render'
import { type Repository } from '../src/dataTypes.ts'
import getFlatRefs from '../src/flatRefs.ts'
import { dateToRfc3339 } from '@11ty/eleventy-plugin-rss'
import { flatPatches } from '../src/flatPatches.ts'

export default async (
  eleventyConfig: any,
) => {
  return (data) => {
    const flatRef: ReturnType<typeof getFlatRefs>[0] = data.flatRef
    const currentRepo: Repository = data.currentRepo
    const currentRef: Repository['branches'][0] = data.currentRef
    const currentRefCommits: Awaited<ReturnType<typeof flatPatches>> = data.currentRefCommits

    const slugify = eleventyConfig.getFilter("slugify")

    return render([
      m.trust('<?xml version="1.0" encoding="utf-8"?>'),
      m('feed', {xmlns: "http://www.w3.org/2005/Atom"}, [
        m('title', `Commits in ${flatRef.repoName} / ${flatRef.refName}`),
        m.trust(`<link href="${ data.reposConfig.baseUrl + '/repos/' + slugify(flatRef.repoName) + `/${flatRef.type}/` + slugify(flatRef.refName) + '/commits.xml'}" rel="self" />`),
        m.trust(`<link href="${data.reposConfig.baseUrl + '/repos/' + slugify(flatRef.repoName) + `/${flatRef.type}/` + slugify(flatRef.refName)}" />`),
        m('updated', dateToRfc3339(currentRepo.commits.get(currentRef.sha).date)),
        m('id', data.reposConfig.baseUrl),
        m('author',
          m('name', `${currentRepo.name} contributors`)
        ),
        currentRefCommits.map((commit) => {
          const commitUrl = data.reposConfig.baseUrl + '/repos/' + slugify(flatRef.repoName) + `/${flatRef.type}/` + slugify(flatRef.refName) + '/commits/' + commit.commit.hash
          return m('entry', [
            m('title', commit.commit.message.split('\n')[0]),
            m('author', m('name', commit.commit.author)),
            m.trust(`<link href="${commitUrl}" />`),
            m('updated', dateToRfc3339(commit.commit.date)),
            m('id', commitUrl),
            m('content', {type: "text"}, commit.commit.message),
          ])
        })
      ])
    ])
  }
}
