const path = require("path");
const esbuild = require("esbuild");
const { nodeExternalsPlugin } = require("esbuild-node-externals");

const basePath = process.cwd();
const args = process.argv.slice(2);
const watch = args.includes("--watch");

esbuild
	.build({
		write: true,
		outfile: path.join(basePath, "server.js"),
		entryPoints: [path.join(basePath, "server.ts")],
		platform: "node",
		format: "cjs",
		bundle: true,
		plugins: [
			nodeExternalsPlugin({ packagePath: path.join(basePath, "package.json") }),
			{
				name: "remix-bundle-external",
				setup(build) {
					build.onResolve({ filter: /^\.\/build$/ }, () => ({ external: true }));
				},
			},
		],
		watch: watch
			? {
					onRebuild(error, buildResult) {
						const warnings = error?.warnings || buildResult?.warnings;
						const errors = error?.errors || buildResult?.errors;
						if (warnings.length) {
							console.log(esbuild.formatMessages(warnings, { kind: "warning" }));
						}
						if (errors.length) {
							console.log(esbuild.formatMessages(errors, { kind: "error" }));

							process.exit(1);
						}

						console.log("Server rebuilt successfully");
					},
			  }
			: false,
	})
	.then(({ errors, warnings }) => {
		if (warnings.length) {
			console.log(esbuild.formatMessages(warnings, { kind: "warning" }));
		}
		if (errors.length) {
			console.log(esbuild.formatMessages(errors, { kind: "error" }));

			process.exit(1);
		}

		console.log("Server build succeeded");
	})
	.catch((err) => {
		console.error(err);
		process.exit(1);
	});
