import AdmZip = require('adm-zip');
import { existsSync, readdirSync, renameSync, rmdirSync, unlinkSync, writeFileSync } from 'fs';
import fetch from 'node-fetch';
import { resolve } from 'path';

const dir = resolve(__dirname, '..');
console.log("Downloading and installing Waifu2X");
( async () => {
    let zipURL = "";
    // REMOVE EXISTING 2X
    if (existsSync(dir + "/waifu2x")) rmdirSync(dir + "/waifu2x", {recursive: true});

    // URL PLATFORM
    if (process.platform == "win32") zipURL = "https://github.com/nihui/waifu2x-ncnn-vulkan/releases/download/20210521/waifu2x-ncnn-vulkan-20210521-windows.zip";
    else if (process.platform == "linux") zipURL = "https://github.com/nihui/waifu2x-ncnn-vulkan/releases/download/20210521/waifu2x-ncnn-vulkan-20210521-ubuntu.zip";
    else throw new Error("This lib not support " + process.platform);

    // DOWNLOAD 2X
    const zipRes = await fetch(zipURL);
    const zip = await zipRes.buffer();

    // INSTALL 2X
    writeFileSync(dir + "/zip.zip", zip);

    let aZIP = new AdmZip(dir + "/zip.zip");
    aZIP.extractAllTo(dir, true);

    unlinkSync(dir + "/zip.zip");

    // RENAME FOLDER
    let fname = readdirSync(dir).find(p => p.includes("waifu2x-ncnn"));
    renameSync(dir + "/" + fname, dir + "/waifu2x")

    // INSTALL MISSING DLL
    if (process.platform == "win32") {
        const dllRes = await fetch("https://www.dll4free.com/download.php?dll=vulkan-1.dll&m=ac97f59aaf23e9f6baf6d29d6241adf3&action=download")
        const dllZIP = await dllRes.buffer();
        writeFileSync(dir + "/waifu2x/vulkan-1.zip", dllZIP);
        let dZIP = new AdmZip(dir + "/waifu2x/vulkan-1.zip");
        dZIP.extractAllTo(dir + "/waifu2x", true);
        unlinkSync(dir + "/waifu2x/vulkan-1.zip");
    }
})()