import { Octokit } from "@octokit/rest"
const repo = "ragestudio/comty"

const octokit = new Octokit({
	auth: process.env.GITHUB_TOKEN,
})

export default async function getChangeLogString() {
	// get latest tag
	const latestTag = await octokit.repos.getLatestRelease({
		owner: repo.split("/")[0],
		repo: repo.split("/")[1],
	})

	// get commits since latest tag
	const commits = await octokit.repos.listCommits({
		owner: repo.split("/")[0],
		repo: repo.split("/")[1],
		since: latestTag.data.published_at,
	})

	let changelog = commits.data.map(async (commit) => {
		const commitData = await octokit.repos.getCommit({
			owner: repo.split("/")[0],
			repo: repo.split("/")[1],
			ref: commit.sha,
		})

		const filenamesChanged = commitData.data.files.map((file) => {
			return file.filename
		})

		// check packages involved in each commit
		let packagesChanged = filenamesChanged.map((file) => {
			// search for the pkg name in the path (eg packages/app/src/...)
			const pkg = file.split("/")[1]

			// if the pkg is not found, return null
			if (!pkg) return null

			return pkg
		})

		// filter out null values
		packagesChanged = packagesChanged.filter((pkg) => {
			return pkg !== null
		})

		// remove duplicates
		packagesChanged = [...new Set(packagesChanged)]

		// if no packages changed, return "internal"
		if (packagesChanged.length === 0) {
			packagesChanged = ["internal"]
		}

		return {
			message: commitData.data.commit.message,
			author: commitData.data.commit.author.name,
			authorUrl: commitData.data.author.html_url,
			url: commit.html_url,
			filenamesChanged: filenamesChanged,
			files: commitData.data.files,
			packages: packagesChanged,
		}
	})

	changelog = await Promise.all(changelog)

	// make a string from the changes with Markdown syntax
	let changelogString = changelog
		.map((commit) => {
			const additions = commit.files
				.map((file) => {
					return file.additions
				})
				.reduce((a, b) => a + b, 0)

			const deletions = commit.files
				.map((file) => {
					return file.deletions
				})
				.reduce((a, b) => a + b, 0)

			return `* [+${additions}/-${deletions}][${commit.packages.join(" | ")}] [${commit.message}](${commit.url}) - by [@${commit.author}](${commit.authorUrl})`
		})
		.join("\n\n")

	changelogString = changelogString.trim()

	return changelogString
}