import 'dotenv/config';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ValidationPipe } from '@nestjs/common';
import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';
import {
  FastifyAdapter,
  NestFastifyApplication,
} from '@nestjs/platform-fastify';
import { WINSTON_MODULE_NEST_PROVIDER } from 'nest-winston';
import multipart from '@fastify/multipart';

async function bootstrap() {
  const app = await NestFactory.create<NestFastifyApplication>(
    AppModule,
    new FastifyAdapter({ logger: false }),
    { bufferLogs: true },
  );

  // 注册 multipart 支持（类型兼容：cast any 规避 fastify 多版本类型冲突）
  await (app as any).register(multipart as any, {
    limits: {
      fieldNameSize: 100,
      fieldSize: 1024 * 1024, // 1MB
      fields: 10,
      fileSize: 1024 * 1024 * 50, // 50MB 单文件
      files: 10,
      headerPairs: 2000,
    },
  });

  app.useGlobalPipes(
    new ValidationPipe({
      whitelist: true,
      forbidNonWhitelisted: true,
      transform: true,
    }),
  );

  app.enableCors();

  app.useLogger(app.get(WINSTON_MODULE_NEST_PROVIDER));

  // 前台API文档配置
  const frontendConfig = new DocumentBuilder()
    .setTitle('WWJCloud 前台API')
    .setDescription('WWJCloud 前台用户访问的API接口文档')
    .setVersion('1.0.0')
    .addBearerAuth()
    .addTag('前台-会员管理', '前台会员相关接口')
    .addTag('前台-站点管理', '前台站点相关接口')
    .addTag('前台-菜单管理', '前台菜单相关接口')
    .addTag('前台-角色管理', '前台角色相关接口')
    .build();
  
  const frontendDocument = SwaggerModule.createDocument(app, frontendConfig, {
    include: [], // 这里需要根据实际模块动态配置
    deepScanRoutes: true,
  });
  
  SwaggerModule.setup('api/frontend', app, frontendDocument);

  // 后台管理API文档配置
  const adminConfig = new DocumentBuilder()
    .setTitle('WWJCloud 后台管理API')
    .setDescription('WWJCloud 后台管理员访问的API接口文档')
    .setVersion('1.0.0')
    .addBearerAuth()
    .addTag('后台-会员管理', '后台会员管理接口')
    .addTag('后台-站点管理', '后台站点管理接口')
    .addTag('后台-菜单管理', '后台菜单管理接口')
    .addTag('后台-角色管理', '后台角色管理接口')
    .build();
  
  const adminDocument = SwaggerModule.createDocument(app, adminConfig, {
    include: [], // 这里需要根据实际模块动态配置
    deepScanRoutes: true,
  });
  
  SwaggerModule.setup('api/admin', app, adminDocument);

  // 统一API文档（包含所有接口）
  const unifiedConfig = new DocumentBuilder()
    .setTitle('WWJCloud API')
    .setDescription('WWJCloud 基于 NestJS 的企业级后端 API 文档')
    .setVersion('1.0.0')
    .addBearerAuth()
    .build();
  
  const unifiedDocument = SwaggerModule.createDocument(app, unifiedConfig);
  SwaggerModule.setup('api', app, unifiedDocument);

  const port =
    Number(process.env.PORT) ||
    (process.env.NODE_ENV === 'development' ? 3001 : 3000);
  await app.listen({ port, host: '0.0.0.0' });
}
bootstrap();
