-- Script de sincronización completa agentes → tarotistas v2
-- Fecha: 31/07/2025
-- ADVERTENCIA: Este script hace una sincronización completa

-- 1. Crear backup completo
CREATE TABLE IF NOT EXISTS panel_tarot.tarotistas_backup_completo_20250731 AS 
SELECT * FROM panel_tarot.tarotistas;

-- 2. Limpiar duplicados en tarotistas (mantener el más reciente)
DELETE t1 FROM panel_tarot.tarotistas t1
INNER JOIN panel_tarot.tarotistas t2 
WHERE t1.codigo_agente = t2.codigo_agente 
  AND t1.id < t2.id
  AND t1.codigo_agente IS NOT NULL;

-- 3. Insertar TODOS los agentes activos que no están en tarotistas
INSERT INTO panel_tarot.tarotistas (
    codigo_agente,
    extension,
    agente_usuario,
    nombre,
    apellidos,
    descripcion,
    estado_actual,
    activo,
    orden_display,
    telefono_contacto,
    valoracion,
    valoracion_visa,
    sync_with_asterisk,
    last_sync_from_asterisk
)
SELECT 
    a.usuario as codigo_agente,
    a.usuario as extension,
    a.usuario as agente_usuario,
    a.nombre,
    COALESCE(a.apellidos, '') as apellidos,
    COALESCE(a.descripcion, '') as descripcion,
    CASE 
        WHEN a.estado_login = 0 THEN 'offline'
        WHEN a.estado_ocupacion = 1 THEN 'ocupado'
        WHEN a.dnd_status = 1 THEN 'pausa'
        WHEN a.estado_login = 1 AND a.estado_ocupacion = 0 THEN 'disponible'
        ELSE 'offline'
    END as estado_actual,
    1 as activo,
    COALESCE(a.orden_display, 999) as orden_display,
    a.telefono as telefono_contacto,
    3 as valoracion,
    3 as valoracion_visa,
    1 as sync_with_asterisk,
    NOW() as last_sync_from_asterisk
FROM asterisk.agentes a
WHERE a.activo = 1
  AND NOT EXISTS (
    SELECT 1 FROM panel_tarot.tarotistas t 
    WHERE t.codigo_agente = a.usuario
  );

-- 4. Actualizar tarotistas existentes con info de agentes
UPDATE panel_tarot.tarotistas t
INNER JOIN asterisk.agentes a ON t.codigo_agente = a.usuario
SET 
    t.extension = COALESCE(t.extension, a.usuario),
    t.agente_usuario = a.usuario,
    t.nombre = a.nombre,
    t.apellidos = COALESCE(a.apellidos, t.apellidos),
    t.telefono_contacto = COALESCE(a.telefono, t.telefono_contacto),
    t.estado_actual = CASE 
        WHEN a.estado_login = 0 THEN 'offline'
        WHEN a.estado_ocupacion = 1 THEN 'ocupado'
        WHEN a.dnd_status = 1 THEN 'pausa'
        WHEN a.estado_login = 1 AND a.estado_ocupacion = 0 THEN 'disponible'
        ELSE 'offline'
    END,
    t.activo = 1,
    t.sync_with_asterisk = 1,
    t.last_sync_from_asterisk = NOW()
WHERE a.activo = 1;

-- 5. Desactivar tarotistas sin codigo_agente o que no existen en agentes
UPDATE panel_tarot.tarotistas t
SET 
    t.activo = 0,
    t.estado_actual = 'offline',
    t.ultima_actualizacion = NOW()
WHERE (
    t.codigo_agente IS NULL 
    OR NOT EXISTS (
        SELECT 1 FROM asterisk.agentes a 
        WHERE a.usuario = t.codigo_agente AND a.activo = 1
    )
);

-- 6. Crear triggers para mantener sincronización automática
DELIMITER $$

