const i18next = require("i18next");
const Backend = require("i18next-node-fs-backend");
const path = require("path");
const fs = require("fs").promises;

async function walkDirectory(dir, namespaces = [], folderName = "") {
	const files = await fs.readdir(dir);

	const languages = [];
	for (const file of files) {
		const stat = await fs.stat(path.join(dir, file));
		if (stat.isDirectory()) {
			const isLanguage = file.includes("-");
			if (isLanguage) languages.push(file);

			const folder = await walkDirectory(path.join(dir, file), namespaces, isLanguage ? "" : `${file}/`);

			namespaces = folder.namespaces;
		} else {
			namespaces.push(`${folderName}${file.substr(0, file.length - 5)}`);
		};
	};

	return {
		namespaces: [...new Set(namespaces)],
		languages
	};
};

module.exports = async () => {
	const options = {
		jsonIndent: 2,
		loadPath: path.resolve(__dirname, "../languages/{{lng}}/{{ns}}.json")
	};

	const { namespaces, languages } = await walkDirectory(path.resolve(__dirname, "../languages/"));

	i18next.use(Backend);

	await i18next.init({
		backend: options,
		debug: false,
		fallbackLng: "en-US",
		initImmediate: false,
		interpolation: { escapeValue: false },
		load: "all",
		ns: namespaces,
		preload: languages
	});

	return new Map(languages.map(item => [item, i18next.getFixedT(item)]));
};