import { XwebConfig } from "../config/config.js";
import { error, info, status } from "../log.js";

import fs from "fs";
import path from "path";
import { Worker } from "worker_threads";

function swap_extension(file_name: string, from_extension: string, to_extension: string): string {
    return file_name.slice(0, -from_extension.length) + to_extension;
}

function create_file(file_path: string, file_content: string) {
    const DIRECTORY_PATH = path.dirname(file_path);

    if (!fs.existsSync(DIRECTORY_PATH)) {
        status("run/convert", `Created required folder called '${DIRECTORY_PATH}'`);
        fs.mkdirSync(DIRECTORY_PATH, { recursive: true });
    }

    fs.writeFileSync(file_path, file_content);
}

export function convert(files: string[], CONFIG: XwebConfig) {
    let file_counter = 0;
    files.forEach(file_name => {
        file_counter++;
        info("run/convert", `Starting conversion of file ${file_counter}/${files.length} "${file_name}"`);

        const FILE_CONTENT = fs.readFileSync(path.join(process.cwd(), CONFIG.folder.src, file_name), "utf8");
        // Read CONFIG.folder.tags and import all CONFIG.tags
        const TAG_DATA: string[] = [];
        for (const TAG of CONFIG.tags) {
            const FILE_PATH = path.join(process.cwd(), CONFIG.folder.tags, TAG + ".js");
            if (!fs.existsSync(FILE_PATH)) {
                error("run/convert", `Cannot read tagset ${TAG} despite it being in the config file, because it doesn't exist in the tagsets folder. Run 'xweb add ${TAG}' to attempt to fetch it from github`);
                return;
            }
            TAG_DATA.push(fs.readFileSync(FILE_PATH, "utf8"));
        }

        // Send data to worker
        const WORKER = new Worker("./bin/convert/worker.js", {
            workerData: {
                content: FILE_CONTENT,
                tags: TAG_DATA,
                CONFIG
            }
        });

        WORKER.on("message", data => {
            status("run/convert", `Finished conversion of file ${file_counter}/${files.length} "${file_name}"`);
            const NEW_FILE_NAME = swap_extension(file_name, CONFIG.extension.src, CONFIG.extension.out);
            const OUTPUT_FILE_PATH = path.join(process.cwd(), CONFIG.folder.out, NEW_FILE_NAME);
            create_file(OUTPUT_FILE_PATH, data);
            status("run/convert", `Created output file ${NEW_FILE_NAME}`);
        });
        WORKER.on("error", err => {
            error("run/convert", `File '${file_name}' failed to convert, because '${err}'`);
        });
    });
}