-- =============================================================================
--  DESACTIVAR LA RÉPLICA INVERSA (Reservaciones V2 → portal) — retiro temporal del esquema
--
--  Proyecto : CL032BACK (portal público)   ·   Esquema: asturias_api
--  Archivo  : docs/replicacion/sql/desactivar_replica_inversa.sql
--  Reactivar: docs/replicacion/sql/activar_replica_inversa.sql
--  Guía     : docs/replicacion/08-DESACTIVACION-Y-REVERSA.md
-- =============================================================================
--
--  QUÉ HACE
--    Retira de la base TODO lo que existe solo para recibir réplicas del privado.
--    Es reversible: `activar_replica_inversa.sql` lo devuelve tal cual.
--
--  ⚠⚠ REQUISITO PREVIO — SI SE OMITE, SE ROMPE LA VENTA ⚠⚠
--
--    ANTES de ejecutar esto, el canal inverso DEBE estar apagado en la aplicación:
--
--        .env  →  REPLICACION_INVERSA_HABILITADA=false
--        php artisan config:clear
--
--    Motivo: `MapeoReplicaService` se invoca desde `finalizarConfirmacion()`, que es el
--    commit que ASIENTA LA VENTA cuando llega el veredicto de Reservaciones V2. Reservaciones V2 sigue enviando
--    el `mapeo` aunque el portal no lo use. Si las columnas de puntero desaparecen y el
--    interruptor sigue encendido, ese commit revienta EN CADA VENTA CONFIRMADA: el socio
--    queda cobrado y su reservación atascada en 'Confirmando'.
--
--    Comprobación antes de seguir:
--        php artisan tinker --execute="var_dump(config('replicacion.inversa.habilitada'));"
--        -- debe imprimir bool(false)
--
--  =============================================================================
--  LO QUE **NO** TOCA ESTE SCRIPT, Y POR QUÉ
--  =============================================================================
--
--  El canal de IDA (portal → Reservaciones V2) sigue funcionando EXACTAMENTE igual. Nada de lo
--  siguiente se elimina:
--
--    · `rsv_replicacion` .................. el outbox de salida.
--    · Los 12 triggers + `sp_rsv_marcar_replicacion` ... la captura de cambios.
--    · `rsv_reservacion.reservacionMaestro` y `reservacionFechaMaestro`
--        LA FRONTERA DE MAESTRÍA. **NO SE PUEDEN QUITAR.** El procedimiento
--        `sp_rsv_marcar_replicacion` LEE `reservacionMaestro`; sin esa columna el
--        procedimiento falla dentro del trigger y ABORTA LAS ESCRITURAS DE NEGOCIO de las
--        cuatro tablas de la reservación — el portal dejaría de poder capturar.
--        Además es lo que impide que el portal pise los datos que el club edita en Reservaciones V2,
--        y ese riesgo existe HOY, con el canal inverso apagado.
--    · `rsv_reservacion.idReservacionPrivado` y `reservacionNoPrivado`
--        Los escribe el veredicto del canal de IDA (`sellarMaestriaPrivada`). Quitarlas
--        obligaría a tocar código que hoy funciona, y no aportan nada al retiro.
--    · `rsv_bitacorareplicacion` y `MonitorReservaciones`
--        Son la observabilidad del canal de IDA: R1 (venta esperando veredicto), R3 (fallo
--        del canal de escritura), R6/R15 (rezago y leases del outbox). Quitarlas dejaría
--        ciego justo el canal que sigue vivo.
--
--  =============================================================================
--  CÓMO EJECUTAR
--    mysql -u USUARIO -p asturias_api < desactivar_replica_inversa.sql
-- =============================================================================


-- -----------------------------------------------------------------------------
-- 0. VERIFICACIÓN PREVIA — no debe haber réplicas inversas aplicadas sin respaldar
-- -----------------------------------------------------------------------------
-- Si esto devuelve algo distinto de 0, hubo réplicas del privado y sus punteros se van a
-- perder. No es grave (al reactivar, la primera réplica reconstruye por el camino de
-- respaldo, incidencia R12), pero conviene saberlo antes:
--
--   SELECT COUNT(*) AS replicas_aplicadas
--     FROM `rsv_reservacion` WHERE `reservacionVersionReplica` > 0;
--
--   SELECT COUNT(*) AS punteros_fijados
--     FROM `rsv_reservacionhabitacion` WHERE `idReservacionHabitacionPrivado` IS NOT NULL;


-- -----------------------------------------------------------------------------
-- 1. RESPALDO de los punteros, por si se reactiva pronto
--
--    Ocupan poco y evitan la adopción por respaldo al reactivar. Si no interesan,
--    coméntalo: no son necesarios para nada más.
-- -----------------------------------------------------------------------------
DROP TABLE IF EXISTS `bkp_replica_inversa_punteros`;

