'use strict';

const fs = require('fs');

const { bin } = require('.');


const copy = (src, dest) => new Promise(
	(res, rej) => fs.copyFile(src, dest, err => (err ? rej(err) : res()))
);


const exists = name => new Promise(
	res => fs.access(
		name,
		fs.constants.F_OK,
		err => res(err ? false : true)
	)
);


const mkdir = async name => {
	if (await exists(name)) {
		return;
	}
	return new Promise(
		(res, rej) => fs.mkdir(name, err => (err ? rej(err) : res()))
	);
};


const rm = async name => {
	if ( ! await exists(name) ) {
		return;
	}
	await new Promise(
		(res, rej) => fs.unlink(name, err => (err ? rej(err) : res()))
	);
};


module.exports = async name => {
	
	const srcDir = process.cwd().replace(/\\/g, '/');
	
	if ( ! await exists(`${srcDir}/build/Release/${name}.node`) ) {
		console.error(`Error. File "${srcDir}/build/Release/${name}.node" not found.`);
	}
	
	const binAbs = `${srcDir}/../${bin}`;
	
	if ( ! await exists(binAbs) ) {
		await mkdir(binAbs);
	}
	
	const destAbs = `${binAbs}/${name}.node`;
	
	if (await exists(destAbs)) {
		await rm(destAbs);
	}
	
	await copy(`${srcDir}/build/Release/${name}.node`, destAbs);
	
	console.log(`The binary "${name}.node" was copied to "${bin}".`);
	
};