import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
import { APP_INTERCEPTOR } from '@nestjs/core';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { LoggerModule } from './core/utils/logger/logger.module';
import { UsersModule } from './core/db/users/users.module';
import { ZulipAccountsModule } from './core/db/zulip_accounts/zulip_accounts.module';
import { LoginCoreModule } from './core/login_core/login_core.module';
import { AuthGatewayModule } from './gateway/auth/auth.gateway.module';
import { ChatGatewayModule } from './gateway/chat/chat.gateway.module';
import { ZulipGatewayModule } from './gateway/zulip/zulip.gateway.module';
import { ZulipModule } from './business/zulip/zulip.module';
import { RedisModule } from './core/redis/redis.module';
import { AdminModule } from './business/admin/admin.module';
import { UserMgmtModule } from './business/user_mgmt/user_mgmt.module';
import { SecurityCoreModule } from './core/security_core/security_core.module';
import { LocationBroadcastModule } from './business/location_broadcast/location_broadcast.module';
import { NoticeModule } from './business/notice/notice.module';
import { MaintenanceMiddleware } from './core/security_core/maintenance.middleware';
import { ContentTypeMiddleware } from './core/security_core/content_type.middleware';

/**
 * 检查数据库配置是否完整 by angjustinl 2025-12-17
 * 
 * @returns 是否配置了数据库
 */
function isDatabaseConfigured(): boolean {
  const requiredEnvVars = ['DB_HOST', 'DB_PORT', 'DB_USERNAME', 'DB_PASSWORD', 'DB_NAME'];
  return requiredEnvVars.every(varName => process.env[varName]);
}

/**
 * 应用主模块
 * 
 * 功能描述：
 * - 整合所有功能模块
 * - 配置全局服务和中间件
 * - 支持数据库和内存存储的自动切换
 * 
 * 存储模式选择：
 * - 如果配置了数据库环境变量，使用数据库模式
 * - 如果未配置数据库，自动回退到内存模式
 * - 内存模式适用于快速开发和测试
 */
@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
      envFilePath: '.env',
    }),
    LoggerModule,
    RedisModule,
    // 条件导入TypeORM模块
    ...(isDatabaseConfigured() ? [
      TypeOrmModule.forRoot({
        type: 'mysql',
        host: process.env.DB_HOST,
        port: parseInt(process.env.DB_PORT),
        username: process.env.DB_USERNAME,
        password: process.env.DB_PASSWORD,
        database: process.env.DB_NAME,
        entities: [__dirname + '/**/*.entity{.ts,.js}'],
        synchronize: false,
        // 字符集配置 - 支持中文和emoji
        charset: 'utf8mb4',
        // 添加连接超时和重试配置
        connectTimeout: 10000,
        retryAttempts: 3,
        retryDelay: 3000,
      }),
    ] : []),
    // 根据数据库配置选择用户模块模式
    isDatabaseConfigured() ? UsersModule.forDatabase() : UsersModule.forMemory(),
    // Zulip账号关联模块 - 全局单例，其他模块无需重复导入
    ZulipAccountsModule.forRoot(),
    LoginCoreModule,
    AuthGatewayModule,  // 认证网关模块
    ChatGatewayModule,  // 聊天网关模块
    ZulipGatewayModule, // Zulip网关模块（HTTP API接口）
    ZulipModule,        // Zulip业务模块（业务逻辑）
    UserMgmtModule,
    AdminModule,
    SecurityCoreModule,
    LocationBroadcastModule,
    NoticeModule,
  ],
  controllers: [AppController],
  providers: [
    AppService,
    // 注意：全局拦截器现在由SecurityModule提供
  ],
})
export class AppModule implements NestModule {
  /**
   * 配置中间件
   * 
   * @param consumer 中间件消费者
   */
  configure(consumer: MiddlewareConsumer) {
    // 1. 维护模式中间件 - 最高优先级
    consumer
      .apply(MaintenanceMiddleware)
      .forRoutes('*');

    // 2. 内容类型检查中间件
    consumer
      .apply(ContentTypeMiddleware)
      .forRoutes('*');
  }
}
