#!/usr/bin/env node

const {
	existsSync,
	promises: { writeFile },
} = require('fs');
const path = require('path');
const { packageDir } = require('./common');

const ALLOWED_HEADER_KEYS = ['displayName', 'description'];
const PURPLE_ANSI_COLOR_CODE = 35;

function getNodeTranslationPaths() {
	const nodeDistPaths = require(`${packageDir}/package.json`).n8n.nodes;
	const { N8N_DEFAULT_LOCALE: locale } = process.env;

	return nodeDistPaths.reduce((acc, cur) => {
		const nodeTranslationPath = path.join(
			packageDir,
			cur.split('/').slice(1, -1).join('/'),
			'translations',
			locale,
			toTranslationFile(cur),
		);

		if (existsSync(nodeTranslationPath)) {
			acc.push(nodeTranslationPath);
		}

		return acc;
	}, []);
}

function getHeaders(nodeTranslationPaths) {
	return nodeTranslationPaths.reduce((acc, cur) => {
		const { header } = require(cur);
		const nodeType = cur.split('/').pop().replace('.json', '');

		if (isValidHeader(header, ALLOWED_HEADER_KEYS)) {
			acc[nodeType] = header;
		}

		return acc;
	}, {});
}

// ----------------------------------
//             helpers
// ----------------------------------

function toTranslationFile(distPath) {
	const raw = distPath.split('/').pop().replace('.node', '') + 'on';
	return raw.charAt(0).toLowerCase() + raw.slice(1);
}

function isValidHeader(header, allowedHeaderKeys) {
	if (!header) return false;

	const headerKeys = Object.keys(header);

	return headerKeys.length > 0 && headerKeys.every((key) => allowedHeaderKeys.includes(key));
}

function writeDistFile(data, distPath) {
	writeFile(distPath, `module.exports = ${JSON.stringify(data, null, 2)}`);
}

const log = (string, { bulletPoint } = { bulletPoint: false }) => {
	if (bulletPoint) {
		process.stdout.write(colorize(PURPLE_ANSI_COLOR_CODE, `- ${string}\n`));
		return;
	}

	process.stdout.write(`${string}\n`);
};

const colorize = (ansiColorCode, string) =>
	['\033[', ansiColorCode, 'm', string, '\033[0m'].join('');

/**
 * Write node translation headers to single file at `/dist/nodes/headers.js`.
 */
const { N8N_DEFAULT_LOCALE: locale } = process.env;

log(`Default locale set to: ${colorize(PURPLE_ANSI_COLOR_CODE, locale || 'en')}`);

if (!locale || locale === 'en') {
	log('No translation required - Skipping translations build...');
	return;
}

const nodeTranslationPaths = getNodeTranslationPaths();
const headers = getHeaders(nodeTranslationPaths);
const headersDistPath = path.join(packageDir, 'dist', 'nodes', 'headers.js');

writeDistFile(headers, headersDistPath);

log('Headers file written to:');
log(headersDistPath, { bulletPoint: true });