import { BullModule, InjectQueue } from '@nestjs/bullmq';
import { Module, OnModuleInit } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { Queue } from 'bullmq';
import { SifenPayloadModule } from 'src/facturas/sifen-payload.module';
import { NotaCreditoPayloadModule } from 'src/nota-creditos/nota-credito-payload.module';
import { MailModule } from 'src/mail/mail.module';
import { MiddlewareSifenModule } from 'src/middleware-sifen/middleware-sifen.module';
import { AuditModule } from 'src/audit/audit.module';
import { EmailProcessor } from './processors/email.processor';
import { MiddlewareEmpresaProcessor } from './processors/middleware-empresa.processor';
import { SifenNCProcessor } from './processors/sifen-nc.processor';
import { SifenSyncProcessor } from './processors/sifen-sync.processor';
import { SifenProcessor } from './processors/sifen.processor';
import { QueuesService } from './queues.service';

@Module({
  imports: [
    ConfigModule,
    MailModule,
    MiddlewareSifenModule,
    SifenPayloadModule,
    NotaCreditoPayloadModule,
    AuditModule,
    BullModule.forRootAsync({
      imports: [ConfigModule],
      inject: [ConfigService],
      useFactory: (configService: ConfigService) => ({
        connection: {
          host: configService.get<string>('REDIS_HOST', 'localhost'),
          port: configService.get<number>('REDIS_PORT', 6379),
          password: configService.get<string>('REDIS_PASSWORD'),
        },
      }),
    }),
    BullModule.registerQueue({
      name: 'email-queue',
    }),
    BullModule.registerQueue({
      name: 'sifen-queue',
    }),
    BullModule.registerQueue({
      name: 'sifen-sync-queue',
    }),
    BullModule.registerQueue({
      name: 'sifen-nc-queue',
    }),
    BullModule.registerQueue({
      name: 'middleware-empresa-queue',
    }),
  ],
  providers: [
    EmailProcessor,
    SifenProcessor,
    SifenNCProcessor,
    SifenSyncProcessor,
    MiddlewareEmpresaProcessor,
    QueuesService,
  ],
  exports: [QueuesService],
})
export class QueuesModule implements OnModuleInit {
  constructor(
    @InjectQueue('sifen-sync-queue') private readonly sifenSyncQueue: Queue,
  ) {}

  async onModuleInit() {
    // Registrar el job de sincronización SIFEN que corre cada 5 minutos
    const existingJobs = await this.sifenSyncQueue.getRepeatableJobs();
    const jobExists = existingJobs.some(
      (job) => job.name === 'sync-sifen-status',
    );

    if (!jobExists) {
      await this.sifenSyncQueue.add(
        'sync-sifen-status',
        {},
        {
          repeat: {
            pattern: '*/5 * * * *', // Cada 5 minutos
          },
          removeOnComplete: 100,
          removeOnFail: 50,
        },
      );
      console.log('✅ Job de sincronización SIFEN registrado (cada 5 minutos)');
    }
  }
}
