-- ---------------------------------------------------------------------------
-- Estado de la réplica de catálogos de tarifa (rsv_catalogoreplicacionestado).
--
-- Equivalente manual de la migración
--   database/migrations/2026_08_25_120000_create_rsv_catalogoreplicacionestado_table.php
-- para aplicarlo directo cuando `php artisan migrate` no esté disponible.
--
-- UNA SOLA FILA, SIEMPRE (idCatalogoReplicacionEstado = 1). No es una bitácora: es el sello
-- de "qué snapshot está aplicado ahora mismo". El rastro histórico vive en
-- rsv_bitacorareplicacion, que es donde ya vive el del canal de reservaciones.
--
-- POR QUÉ UNA TABLA Y NO CACHÉ. Un `cache:clear` en un despliegue borraría el hash y el
-- siguiente snapshot idéntico se re-aplicaría entero. No sería incorrecto —el snapshot es
-- idempotente— pero se perdería la única evidencia de cuándo se aplicó qué, que es
-- justamente lo que se consulta después de un reclamo de tarifa.
--
-- POR QUÉ EL HISTORIAL DE HASHES. Es lo que permite distinguir un REINTENTO TARDÍO de un
-- REINICIO DE CONTADORES del emisor. Los dos llegan con `versiones` menores a las aplicadas;
-- el reintento trae un hash que el portal YA aplicó, el reinicio trae uno nuevo. Sin esta
-- columna habría que elegir entre revertir cambios nuevos (aplicar siempre) o dejar el canal
-- rechazando para siempre si alguien resiembra la tabla de marca de CL034 (ignorar siempre).
-- Ninguna de las dos es aceptable: la transferencia tiene que poder funcionar SIEMPRE.
--
-- La fila 1 se siembra vacía a propósito: con `catalogoReplicacionEstadoHash` en NULL, el
-- primer snapshot que llegue no empata con nada y se aplica completo. Ese es el arranque en
-- frío correcto, y también el de un portal recién desplegado con catálogos vacíos (E13).
--
-- Referencia: CL034RESERVACIONESV2/docs/PROPUESTA_REPLICACION_CATALOGOS_PORTAL.md §3.2.
-- ---------------------------------------------------------------------------

CREATE TABLE IF NOT EXISTS `rsv_catalogoreplicacionestado` (
  `idCatalogoReplicacionEstado`        int         NOT NULL AUTO_INCREMENT,
  `catalogoReplicacionEstadoHash`      char(64)    NULL DEFAULT NULL COMMENT 'sha256 canonico del ultimo snapshot aplicado',
  `catalogoReplicacionEstadoVersiones` json        NULL     COMMENT '{tipohabitacion:N, paquete:N, extra:N} del ultimo aplicado',
  `catalogoReplicacionEstadoFecha`     datetime(6) NULL DEFAULT NULL COMMENT 'Cuando se aplico',
  `catalogoReplicacionEstadoAnioDesde` smallint    NULL DEFAULT NULL COMMENT 'Ventana declarada en ese snapshot',
  `catalogoReplicacionEstadoResumen`   json        NULL     COMMENT 'Ultimo {insertados, actualizados, apagados, borrados}',
  `catalogoReplicacionEstadoHistorial` json        NULL     COMMENT 'Ultimos N hashes aplicados, mas reciente primero. Distingue reintento tardio de reinicio del emisor',
  PRIMARY KEY (`idCatalogoReplicacionEstado`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

-- Siembra de la fila única. Idempotente: re-ejecutar el script no pisa el estado aplicado.
INSERT INTO `rsv_catalogoreplicacionestado` (`idCatalogoReplicacionEstado`) VALUES (1)
ON DUPLICATE KEY UPDATE `idCatalogoReplicacionEstado` = `idCatalogoReplicacionEstado`;

-- Comprobación
-- SELECT * FROM `rsv_catalogoreplicacionestado`;

-- Reversa
-- DROP TABLE IF EXISTS `rsv_catalogoreplicacionestado`;
