import { NestFactory } from '@nestjs/core';
import { ValidationPipe } from '@nestjs/common';
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
import helmet from 'helmet';
import { json, urlencoded } from 'express';
import { AppModule } from './app.module';

const REQUIRED_ENV = ['JWT_SECRET'];

function validateEnv() {
  const missing = REQUIRED_ENV.filter((k) => !process.env[k]);
  if (missing.length) {
    console.error(`\n[Klavo] ERRO: variáveis de ambiente obrigatórias não definidas: ${missing.join(', ')}`);
    console.error('[Klavo] Defina-as no painel de variáveis do seu serviço de deploy ou no arquivo .env\n');
    process.exit(1);
  }
}

async function bootstrap() {
  validateEnv();
  const app = await NestFactory.create(AppModule);

  app.use(helmet());
  app.enableCors();
  // Logo, certificado A1 e timbre de contrato são enviados como base64 no corpo
  // da requisição — o limite padrão do Express (100kb) é pequeno demais para isso.
  app.use(json({ limit: '20mb' }));
  app.use(urlencoded({ limit: '20mb', extended: true }));

  const prefix = process.env.API_PREFIX || 'api/v1';
  app.setGlobalPrefix(prefix);

  app.useGlobalPipes(new ValidationPipe({
    whitelist: true,
    forbidNonWhitelisted: true,
    transform: true,
  }));

  const config = new DocumentBuilder()
    .setTitle('Klavo API')
    .setDescription('Plataforma de gestão de contratos, cobrança e licenças SaaS')
    .setVersion('1.0')
    .addBearerAuth()
    .addApiKey({ type: 'apiKey', name: 'X-Api-Key', in: 'header' }, 'ApiKey')
    .build();

  const document = SwaggerModule.createDocument(app, config);
  SwaggerModule.setup(`${prefix}/docs`, app, document);

  await app.listen(process.env.PORT || 3000);
  console.log(`\n🚀 Klavo API rodando em http://localhost:${process.env.PORT || 3000}/${prefix}`);
  console.log(`📖 Swagger: http://localhost:${process.env.PORT || 3000}/${prefix}/docs\n`);
}

bootstrap();
