-- ---------------------------------------------------------------------------
-- Eje explícito de MAESTRÍA de la reservación (rsv_reservacion).
--
-- Equivalente manual de la migración
--   database/migrations/2026_08_18_120000_add_maestria_to_rsv_reservacion.php
-- para aplicarlo directo cuando `php artisan migrate` no esté disponible.
--
-- ⚠ REQUISITO PREVIO DEL SCRIPT DE TRIGGERS
--   database/manual/2026_08_18_triggers_rsv_replicacion_maestria.sql LEE la columna
--   `reservacionMaestro` desde `sp_rsv_marcar_replicacion`. ESTE ALTER VA PRIMERO.
--   Si el procedimiento se instala sin la columna, fallará en tiempo de ejecución y
--   ABORTARÁ LAS ESCRITURAS DE NEGOCIO sobre las 4 tablas de la reservación.
--
-- POR QUÉ UNA COLUMNA Y NO UNA CONDICIÓN SOBRE reservacionEstado
--   1. La regla no es expresable por estado: un 'Cancelado' que viene de 'Temporal' SÍ
--      debe replicarse (libera cupo en el maestro); uno que viene de 'Reservado' no puede
--      ni originarse aquí. Mismo estado destino, respuestas opuestas.
--   2. El estado no es monótono: una corrección manual que devolviera la fila a 'Temporal'
--      le regresaría la maestría al portal EN SILENCIO, y el siguiente snapshot borraría lo
--      que el privado hubiera editado.
--   3. Los triggers nieto (paquete/extra) tendrían que saltar dos tablas solo para leer un
--      estado: 12 sitios donde la regla puede divergir.
--   4. No es auditable. reservacionFechaMaestro responde "¿desde cuándo mandaba el privado?".
--
-- Con esta columna, los 12 triggers NO cambian: la condición vive en el único procedimiento
-- que ya comparten.
--
-- Referencia: PROPUESTA_REPLICACION_BIDIRECCIONAL_RESERVACIONES.md §4 y §6.
--
-- NOTA sobre reservacionNoPrivado: la columna se crea ya, pero QUÉ FOLIO VE EL SOCIO sigue
-- siendo la decisión D1 de la propuesta, pendiente del negocio. Hasta entonces el portal
-- muestra el suyo y este campo es solo trazabilidad.
-- ---------------------------------------------------------------------------

ALTER TABLE `rsv_reservacion`
  ADD COLUMN `reservacionMaestro` ENUM('Portal','Privado')
      CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'Portal'
      COMMENT 'Quien manda sobre esta reservacion. Se sella a Privado al asentarse la venta y no retrocede.'
      AFTER `reservacionEstado`,
  ADD COLUMN `reservacionFechaMaestro` DATETIME NULL DEFAULT NULL
      COMMENT 'Instante exacto de la transferencia de maestria al privado. Auditoria de reclamos.'
      AFTER `reservacionMaestro`,
  ADD COLUMN `idReservacionPrivado` INT NULL DEFAULT NULL
      COMMENT 'PK de rsv_reservacion en Reservaciones V2. Puntero de la reservacion en el maestro.'
      AFTER `reservacionFechaMaestro`,
  ADD COLUMN `reservacionNoPrivado` INT NULL DEFAULT NULL
      COMMENT 'Folio que emitio el maestro. Ver decision D1 de la propuesta.'
      AFTER `idReservacionPrivado`,
  ADD UNIQUE INDEX `uq_reservacion_privado` (`idReservacionPrivado`),
  ADD INDEX `idx_reservacion_maestro` (`reservacionMaestro`, `idReservacion`);

-- Comprobación
-- SHOW COLUMNS FROM `rsv_reservacion` LIKE 'reservacion%Maestro';
-- SHOW INDEX FROM `rsv_reservacion` WHERE Key_name IN ('uq_reservacion_privado','idx_reservacion_maestro');

-- ---------------------------------------------------------------------------
-- REVERSA (en orden inverso: primero los índices)
-- ---------------------------------------------------------------------------
-- ALTER TABLE `rsv_reservacion` DROP INDEX `idx_reservacion_maestro`;
-- ALTER TABLE `rsv_reservacion` DROP INDEX `uq_reservacion_privado`;
-- ALTER TABLE `rsv_reservacion`
--   DROP COLUMN `reservacionNoPrivado`,
--   DROP COLUMN `idReservacionPrivado`,
--   DROP COLUMN `reservacionFechaMaestro`,
--   DROP COLUMN `reservacionMaestro`;
-- ⚠ Antes de la reversa, REINSTALA el script de triggers ANTERIOR
--   (database/manual/2026_07_24_triggers_rsv_replicacion.sql) o el procedimiento
--   quedará leyendo una columna que ya no existe.
