import { InjectQueue } from "@nestjs/bullmq";
import { Injectable, Logger, OnApplicationBootstrap } from "@nestjs/common";
import { Queue } from "bullmq";
import {
  BILLING_JOBS,
  BILLING_QUEUE,
  MARK_OVERDUE_CRON,
  MONTHLY_INVOICE_CRON,
} from "./billing.constants";

/**
 * Registra los repeat jobs de billing al iniciar la app. BullMQ deduplica por
 * `jobId`, así que podemos llamar `add(..., { repeat })` sin riesgo de duplicar
 * la programación entre reinicios.
 */
@Injectable()
export class BillingScheduler implements OnApplicationBootstrap {
  private readonly logger = new Logger(BillingScheduler.name);

  constructor(@InjectQueue(BILLING_QUEUE) private readonly queue: Queue) {}

  async onApplicationBootstrap() {
    if (process.env.BILLING_CRON_DISABLED === "1") {
      this.logger.warn("BILLING_CRON_DISABLED=1 — no se programan jobs de billing");
      return;
    }
    await this.queue.add(
      BILLING_JOBS.GENERATE_MONTHLY,
      {},
      {
        repeat: { pattern: MONTHLY_INVOICE_CRON, tz: "UTC" },
        jobId: `repeat:${BILLING_JOBS.GENERATE_MONTHLY}`,
        removeOnComplete: 50,
        removeOnFail: 50,
      },
    );
    await this.queue.add(
      BILLING_JOBS.MARK_OVERDUE,
      {},
      {
        repeat: { pattern: MARK_OVERDUE_CRON, tz: "UTC" },
        jobId: `repeat:${BILLING_JOBS.MARK_OVERDUE}`,
        removeOnComplete: 50,
        removeOnFail: 50,
      },
    );
    this.logger.log(
      `Billing cron programado: generación mensual "${MONTHLY_INVOICE_CRON}" UTC, overdue "${MARK_OVERDUE_CRON}" UTC`,
    );
  }
}
