/* eslint-disable unicorn-x/no-process-exit */
import { createProjectFileMapUsingProjectGraph, createProjectGraphAsync, output } from '@nx/devkit'
import { releaseChangelog, releaseVersion } from 'nx/src/command-line/release'
import { createNxReleaseConfig, handleNxReleaseConfigError } from 'nx/src/command-line/release/config/config'
import { filterReleaseGroups } from 'nx/src/command-line/release/config/filter-release-groups'
import { readNxJson } from 'nx/src/config/nx-json'

async function main() {
	const projectGraph = await createProjectGraphAsync({ exitOnError: true })
	const projectFileMap = await createProjectFileMapUsingProjectGraph(projectGraph)
	const nxJson = readNxJson()

	const { error: configError, nxReleaseConfig } = await createNxReleaseConfig(
		projectGraph,
		projectFileMap,
		nxJson.release,
	)
	if (configError) {
		return await handleNxReleaseConfigError(configError)
	}

	const { error: filterError, releaseGroups } = filterReleaseGroups(projectGraph, nxReleaseConfig, undefined)
	if (filterError) {
		output.error(filterError)
		process.exit(1)
	}

	for (const releaseGroup of releaseGroups) {
		const projects = releaseGroup.projects

		const versionResult = await releaseVersion({ projects })

		await releaseChangelog({
			projects,
			versionData: versionResult.projectsVersionData,
		})
	}

	process.exit(0)
}

main().catch((error) => {
	console.error(error)
	throw new Error(error)
})
