import { DynamicModule, Module, Provider } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { BullMqAutomationQueuePort } from './bullmq-queue.port';
import { NoopAutomationQueuePort } from './noop-queue.port';
import { QUEUE_PORT } from './queue-port';

@Module({})
export class AutomationQueueModule {
  static register(): DynamicModule {
    const queuePortProvider: Provider = {
      provide: QUEUE_PORT,
      inject: [
        ConfigService,
        BullMqAutomationQueuePort,
        NoopAutomationQueuePort,
      ],
      useFactory: (
        configService: ConfigService,
        bullMqQueue: BullMqAutomationQueuePort,
        noopQueue: NoopAutomationQueuePort,
      ) => {
        return configService.get<string>('REDIS_URL') ? bullMqQueue : noopQueue;
      },
    };

    return {
      module: AutomationQueueModule,
      imports: [ConfigModule],
      providers: [
        NoopAutomationQueuePort,
        BullMqAutomationQueuePort,
        queuePortProvider,
      ],
      exports: [QUEUE_PORT],
    };
  }
}
