-- ============================================
-- MIGRACIÓN: Tabla de auditoría histórica para boletas
-- Fecha: 2026-01-21
-- Propósito: Mantener snapshot de datos al momento de emisión
-- ============================================

-- PASO 1: Crear tabla de snapshots
-- ============================================
CREATE TABLE IF NOT EXISTS boletas_snapshot (
    id_snapshot INT AUTO_INCREMENT PRIMARY KEY,
    id_boleta INT NOT NULL,
    fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    -- Snapshot en JSON (TEXT para MySQL 5.6) con todos los datos al momento de emisión
    snapshot_datos TEXT NOT NULL,
    
    -- Índices para búsqueda rápida
    INDEX idx_boleta (id_boleta),
    INDEX idx_fecha (fecha_creacion)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ============================================
-- PASO 2: Migrar datos históricos de boletas antiguas
-- ============================================
INSERT INTO boletas_snapshot (id_boleta, snapshot_datos, fecha_creacion)
SELECT 
    b.id_boleta,
    CONCAT(
        '{"datos_cliente":{"nombre":"', IFNULL(COALESCE(b.nombre, c.nombre_cliente), ''), '",',
        '"rut":"', IFNULL(COALESCE(b.rut, c.rut_cliente), ''), '",',
        '"direccion":"', IFNULL(COALESCE(b.direccion, c.direccion), ''), '",',
        '"ciudad":"', IFNULL(COALESCE(b.ciudad, ci.nombre_ciudad), ''), '",',
        '"sector":"', IFNULL(s.nombre_sector, ''), '",',
        '"numero_medidor":"', IFNULL(c.numero_medidor, ''), '"},',
        '"datos_apr":{"nombre_servicio":"', IFNULL(COALESCE(b.nombre_servicio, da.Nombre_servicio), ''), '",',
        '"rut_servicio":"', IFNULL(COALESCE(b.rut_servicio, da.rut_servicio), ''), '",',
        '"direccion_servicio":"', IFNULL(COALESCE(b.direccion_servicio, da.Direccion), ''), '",',
        '"comuna_servicio":"', IFNULL(COALESCE(b.comuna_servicio, co.nombre_comuna), ''), '",',
        '"telefono_oficina":"', IFNULL(COALESCE(b.fono_oficina_servicio, da.telefono_oficina), ''), '",',
        '"representante_legal":"', IFNULL(COALESCE(b.rep_legal_servicio, da.Representante_legal), ''), '",',
        '"telefono_representante":"', IFNULL(COALESCE(b.fono_contacto_rep_legal, da.fono_contacto), ''), '"},',
        '"datos_boleta":{"num_boleta":', IFNULL(b.num_boleta, 0), ',',
        '"fecha_emision":"', IFNULL(b.fecha_a_pagar, ''), '",',
        '"fecha_vencimiento":"', IFNULL(b.fecha_vencimiento, ''), '",',
        '"total_boleta":', IFNULL(b.total_boleta, 0), ',',
        '"estado_pago":', IFNULL(b.estado_pago, 0), '}}'
    ),
    b.fecha_a_pagar
FROM boletas b
INNER JOIN clientes c ON b.id_cliente = c.Id_cliente
LEFT JOIN ciudades ci ON c.id_ciudad = ci.Id_ciudades
LEFT JOIN sectores s ON c.sector = s.id_sector
CROSS JOIN datos_apr da
LEFT JOIN comunas co ON da.Id_comunas = co.Id_comunas
WHERE b.id_boleta IS NOT NULL;

-- Verificar migración
SELECT COUNT(*) as snapshots_creados FROM boletas_snapshot;

-- ============================================
-- PASO 3: Ahora SÍ podemos eliminar las columnas redundantes
-- ============================================
-- Ejecutar SOLO después de verificar que los snapshots se crearon correctamente

/*
ALTER TABLE boletas 
    DROP COLUMN nombre_servicio,
    DROP COLUMN rut_servicio,
    DROP COLUMN direccion_servicio,
    DROP COLUMN comuna_servicio,
    DROP COLUMN fono_oficina_servicio,
    DROP COLUMN rep_legal_servicio,
    DROP COLUMN fono_contacto_rep_legal,
    DROP COLUMN rut,
    DROP COLUMN nombre,
    DROP COLUMN direccion,
    DROP COLUMN ciudad;
*/

-- ============================================
-- VERIFICACIÓN
-- ============================================
-- Ver snapshot de una boleta específica:
-- SELECT id_boleta, JSON_PRETTY(snapshot_datos) FROM boletas_snapshot WHERE id_boleta = 1;

-- Ver diferencias entre snapshot y datos actuales:
/*
SELECT 
    bs.id_boleta,
    JSON_EXTRACT(bs.snapshot_datos, '$.datos_cliente.nombre') as nombre_historico,
    c.nombre_cliente as nombre_actual
FROM boletas_snapshot bs
INNER JOIN boletas b ON bs.id_boleta = b.id_boleta
INNER JOIN clientes c ON b.id_cliente = c.Id_cliente
WHERE JSON_EXTRACT(bs.snapshot_datos, '$.datos_cliente.nombre') != c.nombre_cliente
LIMIT 10;
*/
