#! /usr/bin/env node
// @ts-check

const fs = require("fs");
const path = require("path");
const { spawn } = require("child_process");
const handleEnvVars = require("./utils/env");

const confFileProvidedPath = process.argv[process.argv.length - 1];

if (confFileProvidedPath === "--version" || confFileProvidedPath === "-v") {
    try {
        const packageJson = fs.readFileSync(
            path.resolve(__dirname, "package.json"),
            "utf8"
        );
        console.log(`Turbo Sync Version: ${JSON.parse(packageJson).version}`);
    } catch (error) {
        console.log(
            "Turbo Sync Version fetch failed! \nNo Worries, Turbo Sync is still installed properly"
        );
    }

    process.exit(6);
}

console.log("Running Folder Sync ...");

const defaultConfigFilePath = path.resolve(
    process.cwd(),
    "turbosync.config.json"
);

const confFileComputedPath =
    typeof confFileProvidedPath == "string" &&
    confFileProvidedPath.endsWith(".json")
        ? path.resolve(process.cwd(), confFileProvidedPath)
        : null;

if (!fs.existsSync(defaultConfigFilePath) && !confFileComputedPath) {
    console.log(
        "Please Provide the path to a config file or add a config file named `turbosync.config.json` to the path you're running this program"
    );

    process.exit();
}

if (
    !defaultConfigFilePath &&
    confFileComputedPath &&
    !fs.existsSync(confFileComputedPath)
) {
    console.log("Config File does not exist");
    process.exit();
}

try {
    const configFinalPath = fs.existsSync(defaultConfigFilePath)
        ? defaultConfigFilePath
        : confFileComputedPath && fs.existsSync(confFileComputedPath)
        ? confFileComputedPath
        : null;

    const configJSON = configFinalPath
        ? fs.readFileSync(configFinalPath, "utf8")
        : null;

    if (!configJSON)
        throw new Error(
            "Config JSON could not be resolved. Please check your files."
        );

    const parsedConfigJSON = handleEnvVars({ json: configJSON });

    /** @type {import(".").TurboSyncConfigArray} */
    const configArray = JSON.parse(parsedConfigJSON);

    for (let i = 0; i < configArray.length; i++) {
        const config = configArray[i];
        console.log(`Syncing \`${config.title} ...\``);

        const childProcess = spawn(
            "node",
            [
                path.resolve(__dirname, "./lib/sync.js"),
                `${JSON.stringify(config)}`,
            ],
            {
                stdio: "inherit",
                detached: false,
            }
        );
    }
} catch (error) {
    console.log(`Process Error =>`, error.message);
    process.exit();
}

setInterval(() => {
    console.log(
        `Turbo Sync Running for ${process.uptime().toLocaleString()}s ...`
    );
}, 60000);
