import { Injectable, Logger } from '@nestjs/common';
import { Cron, CronExpression } from '@nestjs/schedule';
import { EcommerceStockReservaService } from './ecommerce-stock-reserva.service';

/**
 * Libera las reservas de stock pre-pago vencidas (Fase 7.5).
 *
 * Sin esto, una sesión de checkout abandonada dejaría el stock trabado para
 * siempre. Corre cada minuto: el TTL por defecto es de 15 min, así que la
 * granularidad es más que suficiente y el query es barato (índice sobre
 * `liberada, expira_at`).
 */
@Injectable()
export class EcommerceStockReservaCron {
  private readonly logger = new Logger(EcommerceStockReservaCron.name);
  private corriendo = false;

  constructor(private readonly reservas: EcommerceStockReservaService) {}

  @Cron(CronExpression.EVERY_MINUTE, { name: 'ecommerce-liberar-reservas-vencidas' })
  async liberarVencidas() {
    // Guard de reentrada: si una corrida se demora, no encimamos otra.
    if (this.corriendo) return;
    this.corriendo = true;
    try {
      const { sesiones, reservas } = await this.reservas.expirarVencidas();
      if (sesiones || reservas) {
        this.logger.log(
          `Reservas vencidas liberadas: ${reservas} línea(s), ${sesiones} sesión(es) expirada(s).`,
        );
      }
    } catch (err) {
      this.logger.error(
        `Fallo liberando reservas vencidas: ${err instanceof Error ? err.message : String(err)}`,
      );
    } finally {
      this.corriendo = false;
    }
  }
}