CREATE TABLE `bkp_replica_inversa_punteros` (
  `idReservacion`                  int          NOT NULL,
  `idReservacionPrivado`           int          NULL,
  `reservacionVersionReplica`      bigint       NULL,
  `reservacionHashReplica`         char(64)     NULL,
  `reservacionFechaReplica`        datetime     NULL,
  `idReservacionHabitacion`        int          NULL,
  `idReservacionHabitacionPrivado` int          NULL,
  KEY `idx_bkp_reservacion` (`idReservacion`)
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci
COMMENT 'Respaldo de los punteros del canal inverso antes de retirarlo. Ver docs/replicacion/08.';

INSERT INTO `bkp_replica_inversa_punteros`
SELECT r.`idReservacion`, r.`idReservacionPrivado`, r.`reservacionVersionReplica`,
       r.`reservacionHashReplica`, r.`reservacionFechaReplica`,
       h.`idReservacionHabitacion`, h.`idReservacionHabitacionPrivado`
  FROM `rsv_reservacion` r
  LEFT JOIN `rsv_reservacionhabitacion` h ON h.`idReservacion` = r.`idReservacion`
 WHERE r.`reservacionVersionReplica` > 0
    OR h.`idReservacionHabitacionPrivado` IS NOT NULL;


-- -----------------------------------------------------------------------------
-- 2. ESTADO DE RÉPLICA en la cabecera
--    (migración 2026_08_18_140000_add_estado_replica_to_rsv_reservacion)
--
--    Sin canal inverso no hay versión que comparar ni hash con qué cortar reintentos.
-- -----------------------------------------------------------------------------
ALTER TABLE `rsv_reservacion`
  DROP COLUMN `reservacionFechaReplica`,
  DROP COLUMN `reservacionHashReplica`,
  DROP COLUMN `reservacionVersionReplica`;


-- -----------------------------------------------------------------------------
-- 3. PUNTEROS DE ORIGEN del detalle
--    (migración 2026_08_18_130000_add_punteros_privado_to_rsv_detalle)
--
--    EL ÍNDICE VA ANTES QUE LA COLUMNA: el UNIQUE es compuesto y depende de ella.
-- -----------------------------------------------------------------------------
ALTER TABLE `rsv_reservacionhabitacionextra`   DROP INDEX `uq_rhe_privado`;
ALTER TABLE `rsv_reservacionhabitacionextra`   DROP COLUMN `idReservacionHabitacionExtraPrivado`;

ALTER TABLE `rsv_reservacionhabitacionpaquete` DROP INDEX `uq_rhp_privado`;
ALTER TABLE `rsv_reservacionhabitacionpaquete` DROP COLUMN `idReservacionHabitacionPaquetePrivado`;

ALTER TABLE `rsv_reservacionhabitacion`        DROP INDEX `uq_rh_privado`;
ALTER TABLE `rsv_reservacionhabitacion`        DROP COLUMN `idReservacionHabitacionPrivado`;


-- -----------------------------------------------------------------------------
-- 4. REGISTRO DE MIGRACIONES
--
--    Se BORRAN las filas de control de las dos migraciones retiradas, para que
--    `migrate:status` diga la verdad: su esquema ya no está aplicado. Si se dejaran,
--    `php artisan migrate` las daría por hechas y al reactivar no las volvería a correr.
-- -----------------------------------------------------------------------------
DELETE FROM `migrations`
 WHERE `migration` IN (
   '2026_08_18_130000_add_punteros_privado_to_rsv_detalle',
   '2026_08_18_140000_add_estado_replica_to_rsv_reservacion'
 );


-- =============================================================================
--  5. VERIFICACIÓN POSTERIOR
-- =============================================================================
--  5.1 Las columnas del canal inverso ya no están (las tres consultas: 0 filas):
--      SHOW COLUMNS FROM `rsv_reservacion`               LIKE 'reservacion%Replica';
--      SHOW COLUMNS FROM `rsv_reservacionhabitacion`     LIKE '%Privado';
--      SHOW COLUMNS FROM `rsv_reservacionhabitacionextra` LIKE '%Privado';
--
--  5.2 LA FRONTERA DE MAESTRÍA SIGUE EN PIE (1 fila cada una — CRÍTICO):
--      SHOW COLUMNS FROM `rsv_reservacion` LIKE 'reservacionMaestro';
--      SHOW COLUMNS FROM `rsv_reservacion` LIKE 'reservacionFechaMaestro';
--
--  5.3 El canal de IDA sigue completo:
--      SELECT COUNT(*) AS debe_ser_12 FROM information_schema.TRIGGERS
--       WHERE TRIGGER_SCHEMA = DATABASE() AND EVENT_OBJECT_TABLE LIKE 'rsv_reservacion%';
--      SHOW PROCEDURE STATUS WHERE Db = DATABASE() AND Name = 'sp_rsv_marcar_replicacion';
--
--  5.4 PRUEBA FUNCIONAL del canal de ida — una Temporal debe seguir marcando:
--      SET @idt := (SELECT idReservacion FROM rsv_reservacion
--                    WHERE reservacionEstado = 'Temporal' AND reservacionMaestro = 'Portal'
--                    ORDER BY idReservacion DESC LIMIT 1);
--      UPDATE rsv_reservacion SET reservacionNotas = CONCAT(IFNULL(reservacionNotas,''),' ')
--       WHERE idReservacion = @idt;
--      SELECT COUNT(*) AS debe_ser_1 FROM rsv_replicacion
--       WHERE idReservacion = @idt AND replicacionEstado = 'Pendiente';
--
--  5.5 Y una Reservado NO debe marcar (la frontera sigue cortando):
--      SET @idr := (SELECT idReservacion FROM rsv_reservacion
--                    WHERE reservacionMaestro = 'Privado' ORDER BY idReservacion DESC LIMIT 1);
--      SELECT COUNT(*) INTO @antes FROM rsv_replicacion WHERE idReservacion = @idr;
--      UPDATE rsv_reservacion SET reservacionNotas = CONCAT(IFNULL(reservacionNotas,''),' ')
--       WHERE idReservacion = @idr;
--      SELECT COUNT(*) = @antes AS debe_ser_1 FROM rsv_replicacion WHERE idReservacion = @idr;
-- =============================================================================
--  FIN
-- =============================================================================
