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';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  const configService = app.get(ConfigService);

  // 安全中间件
  app.use(helmet({
    contentSecurityPolicy: {
      directives: {
        defaultSrc: ["'self'"],
        styleSrc: ["'self'", "'unsafe-inline'"],
        scriptSrc: ["'self'"],
        imgSrc: ["'self'", "data:", "https:"],
      },
    },
  }));
  
  // 压缩响应
  app.use(compression());

  // CORS配置
  app.enableCors({
    origin: configService.get('CORS_ORIGIN') || true,
    credentials: true,
  });

  // API版本控制
  app.enableVersioning({
    type: VersioningType.URI,
    defaultVersion: '1',
    prefix: 'api/v',
  });

  // 全局验证管道
  app.useGlobalPipes(new ValidationPipe({
    whitelist: true,
    forbidNonWhitelisted: true,
    transform: true,
    transformOptions: {
      enableImplicitConversion: true,
    },
  }));

  // API前缀
  app.setGlobalPrefix(configService.get('API_PREFIX') || 'api/v1');

  // Swagger文档
  const config = new DocumentBuilder()
    .setTitle('智能期货期权分析系统 API')
    .setDescription('提供行情数据、技术分析、期权定价等功能的RESTful API')
    .setVersion('1.0.0')
    .addBearerAuth()
    .addTag('认证', '用户登录注册')
    .addTag('行情', '期货行情数据')
    .addTag('指标', '技术分析指标')
    .addTag('期权', '期权分析与定价')
    .addTag('AI', '智能分析')
    .addTag('事件', '热点事件')
    .addTag('用户', '用户管理')
    .build();
  
  const document = SwaggerModule.createDocument(app, config);
  SwaggerModule.setup('docs', app, document);

  // 启动服务器
  const port = configService.get('PORT') || 3000;
  await app.listen(port);
  
  console.log(`🚀 服务已启动: http://localhost:${port}`);
  console.log(`📚 API文档: http://localhost:${port}/docs`);
  console.log(`📊 环境: ${configService.get('NODE_ENV')}`);
}

bootstrap();
