import { parseLine } from "./line-parser.js";
import { diffLines } from "diff";
import { markdownTable } from "markdown-table";

//#region lib/modules/manager/gomod/artifacts-extra.ts
function getExtraDeps(goModBefore, goModAfter, excludeDeps) {
	const result = [];
	const diff = diffLines(goModBefore, goModAfter, { newlineIsToken: true });
	const addDeps = {};
	const rmDeps = {};
	for (const { added, removed, value } of diff) {
		if (!added && !removed) continue;
		const res = parseLine(value);
		if (!res) continue;
		const { depName, depType, currentValue } = res;
		if (!depName || !currentValue) continue;
		let expandedDepName = depName;
		if (depType === "toolchain") expandedDepName = `${depName} (${depType})`;
		if (added) addDeps[expandedDepName] = currentValue;
		else rmDeps[expandedDepName] = currentValue;
	}
	for (const [depName, currentValue] of Object.entries(rmDeps)) {
		if (excludeDeps.includes(depName)) continue;
		const newValue = addDeps[depName];
		if (newValue) result.push({
			depName,
			currentValue,
			newValue
		});
	}
	return result;
}
function extraDepsTable(extraDeps) {
	const tableLines = [];
	tableLines.push(["**Package**", "**Change**"]);
	for (const { depName, currentValue, newValue } of extraDeps) {
		const depNameQuoted = `\`${depName}\``;
		const versionChangeQuoted = `\`${currentValue}\` -> \`${newValue}\``;
		tableLines.push([depNameQuoted, versionChangeQuoted]);
	}
	return markdownTable(tableLines, { align: ["l", "l"] });
}
function getExtraDepsNotice(goModBefore, goModAfter, excludeDeps) {
	if (!goModBefore || !goModAfter) return null;
	const extraDeps = getExtraDeps(goModBefore, goModAfter, excludeDeps);
	if (extraDeps.length === 0) return null;
	const noticeLines = ["In order to perform the update(s) described in the table above, Renovate ran the `go get` command, which resulted in the following additional change(s):", "\n"];
	const goUpdated = extraDeps.some(({ depName }) => depName === "go");
	const toolchainUpdated = extraDeps.some(({ depName }) => depName === "go (toolchain)");
	const otherDepsCount = extraDeps.length - (goUpdated ? 1 : 0) - (toolchainUpdated ? 1 : 0);
	if (otherDepsCount === 1) noticeLines.push(`- ${otherDepsCount} additional dependency was updated`);
	else if (otherDepsCount > 1) noticeLines.push(`- ${otherDepsCount} additional dependencies were updated`);
	if (goUpdated) noticeLines.push("- The `go` directive was updated for compatibility reasons");
	noticeLines.push("\n");
	noticeLines.push("Details:");
	noticeLines.push("\n");
	noticeLines.push(extraDepsTable(extraDeps));
	return noticeLines.join("\n");
}

//#endregion
export { getExtraDepsNotice };
//# sourceMappingURL=artifacts-extra.js.map