import './config/env';
import { NestFactory } from '@nestjs/core';
import { FastifyAdapter, type NestFastifyApplication } from '@nestjs/platform-fastify';
import { ValidationPipe } from '@nestjs/common';
import { ip } from 'address';
import { execSync } from 'child_process';
import { AppModule } from './app.module';
import { CatchExceptionFilter } from './common/filters/catch.exception.filter';
import { LoggerService } from './plugins/logger/logger.service';
import { useSwaggerConfig } from './config/swagger.config';

// 跨平台 UTF-8 编码支持（解决 Windows 中文乱码）
if (process.platform === 'win32') {
  // 设置 Node.js 使用 UTF-8 编码
  process.env.NODE_SKIP_UTF8_CHECK = 'true';

  try {
    // 尝试将 Windows 控制台设置为 UTF-8
    execSync('chcp 65001 > nul 2>&1', { stdio: 'ignore' });
  } catch {
    // 忽略错误，继续运行
  }
}

/** 入口 */
async function bootstrap() {
  /** 得到id */
  const ipv4 = ip() || '127.0.0.1';

  /** 端口 */
  const port = parseInt(process.env.PORT || '4001', 10);
  const pinoLogger = new LoggerService();
  const fastifyAdapter = new FastifyAdapter({ loggerInstance: pinoLogger.logger });
  const app: NestFastifyApplication = await NestFactory.create<NestFastifyApplication>(AppModule, fastifyAdapter, { bufferLogs: true });

  // 启用 CORS
  app.enableCors({
    origin: true, // 允许所有来源（生产环境应该指定具体域名）
    methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS', 'PATCH'],
    allowedHeaders: ['*'],
    credentials: true,
  });
  // 启用全局异常过滤器
  app.useGlobalFilters(new CatchExceptionFilter(pinoLogger));
  // 自动验证传入的请求数据
  app.useGlobalPipes(
    new ValidationPipe({
      transform: true, // 是否自动将请求数据转换为 DTO 类的实例。
      whitelist: true, // 是否自动去除 DTO 类中未定义的属性。
      forbidNonWhitelisted: true, // 是否禁止请求数据中包含 DTO 类中未定义的属性
      errorHttpStatusCode: 422, // 自定义 HTTP 错误码
      stopAtFirstError: true, // 当设置为 true 时，给定属性的验证将在遇到第一个错误后停止。默认为 false。
      enableDebugMessages: false, // 是否自动将请求数据转换为 DTO 类的实例。
    })
  );

  /** 自定义Logger（复用已有实例） */
  app.useLogger(pinoLogger);

  /** 注册 Swagger */
  useSwaggerConfig(app, ipv4, port);

  try {
    await app.listen(port, '0.0.0.0');
    console.log('\x1b[32;1m%s\x1b[0m \x1b[34;4m%s\x1b[0m', 'AIP接口地址: ', `http://${ipv4}:${port}`);
    console.log('\x1b[36;1m%s\x1b[0m \x1b[34;4m%s\x1b[0m', 'AIP接口文档 UI 地址: ', `http://${ipv4}:${port}/api-docs`);
    console.log('\x1b[36;1m%s\x1b[0m \x1b[34;4m%s\x1b[0m', 'AIP接口文档JSON地址: ', `http://${ipv4}:${port}/api-docs/swagger.json`, '注意会过滤全局header');
  } catch (error) {
    pinoLogger.error(error, 'bootstrap');
  }
}
if (import.meta.env.PROD) {
  bootstrap();
}

// Vite 热重载需要导出 viteNodeApp
export const viteNodeApp = bootstrap();
