'use strict';

const fs = require('fs').promises;
const crypto = require('crypto');
const { argv } = require('yargs');
// const bhttp = require('bhttp');

const countries = require('./countries.json');
const states = require('./states-us.json');

const data = {
	countries,
	states,
	flags: countries,
};

/*
async function fetchCountries() {
	const res = await bhttp.get('http://localhost:3000/api/countries');

	if (res.statusCode === 200) {
		await fs.writeFile('./assets/countries.json', JSON.stringify(res.body, null, 4));
		console.log('Done fetching countries!');

		return;
	}

	console.log(`Failed to fetch countries: ${res.statusCode}`);
}
*/

async function init() {
	const type = argv.type || 'countries';

	const countryImgs = await fs.readdir(`./assets/${type}`);
	const countriesByCode = Object.fromEntries(data[type].map((country) => [country.alpha2, country]));

	const imgCountries = await Promise.all(countryImgs.filter((file) => !['encoded', 'disabled'].includes(file)).map(async (file) => {
		const code = file.match(/(\w+).png/)?.[1];

		if (!code || !countriesByCode[code]) {
			console.warn(`No country for ${file} with code ${code}`);
			return null;
		}

		const filename = `${crypto.createHash('md5').update(code).digest('hex').slice(0, 4)}.png`;

		await fs.copyFile(`./assets/${type}/${file}`, `./assets/${type}/encoded/${filename}`);

		return {
			file: filename,
			code,
			...countriesByCode[code],
		};
	}));

	await fs.writeFile(`./assets/${type}-curated.json`, JSON.stringify(imgCountries.filter(Boolean), null, 4));

	console.log('Done!');
}

init();
// fetchCountries();