import { NestFactory } from '@nestjs/core';
import { ValidationPipe, VersioningType } from '@nestjs/common';
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
import { ConfigService } from '@nestjs/config';
import helmet from 'helmet';
import * as compression from 'compression';
import { AppModule } from './app.module';
import { GlobalExceptionFilter } from './common/filters/global-exception.filter';
import { RequestIdInterceptor } from './common/interceptors/request-id.interceptor';
import { LoggingInterceptor } from './common/interceptors/logging.interceptor';

async function bootstrap() {
  const app = await NestFactory.create(AppModule, {
    logger: ['error', 'warn', 'log', 'debug'],
  });

  const config = app.get(ConfigService);
  const port = config.get<number>('PORT', 3000);
  const nodeEnv = config.get<string>('NODE_ENV', 'development');

  // Segurança
  app.use(helmet());
  app.use(compression());

  // CORS
  const corsOrigins = config.get<string>('CORS_ORIGINS', 'http://localhost:3001');
  app.enableCors({
    origin: corsOrigins.split(',').map(o => o.trim()),
    credentials: true,
    methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'],
  });

  // Versionamento
  app.enableVersioning({ type: VersioningType.URI, defaultVersion: '1' });

  // Prefixo global
  app.setGlobalPrefix('api');

  // Pipes globais
  app.useGlobalPipes(
    new ValidationPipe({
      whitelist: true,
      forbidNonWhitelisted: true,
      transform: true,
      transformOptions: { enableImplicitConversion: true },
    }),
  );

  // Filtros e interceptors globais
  app.useGlobalFilters(new GlobalExceptionFilter());
  app.useGlobalInterceptors(
    new RequestIdInterceptor(),
    new LoggingInterceptor(),
  );

  // Swagger (apenas em desenvolvimento)
  if (nodeEnv !== 'production') {
    const swaggerConfig = new DocumentBuilder()
      .setTitle('ELO API')
      .setDescription('ELO — Controle Parental + Educação + Autonomia Digital')
      .setVersion('1.0')
      .addBearerAuth()
      .addTag('auth', 'Autenticação')
      .addTag('families', 'Famílias')
      .addTag('children', 'Crianças')
      .addTag('devices', 'Dispositivos')
      .addTag('policies', 'Políticas de uso')
      .addTag('time-wallet', 'Carteira de tempo')
      .addTag('missions', 'Missões educacionais')
      .addTag('learning', 'Aprendizado')
      .addTag('requests', 'Solicitações de tempo')
      .addTag('notifications', 'Notificações')
      .addTag('admin', 'Administração')
      .addTag('health', 'Health checks')
      .build();

    const document = SwaggerModule.createDocument(app, swaggerConfig);
    SwaggerModule.setup('api/docs', app, document, {
      swaggerOptions: { persistAuthorization: true },
    });
  }

  await app.listen(port);
  console.log(`\n🚀 ELO API rodando em: http://localhost:${port}/api`);
  console.log(`📖 Swagger: http://localhost:${port}/api/docs`);
  console.log(`🏥 Health: http://localhost:${port}/api/v1/health\n`);
}

bootstrap();
