import {
  Logger,
  MiddlewareConsumer,
  Module,
  NestModule,
  OnModuleInit,
} from '@nestjs/common';
import { CommonModule } from './common/common.module';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ConfigModule } from '@nestjs/config';
import { JwtModule } from '@nestjs/jwt';
import { AuthGuard } from './guards/auth.guard';
import { AuthModule } from './modules/auth/auth.module';
import { UserModule } from './modules/user/user.module';
import { AppController } from './app.controller';
import { CacheModule } from '@nestjs/cache-manager';
import { RolesGuard } from './guards/role.guard';
import { ThrottlerProxyGuard } from './guards/throttler.guard';
import { APP_GUARD } from '@nestjs/core';
import { ThrottlerModule } from '@nestjs/throttler';
import { ScheduleModule } from '@nestjs/schedule';
import { TicketsModule } from './modules/tickets/tickets.module';
import { OssModule } from './modules/oss/oss.module';
import { OrderModule } from './modules/order/order.module';
import { SettlementModule } from './modules/settlement/settlement.module';
import { ShortUrlModule } from './modules/short-url/short-url.module';
import { AppSchedule } from './schedules/app-schedule';
import { CorsMiddleware } from './middlewares/cors.middleware';
import { CorsController } from './cors.controller';
import { AiModule } from './modules/ai/ai.module';
import { EmailModule } from './modules/email/email.module';

@Module({
  imports: [
    // 这个一定要放在最前面,读取环境配置
    ConfigModule.forRoot({
      envFilePath: 'environment.properties',
    }),
    ScheduleModule.forRoot(),
    JwtModule.register({
      global: true,
      secret: process.env.JWT_SECRET,
      signOptions: { expiresIn: '7d' },
    }),
    TypeOrmModule.forRoot(
      process.env.ENV == 'dev'
        ? {
            type: 'mysql',
            host: process.env.DATABASE_HOST,
            port: 3306,
            username: process.env.DATABASE_USER,
            password: process.env.DATABASE_PASSWORD,
            database: 'wecanplugin',
            synchronize: true,
            autoLoadEntities: true,
            logging: true,
            logger: 'file',
            entityPrefix: 'wecan_',
            dateStrings: true,
          }
        : {
            type: 'mariadb',
            host: process.env.DATABASE_HOST,
            port: 3306,
            username: process.env.DATABASE_USER,
            password: process.env.DATABASE_PASSWORD,
            database: 'wecanplugin',
            synchronize: true,
            autoLoadEntities: true,
            entityPrefix: 'wecan_',
            dateStrings: true,
          },
    ),
    CacheModule.register({
      isGlobal: true,
    }),
    // 60秒内最多10个请求
    ThrottlerModule.forRoot({
      ttl: 60,
      limit: 10,
    }),
    CommonModule,
    AuthModule,
    UserModule,
    TicketsModule,
    OssModule,
    OrderModule,
    SettlementModule,
    ShortUrlModule,
    AiModule,
    EmailModule,
  ],
  controllers: [AppController, CorsController],
  providers: [
    {
      provide: APP_GUARD,
      useClass: AuthGuard,
    },
    {
      provide: APP_GUARD,
      useClass: RolesGuard,
    },
    {
      provide: APP_GUARD,
      useClass: ThrottlerProxyGuard,
    },
    AppSchedule,
  ],
})
export class AppModule implements NestModule, OnModuleInit {
  constructor() {}
  configure(consumer: MiddlewareConsumer) {
    // 配置中间件
    Logger.log('注册跨域中间件');
    consumer.apply(CorsMiddleware).forRoutes('/c/*');
  }

  async onModuleInit() {
    Logger.log('初始化数据仓库');
  }
}
