import { Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { MongooseModule } from '@nestjs/mongoose';
import { AutomationsModule } from './automations/automations.module';
import { AutomationProcessor } from './automations/queue/automation.processor';
import { ScheduledJobsModule } from './scheduled-jobs/scheduled-jobs.module';
import { ScheduledJobsProcessor } from './scheduled-jobs/queue/scheduled-jobs.processor';
import {
  envSchema,
  substituteLaravelEnvPlaceholders,
} from './config/env.validation';

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
      envFilePath: [`.env.${process.env.NODE_ENV}`, '.env'],
      load: [
        () => {
          const prepared = substituteLaravelEnvPlaceholders(process.env);
          if (
            typeof prepared.LARAVEL_API_URL === 'string' &&
            prepared.LARAVEL_API_URL !== process.env.LARAVEL_API_URL
          ) {
            process.env.LARAVEL_API_URL = prepared.LARAVEL_API_URL;
          }
          const parsed = envSchema.safeParse(prepared);

          if (!parsed.success) {
            console.error(
              '❌ Invalid environment variables:',
              parsed.error.flatten().fieldErrors,
            );
            process.exit(1);
          }

          return parsed.data;
        },
      ],
    }),
    MongooseModule.forRootAsync({
      imports: [ConfigModule],
      useFactory: (configService: ConfigService) => ({
        uri: configService.get<string>('MONGODB_URI'),
        dbName: 'planfi_bff',
      }),
      inject: [ConfigService],
    }),
    AutomationsModule,
    ScheduledJobsModule,
  ],
  providers: [AutomationProcessor, ScheduledJobsProcessor],
})
export class WorkerModule {}
