#!/usr/bin/env node
var os = require('os');
var path = require('path');
var dotenv = require("dotenv");
var fs = require('fs');
var request = require("request");

var utils = require("../app/utils.js");
var coins = require("../app/coins.js");

async function refreshMiningPoolsForCoin(coinName) {
	return new Promise(function(resolve, reject) {
		console.log(`Refreshing mining pools for ${coinName}...`);
		
		if (coins[coinName].miningPoolsConfigUrls) {
			var miningPoolsConfigDir = path.join(__dirname, "..", "public", "txt", "mining-pools-configs", coinName);
			fs.readdir(miningPoolsConfigDir, function(err, files) {
				if (err) {
					reject(`Unable to delete existing files from '${miningPoolsConfigDir}'`);

					return;
				}

				files.forEach(function(file) {
					// delete existing file
					fs.unlinkSync(path.join(miningPoolsConfigDir, file));
				});
			});

			var miningPoolsConfigUrls = coins[coinName].miningPoolsConfigUrls;

			var promises = [];

			console.log(`${miningPoolsConfigUrls.length} mining pool config(s) found for ${coinName}`);

			for (var i = 0; i < miningPoolsConfigUrls.length; i++) {
				promises.push(refreshMiningPoolConfig(coinName, i, miningPoolsConfigUrls[i]));
			}

			Promise.all(promises).then(function() {
				console.log(`Refreshed ${miningPoolsConfigUrls.length} mining pool config(s) for ${coinName}\n---------------------------------------------`);

				resolve();

			}).catch(function(err) {
				reject(err);
			});
		} else {
			console.log(`No mining pool URLs configured for ${coinName}`);

			reject(`No mining pool URLs configured for ${coinName}`);
		}
	});
}

async function refreshMiningPoolConfig(coinName, index, url) {
	return new Promise(function(resolve, reject) {
		request(url, function(error, response, body) {
			if (!error && response && response.statusCode && response.statusCode == 200) {
				var responseBody = JSON.parse(body);

				var filename = path.join(__dirname, "..", "public", "txt", "mining-pools-configs", coinName, index + ".json");

				fs.writeFileSync(filename, body, function(err) {
					console.log(`Error writing file '${filename}': ${err}`);
				});

				console.log(`Wrote '${coinName}/${index}.json' with contents of url: ${url}`);

				resolve();
				
			} else {
				console.log(`Error downloading mining pool config for ${coinName}: url=${url}`);

				reject(error);
			}
		});
	});
}

async function refreshAllMiningPoolConfigs() {
	var outerPromises = [];

	for (var i = 0; i < coins.coins.length; i++) {
		var coinName = coins.coins[i];

		await refreshMiningPoolsForCoin(coinName);
	}
}

refreshAllMiningPoolConfigs();