import { NestFactory } from "@nestjs/core";
import { SwaggerModule } from "@nestjs/swagger";
import { Logger } from "nestjs-pino";
import { applyAppMiddleware } from "./app.bootstrap";
import { AppModule } from "./app.module";
import { SWAGGER_CUSTOM_CSS, buildSwaggerConfig } from "./swagger.config";

async function bootstrap() {
  const app = await NestFactory.create(AppModule, { bufferLogs: true, rawBody: true });
  app.useLogger(app.get(Logger));
  app.setGlobalPrefix("v1", { exclude: ["health", "/", "docs", "docs-json"] });
  applyAppMiddleware(app);

  const port = Number(process.env.PORT ?? 3000);

  if (process.env.NODE_ENV !== "production") {
    const config = buildSwaggerConfig({ serverUrl: `http://localhost:${port}` });
    const document = SwaggerModule.createDocument(app, config);
    SwaggerModule.setup("docs", app, document, {
      jsonDocumentUrl: "docs-json",
      swaggerOptions: { persistAuthorization: true },
      customCss: SWAGGER_CUSTOM_CSS,
    });
  }

  await app.listen(port);
  // eslint-disable-next-line no-console
  console.log(`Novasis Pay listening on http://localhost:${port}`);
  if (process.env.NODE_ENV !== "production") {
    // eslint-disable-next-line no-console
    console.log(`Swagger UI:  http://localhost:${port}/docs`);
    // eslint-disable-next-line no-console
    console.log(`OpenAPI:     http://localhost:${port}/docs-json`);
  }
}

void bootstrap();
