import buildTypes from "./buildTypes";
import buildGlobalHooks from "./buildGlobalHooks";
import provideConfig from "./provideConfig";
import {
  checkNodeVersion,
  removeBuildSuccessFlag,
  storeBuildSuccessFlag,
} from "./utils";
import { initLogger, logError } from "./logger";
import * as path from "node:path";
import * as fs from "node:fs/promises";
import * as fsSync from "node:fs";

export default async () => {
  await initLogger("package");
  const breadcrumbs: string[] = [];

  try {
    const startTime = process.hrtime();
    await checkNodeVersion();
    breadcrumbs.push("checkNodeVersion");
    await removeBuildSuccessFlag();

    const config = await provideConfig();
    config.client.buildDir = path.resolve(config.client.rootDir, "dist");
    await prepare(config);
    await buildTypes(config);
    await buildGlobalHooks(config);

    for (const getPlugin of config.plugins) {
      const plugin = getPlugin();

      breadcrumbs.push(`${plugin.pluginName}: validate`);
      await plugin.validate(config);
      breadcrumbs.push(`${plugin.pluginName}: buildPackage`);
      await plugin.buildPackage(config);
    }

    // Calculating build time in seconds
    config.buildTime = process.hrtime(startTime);
    await storeBuildSuccessFlag();
  } catch (error: any) {
    await logError({ command: "package", breadcrumbs, error });
    console.log(error);
    process.exit(1);
  }
};

const prepare = async (config: any) => {
  if (fsSync.existsSync(config.client.buildDir))
    await fs.rm(config.client.buildDir, { recursive: true });
  await fs.mkdir(config.client.buildDir);
};
