-- ---------------------------------------------------------------------------
-- BACKFILL DE MAESTRÍA — sella las ventas que YA estaban asentadas.
--
-- Se ejecuta UNA SOLA VEZ, después de:
--   1. database/sql/rsv_reservacion_add_maestria.sql
--   2. database/manual/2026_08_18_triggers_rsv_replicacion_maestria.sql
--
-- POR QUÉ HACE FALTA
--   La columna `reservacionMaestro` nace con DEFAULT 'Portal', así que TODAS las filas
--   preexistentes quedaron marcadas como del portal — incluidas las que ya son ventas
--   firmes asentadas en Reservaciones V2. Para esas, la frontera NO está protegiendo nada: cualquier
--   UPDATE sobre ellas (de la app, de un script o a mano en la BD) volvería a marcarlas, y
--   ese snapshot llegaría a Reservaciones V2 a borrar el detalle que el privado hubiera editado.
--
--   Es justo el escenario que las cuatro capas existen para impedir, y sin este backfill
--   queda abierto para las ventas anteriores al despliegue.
--
-- POR QUÉ SOLO 'Reservado' Y 'Finalizado'
--   Son los dos únicos estados a los que una reservación del portal SOLO puede llegar por
--   un veredicto OK de Reservaciones V2: la venta ya está asentada allá y el maestro es el privado.
--   Es exactamente lo que `finalizarConfirmacion()` sella de aquí en adelante.
--
-- POR QUÉ NO SE TOCAN LAS 'Cancelado'
--   No se puede saber, mirando solo el estado, si vienen de 'Temporal' (nunca fueron una
--   venta; el portal siguió siendo el maestro) o de 'Reservado' (sí lo fueron). Sellarlas
--   todas mentiría sobre la mitad. Y no hace falta: son terminales, su réplica ya se cerró,
--   y nada las va a volver a tocar. Ante la duda, no se inventa historia.
--
-- POR QUÉ `reservacionFechaMaestro` = `reservacionFechaHoraConfirmacion`
--   Es el instante REAL en que Reservaciones V2 aceptó la venta, que es lo que la columna significa.
--   Poner NOW() fecharía la transferencia el día del despliegue y haría inútil la auditoría
--   justo en los casos más viejos, que son los que más se reclaman. COALESCE con
--   `reservacionFecha` cubre las filas sin hora de confirmación.
--
-- `idReservacionPrivado` SE QUEDA EN NULL
--   El veredicto de esas ventas no guardó `idReservacionRemoto` (la columna no existía).
--   No se inventa: la primera réplica inversa de cada una caerá al camino de respaldo
--   (PROPUESTA §8.3), que reemplaza el detalle completo fijando los punteros de una vez y
--   levanta la incidencia R12. Ocurre a lo sumo una vez por reservación y es correcto.
--
-- Referencia: PROPUESTA_REPLICACION_BIDIRECCIONAL_RESERVACIONES.md §4, §8.3.
-- ---------------------------------------------------------------------------

-- 1. QUÉ SE VA A TOCAR (revisar ANTES de ejecutar el UPDATE)
SELECT `idReservacion`, `idMembresia`, `reservacionNo`, `reservacionEstado`,
       `reservacionMaestro`, `reservacionFechaLlegada`, `reservacionImporte`,
       `reservacionFechaHoraConfirmacion`
  FROM `rsv_reservacion`
 WHERE `reservacionEstado` IN ('Reservado', 'Finalizado')
   AND `reservacionMaestro` = 'Portal'
 ORDER BY `idReservacion`;

-- 2. EL SELLO
--
-- NOTA: este UPDATE dispara `trg_rsv_reservacion_au`, pero NO genera marcas. El trigger
-- corre DESPUÉS de la escritura, así que el SELECT del procedimiento ya lee 'Privado' y la
-- guarda corta. Es la misma propiedad que cierra el bucle del canal inverso.
UPDATE `rsv_reservacion`
   SET `reservacionMaestro`      = 'Privado',
       `reservacionFechaMaestro` = COALESCE(`reservacionFechaHoraConfirmacion`, `reservacionFecha`, NOW())
 WHERE `reservacionEstado` IN ('Reservado', 'Finalizado')
   AND `reservacionMaestro` = 'Portal';

-- 3. VERIFICACIÓN
--
-- 3.1 No debe quedar ninguna venta firme en manos del portal:
-- SELECT COUNT(*) AS debe_ser_0 FROM `rsv_reservacion`
--  WHERE `reservacionEstado` IN ('Reservado','Finalizado') AND `reservacionMaestro` = 'Portal';
--
-- 3.2 El backfill no debe haber ensuciado el outbox:
-- SELECT COUNT(*) AS debe_ser_0 FROM `rsv_replicacion`
--  WHERE `replicacionEstado` IN ('Pendiente','Error');
--
-- 3.3 Reparto final:
-- SELECT `reservacionMaestro`, `reservacionEstado`, COUNT(*) AS n
--   FROM `rsv_reservacion` GROUP BY `reservacionMaestro`, `reservacionEstado`;

-- ---------------------------------------------------------------------------
-- REVERSA
--
-- Devolver la maestría al portal NO es una operación del sistema: es un acto
-- administrativo explícito. Se deja aquí solo para deshacer un backfill mal aplicado,
-- y únicamente mientras el canal inverso siga apagado. Con el canal encendido, revertir
-- esto habilita al portal a pisar al maestro.
-- ---------------------------------------------------------------------------
-- UPDATE `rsv_reservacion`
--    SET `reservacionMaestro` = 'Portal', `reservacionFechaMaestro` = NULL
--  WHERE `reservacionEstado` IN ('Reservado','Finalizado');
