import os from "os"
import path from "path"
import { $ } from "bun"
import chalk from "chalk"
import fs from "fs-extra"
import getFolderSize from "get-folder-size"
import { getRootDir } from "./src/constants"
import { cleanExtension, patchManifestJsonSchema, patchPkgJsonDep } from "./src/patch"
import { tarCompress } from "./src/utils"

await $`rm -rf dist`
await $`bun build index.ts --outfile=dist/index.mjs --target node`.env({
	NODE_ENV: "production"
})
// await $`pnpm rolldown -c`

/* -------------------------------------------------------------------------- */
/*                                 Post Build                                 */
/* -------------------------------------------------------------------------- */

const distPath = path.join(getRootDir(), "dist")
const distTemplatesPath = path.join(distPath, "templates")
const tmpDistTemplatesPath = path.join(distPath, "tmp-templates")
// clear distTemplatesPath
fs.emptyDirSync(distTemplatesPath)
fs.emptyDirSync(tmpDistTemplatesPath)

/* -------------------------------------------------------------------------- */
/*                   copy ../../templates to dist/templates                   */
/* -------------------------------------------------------------------------- */
console.log(getRootDir())

const templatesPath = path.join(getRootDir(), "../..", "packages/templates")
console.log(`Copy from ${templatesPath} to ${tmpDistTemplatesPath}`)
fs.copySync(templatesPath, tmpDistTemplatesPath, { dereference: os.platform() === "win32" })

/* -------------------------------------------------------------------------- */
/*                              Clean Dist Folder                             */
/* -------------------------------------------------------------------------- */
for (const p of fs.readdirSync(tmpDistTemplatesPath)) {
	console.log("Clean Extension", path.join(tmpDistTemplatesPath, p))
	cleanExtension(path.join(tmpDistTemplatesPath, p))
}

/* -------------------------------------------------------------------------- */
/*                               Patch Templates                              */
/* -------------------------------------------------------------------------- */
for (const p of fs.readdirSync(tmpDistTemplatesPath)) {
	const pkgJsonPath = path.join(tmpDistTemplatesPath, p, "package.json")
	if (fs.existsSync(pkgJsonPath)) {
		/* ----------------------- Patch Package Dependencies ----------------------- */
		// Replace local dependencies (workspace:*) with real dependencies
		await patchPkgJsonDep(pkgJsonPath)
		/* ----------------------- Patch Manifest JSON Schema ----------------------- */
		// Replace local template with remote schema
		patchManifestJsonSchema(pkgJsonPath)
		// remove node_modules
		const nodeModulesPath = path.join(distPath, "templates", p, "node_modules")
		if (fs.existsSync(nodeModulesPath)) {
			fs.rmdirSync(nodeModulesPath, { recursive: true })
		}
	}
}

/* -------------------------------------------------------------------------- */
/*                                Zip Templates                               */
/* -------------------------------------------------------------------------- */
for (const p of fs.readdirSync(tmpDistTemplatesPath)) {
	const src = path.join(tmpDistTemplatesPath, p)
	// skip if src is not a directory
	if (!fs.statSync(src).isDirectory()) {
		continue
	}
	const dest = path.join(distTemplatesPath, `${p}.tgz`)
	console.log(`${chalk.green("Zipping")} ${chalk.blue(src)} to ${chalk.blue(dest)}`)
	await tarCompress(src, dest)
}

fs.rmSync(tmpDistTemplatesPath, { recursive: true })

// get total folder size of distTemplatesPath
const size = await getFolderSize.loose(distTemplatesPath)
console.log(`dist size ${(size / 1000 / 1000).toFixed(2)} MB`)