//@ts-check

import esbuild from "esbuild";
import process from "process";
import builtins from "builtin-modules";
import sveltePlugin from "esbuild-svelte";
import sveltePreprocess from "svelte-preprocess";
import fs from "node:fs";
// import terser from "terser";
import { minify } from "terser";
const banner = `/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD AND TERSER
if you want to view the source, please visit the github repository of this plugin
*/
`;


const prod = process.argv[2] === "production";

const terserOpt = {
    sourceMap: (!prod ? {
        url: "inline"
    } : {}),
    format: {
        indent_level: 2,
        beautify: true,
        comments: "some",
        ecma: 2018,
        preamble: banner,
        webkit: true
    },
    parse: {
        // parse options
    },
    compress: {
        // compress options
        defaults: false,
        evaluate: true,
        inline: 3,
        join_vars: true,
        loops: true,
        passes: prod ? 4 : 1,
        reduce_vars: true,
        reduce_funcs: true,
        arrows: true,
        collapse_vars: true,
        comparisons: true,
        lhs_constants: true,
        hoist_props: true,
        side_effects: true,
        if_return: true,
        ecma: 2018,
        unused: true,
    },
    // mangle: {
    //     // mangle options
    //     keep_classnames: true,
    //     keep_fnames: true,

    //     properties: {
    //         // mangle property options

    //     }
    // },

    ecma: 2018, // specify one of: 5, 2015, 2016, etc.
    enclose: false, // or specify true, or "args:values"
    keep_classnames: true,
    keep_fnames: true,
    ie8: false,
    module: false,
    // nameCache: null, // or specify a name cache object
    safari10: false,
    toplevel: false
}


const manifestJson = JSON.parse(fs.readFileSync("./manifest.json") + "");
const packageJson = JSON.parse(fs.readFileSync("./package.json") + "");
const updateInfo = JSON.stringify(fs.readFileSync("./updates.md") + "");

/** @type esbuild.Plugin[] */
const plugins = [{
    name: 'my-plugin',
    setup(build) {
        let count = 0;
        build.onEnd(async result => {
            if (count++ === 0) {
                console.log('first build:', result);

            } else {
                console.log('subsequent build:');
            }
            if (prod) {
                console.log("Performing terser");
                const src = fs.readFileSync("./main_org.js").toString();
                // @ts-ignore
                const ret = await minify(src, terserOpt);
                if (ret && ret.code) {
                    fs.writeFileSync("./main.js", ret.code);
                }
                console.log("Finished terser");
            } else {
                fs.copyFileSync("./main_org.js", "./main.js");
            }
        });
    },
}];

const context = await esbuild.context({
    banner: {
        js: banner,
    },
    entryPoints: ["src/main.ts"],
    bundle: true,
    define: {
        "MANIFEST_VERSION": `"${manifestJson.version}"`,
        "PACKAGE_VERSION": `"${packageJson.version}"`,
        "UPDATE_INFO": `${updateInfo}`,
        "global": "window",
    },
    external: [
        "obsidian",
        "electron",
        "crypto",
        "@codemirror/autocomplete",
        "@codemirror/collab",
        "@codemirror/commands",
        "@codemirror/language",
        "@codemirror/lint",
        "@codemirror/search",
        "@codemirror/state",
        "@codemirror/view",
        "@lezer/common",
        "@lezer/highlight",
        "@lezer/lr"],
    // minifyWhitespace: true,
    format: "cjs",
    target: "es2018",
    logLevel: "info",
    platform: "browser",
    sourcemap: prod ? false : "inline",
    treeShaking: true,
    outfile: "main_org.js",
    minifyWhitespace: false,
    minifySyntax: false,
    minifyIdentifiers: false,
    minify: false,

    // keepNames: true,
    plugins: [
        sveltePlugin({
            preprocess: sveltePreprocess(),
            compilerOptions: { css: true, preserveComments: true },
        }),
        ...plugins
    ],
})

if (prod) {
    await context.rebuild();
    process.exit(0);
} else {
    await context.watch();
}
