import { DynamicModule, Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { BullModule } from '@nestjs/bullmq';
import { GpsModule } from '../gps/gps.module';
import { AnalyticsModule } from '../analytics/analytics.module';
import { QUEUE_NAMES } from '../common/constants/events';
import { isRedisEnabled, resolveRedisUrl } from '../config/runtime-config';
import {
  AnalyticsProcessor,
  GpsProcessor,
} from './processors/queue.processors';

@Module({})
export class QueueModule {
  static register(): DynamicModule {
    const redisOff =
      process.env.REDIS_ENABLED === 'false' ||
      process.env.REDIS_ENABLED === '0';

    if (redisOff) {
      return { module: QueueModule };
    }

    return {
      module: QueueModule,
      imports: [
        BullModule.forRootAsync({
          imports: [ConfigModule],
          useFactory: (cfg: ConfigService) => ({
            connection: { url: resolveRedisUrl(cfg) },
            prefix: cfg.get('BULLMQ_PREFIX', 'trip_track'),
          }),
          inject: [ConfigService],
        }),
        BullModule.registerQueue(
          { name: QUEUE_NAMES.GPS },
          { name: QUEUE_NAMES.NOTIFICATIONS },
          { name: QUEUE_NAMES.ANALYTICS },
        ),
        GpsModule,
        AnalyticsModule,
      ],
      providers: [GpsProcessor, AnalyticsProcessor],
      exports: [BullModule],
    };
  }
}
