-- ---------------------------------------------------------------------------
-- Vencimiento MATERIALIZADO de la Temporal (rsv_reservacion.reservacionFechaHoraExpira).
--
-- Equivalente manual de la migración
--   database/migrations/2026_08_05_170000_add_fechahoraexpira_to_rsv_reservacion.php
-- para aplicarlo directo cuando `php artisan migrate` no esté disponible.
--
-- POR QUÉ SE GUARDA en vez de derivarse:
--   · El barrido consultaba `captura < now - TTL` y el cronómetro calculaba `captura + TTL`:
--     dos implementaciones de la misma regla, condenadas a divergir en cuanto alguien toque
--     una sola. Con la fecha guardada hay UNA fuente.
--   · Al bajar el TTL de 1440 a 30 min, todas las Temporales vivas murieron en el instante
--     porque el vencimiento se recalculaba con el config del momento. Fijándolo al crear, un
--     cambio de TTL solo afecta a las reservaciones nuevas.
--
-- POR QUÉ SE REDONDEA AL MINUTO SIGUIENTE:
--   El barrido corre `->everyMinute()` y cancela cuando `captura < now - TTL`, con `now` solo
--   en minutos exactos. Ese redondeo es el instante REAL de la cancelación, así que el
--   cronómetro llega a 00:00 justo cuando la reservación muere — y no se queda hasta 59
--   segundos marcando cero mientras todavía se puede pagar.
-- ---------------------------------------------------------------------------

ALTER TABLE `rsv_reservacion`
  ADD COLUMN `reservacionFechaHoraExpira` DATETIME NULL
    COMMENT 'Instante exacto en que el barrido cancelará la Temporal (captura + TTL, redondeado al minuto siguiente)'
    AFTER `reservacionFechaHoraCaptura`;

-- El barrido corre cada minuto sobre la tabla completa.
ALTER TABLE `rsv_reservacion`
  ADD INDEX `idx_rsv_estado_expira` (`reservacionEstado`, `reservacionFechaHoraExpira`);

-- Relleno de las Temporales que ya estaban vivas cuando se creó la columna. Sin esto se
-- quedarían sin cronómetro en pantalla. Ajusta el 30 si tu RESERVACION_TEMPORAL_TTL_MINUTOS
-- es otro.
UPDATE `rsv_reservacion`
   SET `reservacionFechaHoraExpira` = DATE_ADD(
           DATE_FORMAT(DATE_ADD(`reservacionFechaHoraCaptura`, INTERVAL 30 MINUTE), '%Y-%m-%d %H:%i:00'),
           INTERVAL 1 MINUTE
       )
 WHERE `reservacionEstado` = 'Temporal'
   AND `reservacionFechaHoraExpira` IS NULL
   AND `reservacionFechaHoraCaptura` IS NOT NULL;

-- Comprobación
-- SELECT idReservacion, reservacionEstado, reservacionFechaHoraCaptura, reservacionFechaHoraExpira
--   FROM rsv_reservacion WHERE reservacionEstado = 'Temporal';
