import { Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ScheduleModule } from '@nestjs/schedule';
import { AuthModule } from './modules/auth/auth.module';
import { TenantsModule } from './modules/tenants/tenants.module';
import { ClientsModule } from './modules/clients/clients.module';
import { ProductsModule } from './modules/products/products.module';
import { ProposalsModule } from './modules/proposals/proposals.module';
import { ContractsModule } from './modules/contracts/contracts.module';
import { PaymentsModule } from './modules/payments/payments.module';
import { FiscalModule } from './modules/fiscal/fiscal.module';
import { SignaturesModule } from './modules/signatures/signatures.module';
import { RbacModule } from './modules/rbac/rbac.module';
import { SaasModule } from './modules/saas/saas.module';
import { AdminModule } from './modules/admin/admin.module';
import { EmailModule } from './modules/email/email.module';

@Module({
  imports: [
    ConfigModule.forRoot({ isGlobal: true }),
    ScheduleModule.forRoot(),

    TypeOrmModule.forRootAsync({
      imports: [ConfigModule],
      inject: [ConfigService],
      useFactory: (config: ConfigService) => {
        const databaseUrl = config.get<string>('DATABASE_URL');
        if (databaseUrl) {
          return {
            type: 'postgres',
            url: databaseUrl,
            ssl: { rejectUnauthorized: false },
            autoLoadEntities: true,
            synchronize: false,
            logging: config.get('NODE_ENV') === 'development',
          };
        }
        return {
          type: 'postgres',
          host:     config.get('DB_HOST', 'localhost'),
          port:     +config.get('DB_PORT', 5432),
          username: config.get('DB_USER', 'klavo'),
          password: config.get('DB_PASS', 'klavo_secret'),
          database: config.get('DB_NAME', 'klavo_db'),
          autoLoadEntities: true,
          synchronize: false,
          logging: config.get('NODE_ENV') === 'development',
        };
      },
    }),

    ScheduleModule.forRoot(),

    // Core
    AuthModule,
    TenantsModule,
    RbacModule,

    // Operação
    ClientsModule,
    ProductsModule,
    ProposalsModule,
    ContractsModule,
    PaymentsModule,
    FiscalModule,
    SignaturesModule,

    // Gestão SaaS
    SaasModule,

    // Comunicação
    EmailModule,

    // Admin Klavo
    AdminModule,
  ],
})
export class AppModule {}
