import locales from './index.js';

const showUntranslated = process.argv[2] == '-v';

let valid = true;

function writeError(type, lang, tree, data) {
	process.stderr.write(JSON.stringify({ type, lang, tree, data }));
	process.stderr.write('\n');
	valid = false;
}

function verify(expected, actual, lang, trace) {
	for (let key in expected) {
		if (!Object.prototype.hasOwnProperty.call(actual, key)) {
			continue;
		}
		if (typeof expected[key] === 'object') {
			if (typeof actual[key] !== 'object') {
				writeError('mismatched_type', lang, trace ? `${trace}.${key}` : key, { expected: 'object', actual: typeof actual[key] });
				continue;
			}
			verify(expected[key], actual[key], lang, trace ? `${trace}.${key}` : key);
		} else if (typeof expected[key] === 'string') {
			switch (typeof actual[key]) {
				case 'object':
					writeError('mismatched_type', lang, trace ? `${trace}.${key}` : key, { expected: 'string', actual: 'object' });
					break;
				case 'undefined':
					continue;
				case 'string':
					const expectedParameters = new Set(expected[key].match(/\{[^}]+\}/g)?.map((s) => s.slice(1, -1)));
					const actualParameters = new Set(actual[key].match(/\{[^}]+\}/g)?.map((s) => s.slice(1, -1)));
					for (let parameter of expectedParameters) {
						if (!actualParameters.has(parameter)) {
							writeError('missing_parameter', lang, trace ? `${trace}.${key}` : key, { parameter });
						}
					}

				if (showUntranslated && actual[key] == expected[key]) {
					writeError('untranslated', lang, trace ? `${trace}.${key}` : key, { original: expected[key] });
				}
			}
		}
	}
}

const { ['ja-JP']: original, ...verifiees } = locales;

for (let lang in verifiees) {
	if (!Object.prototype.hasOwnProperty.call(locales, lang)) {
		continue;
	}
	verify(original, verifiees[lang], lang);
}

if (!valid) {
	process.exit(1);
}
