import { mkdirSync, writeFileSync } from "node:fs";
import { dirname, resolve } from "node:path";
import { ValidationPipe } from "@nestjs/common";
import { NestFactory } from "@nestjs/core";
import { SwaggerModule } from "@nestjs/swagger";
import { AppModule } from "../src/app.module";
import { buildSwaggerConfig } from "../src/swagger.config";

const OUTPUT = resolve(__dirname, "../docs/openapi/openapi.json");

async function main() {
  process.env.NODE_ENV = process.env.NODE_ENV ?? "test";
  const app = await NestFactory.create(AppModule, { logger: false });
  app.setGlobalPrefix("v1", { exclude: ["health", "/", "docs", "docs-json"] });
  app.useGlobalPipes(
    new ValidationPipe({ transform: true, whitelist: true, forbidNonWhitelisted: true }),
  );

  const config = buildSwaggerConfig({ serverUrl: "https://api.novasis.io" });
  const document = SwaggerModule.createDocument(app, config);

  mkdirSync(dirname(OUTPUT), { recursive: true });
  writeFileSync(OUTPUT, JSON.stringify(document, null, 2) + "\n", "utf8");

  await app.close();
  // eslint-disable-next-line no-console
  console.log(`OpenAPI snapshot written to ${OUTPUT}`);
}

void main().catch((err) => {
  // eslint-disable-next-line no-console
  console.error(err);
  process.exit(1);
});