-- Trigger cuando se actualiza un agente en asterisk
DROP TRIGGER IF EXISTS asterisk.sync_agente_to_tarotista$$
CREATE TRIGGER asterisk.sync_agente_to_tarotista
AFTER UPDATE ON asterisk.agentes
FOR EACH ROW
BEGIN
    IF NEW.activo = 1 AND NEW.sync_with_panel = 1 THEN
        -- Actualizar o insertar en tarotistas
        INSERT INTO panel_tarot.tarotistas (
            codigo_agente, extension, agente_usuario, nombre, apellidos,
            estado_actual, activo, telefono_contacto, sync_with_asterisk, last_sync_from_asterisk
        ) VALUES (
            NEW.usuario, NEW.usuario, NEW.usuario, NEW.nombre, NEW.apellidos,
            CASE 
                WHEN NEW.estado_login = 0 THEN 'offline'
                WHEN NEW.estado_ocupacion = 1 THEN 'ocupado'
                WHEN NEW.dnd_status = 1 THEN 'pausa'
                ELSE 'disponible'
            END,
            1, NEW.telefono, 1, NOW()
        )
        ON DUPLICATE KEY UPDATE
            nombre = NEW.nombre,
            apellidos = NEW.apellidos,
            telefono_contacto = NEW.telefono,
            estado_actual = CASE 
                WHEN NEW.estado_login = 0 THEN 'offline'
                WHEN NEW.estado_ocupacion = 1 THEN 'ocupado'
                WHEN NEW.dnd_status = 1 THEN 'pausa'
                ELSE 'disponible'
            END,
            activo = 1,
            last_sync_from_asterisk = NOW();
    ELSEIF NEW.activo = 0 THEN
        -- Desactivar en tarotistas
        UPDATE panel_tarot.tarotistas 
        SET activo = 0, estado_actual = 'offline'
        WHERE codigo_agente = NEW.usuario;
    END IF;
END$$

-- Trigger cuando se actualiza una tarotista en panel_tarot
DROP TRIGGER IF EXISTS panel_tarot.sync_tarotista_to_agente$$
CREATE TRIGGER panel_tarot.sync_tarotista_to_agente
AFTER UPDATE ON panel_tarot.tarotistas
FOR EACH ROW
BEGIN
    IF NEW.sync_with_asterisk = 1 AND NEW.codigo_agente IS NOT NULL THEN
        -- Actualizar estado en agentes
        UPDATE asterisk.agentes
        SET 
            estado_login = CASE 
                WHEN NEW.estado_actual = 'offline' THEN 0
                ELSE 1
            END,
            estado_ocupacion = CASE 
                WHEN NEW.estado_actual = 'ocupado' THEN 1
                ELSE 0
            END,
            dnd_status = CASE 
                WHEN NEW.estado_actual = 'pausa' THEN 1
                ELSE 0
            END
        WHERE usuario = NEW.codigo_agente;
        
        -- Actualizar tabla unificada
        INSERT INTO asterisk.agent_unified_state (
            agent_code, agent_name, login_state, occupation_state, dnd_state, update_source
        ) VALUES (
            NEW.codigo_agente,
            NEW.nombre,
            CASE WHEN NEW.estado_actual = 'offline' THEN 0 ELSE 1 END,
            CASE WHEN NEW.estado_actual = 'ocupado' THEN 1 ELSE 0 END,
            CASE WHEN NEW.estado_actual = 'pausa' THEN 1 ELSE 0 END,
            'PANEL_TAROT'
        )
        ON DUPLICATE KEY UPDATE
            login_state = VALUES(login_state),
            occupation_state = VALUES(occupation_state),
            dnd_state = VALUES(dnd_state),
            update_source = 'PANEL_TAROT';
    END IF;
END$$

DELIMITER ;

-- 7. Verificar resultados
SELECT 
    'ANTES' as momento,
    (SELECT COUNT(*) FROM panel_tarot.tarotistas_backup_completo_20250731) as total_tarotistas,
    (SELECT COUNT(*) FROM panel_tarot.tarotistas_backup_completo_20250731 WHERE activo = 1) as tarotistas_activas
UNION ALL
SELECT 
    'DESPUES' as momento,
    (SELECT COUNT(*) FROM panel_tarot.tarotistas) as total_tarotistas,
    (SELECT COUNT(*) FROM panel_tarot.tarotistas WHERE activo = 1) as tarotistas_activas
UNION ALL
SELECT 
    'AGENTES_ASTERISK' as momento,
    (SELECT COUNT(*) FROM asterisk.agentes) as total_tarotistas,
    (SELECT COUNT(*) FROM asterisk.agentes WHERE activo = 1) as tarotistas_activas;