-- Script para resetear tarotistas y sincronizar desde asterisk.agentes
-- Fecha: 31/07/2025
-- Asterisk es la fuente de verdad para estados

-- 1. Backup completo antes de borrar
CREATE TABLE IF NOT EXISTS panel_tarot.tarotistas_backup_full_20250731 AS 
SELECT * FROM panel_tarot.tarotistas;

-- 2. Limpiar tabla tarotistas
TRUNCATE TABLE panel_tarot.tarotistas;

-- 3. Copiar todos los agentes activos de asterisk
INSERT INTO panel_tarot.tarotistas (
    codigo_agente,
    extension,
    agente_usuario,
    nombre,
    apellidos,
    descripcion,
    estado_actual,
    activo,
    orden_display,
    telefono_contacto,
    valoracion,
    valoracion_visa,
    proveedor_id,
    valoracion_automatica,
    valoracion_visa_automatica,
    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,
    CASE 
        -- Descripciones aleatorias según el código
        WHEN a.usuario LIKE '3%' THEN 'Especialista en Tarot y videncia natural'
        WHEN a.usuario LIKE '4%' THEN 'Experta en temas sentimentales y relaciones'
        WHEN a.usuario LIKE '5%' THEN 'Consejera espiritual y guía personal'
        WHEN a.usuario >= '1000' THEN 'Tarotista profesional con años de experiencia'
        ELSE 'Vidente y consejera espiritual'
    END as descripcion,
    -- Estado actual basado en asterisk
    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,
    a.activo,
    COALESCE(a.orden_display, 999) as orden_display,
    a.telefono as telefono_contacto,
    -- Valoraciones aleatorias entre 3-5
    FLOOR(3 + RAND() * 3) as valoracion,
    FLOOR(3 + RAND() * 3) as valoracion_visa,
    1 as proveedor_id, -- Proveedor por defecto
    1 as valoracion_automatica,
    1 as valoracion_visa_automatica,
    1 as sync_with_asterisk,
    NOW() as last_sync_from_asterisk
FROM asterisk.agentes a
WHERE a.activo = 1;

-- 4. Insertar especialidades (mancias) aleatorias
-- Primero verificar si existen las mancias
INSERT IGNORE INTO panel_tarot.mancias (nombre) VALUES 
('Tarot'), ('Videncia'), ('Numerología'), ('Astrología'), 
('Péndulo'), ('Runas'), ('Cartomancia'), ('Quiromancia'),
('Reiki'), ('Ángeles'), ('Sueños'), ('Vidas Pasadas');

-- Asignar 2-4 especialidades aleatorias a cada tarotista
INSERT INTO panel_tarot.tarotista_mancias (tarotista_id, mancia_id)
SELECT 
    t.id,
    m.id
FROM panel_tarot.tarotistas t
CROSS JOIN panel_tarot.mancias m
WHERE 
    -- Asignar aleatoriamente
    RAND() < 0.3  -- 30% de probabilidad para cada mancia
    AND t.activo = 1
ORDER BY t.id, RAND()
ON DUPLICATE KEY UPDATE tarotista_id = tarotista_id;

-- 5. Crear proceso de sincronización periódica
DELIMITER $$

-- Procedimiento para sincronizar estados desde Asterisk
DROP PROCEDURE IF EXISTS panel_tarot.sync_estados_from_asterisk$$
CREATE PROCEDURE panel_tarot.sync_estados_from_asterisk()
BEGIN
    -- Actualizar estados de todas las tarotistas basándose en asterisk.agentes
    UPDATE panel_tarot.tarotistas t
    INNER JOIN asterisk.agentes a ON t.codigo_agente = a.usuario
    SET 
        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 = a.activo,
        t.telefono_contacto = COALESCE(a.telefono, t.telefono_contacto),
        t.last_sync_from_asterisk = NOW()
    WHERE t.sync_with_asterisk = 1;
    
    -- Marcar como offline las que no existen en asterisk o están inactivas
    UPDATE panel_tarot.tarotistas t
    LEFT JOIN asterisk.agentes a ON t.codigo_agente = a.usuario AND a.activo = 1
    SET 
        t.estado_actual = 'offline',
        t.activo = 0,
        t.ultima_actualizacion = NOW()
    WHERE a.usuario IS NULL 
      AND t.sync_with_asterisk = 1;
      
    -- Retornar cantidad de registros actualizados
    SELECT 
        COUNT(*) as total_sincronizadas,
        SUM(CASE WHEN estado_actual = 'disponible' THEN 1 ELSE 0 END) as disponibles,
        SUM(CASE WHEN estado_actual = 'ocupado' THEN 1 ELSE 0 END) as ocupadas,
        SUM(CASE WHEN estado_actual = 'pausa' THEN 1 ELSE 0 END) as en_pausa,
        SUM(CASE WHEN estado_actual = 'offline' THEN 1 ELSE 0 END) as offline
    FROM panel_tarot.tarotistas
    WHERE activo = 1;
END$$

DELIMITER ;

-- 6. Ejecutar primera sincronización
CALL panel_tarot.sync_estados_from_asterisk();

-- 7. Mostrar resultados
SELECT 
    'RESUMEN SINCRONIZACIÓN' as info;
    
SELECT 
    COUNT(*) as total_tarotistas,
    SUM(CASE WHEN activo = 1 THEN 1 ELSE 0 END) as activas,
    SUM(CASE WHEN estado_actual = 'disponible' THEN 1 ELSE 0 END) as disponibles,
    SUM(CASE WHEN estado_actual = 'ocupado' THEN 1 ELSE 0 END) as ocupadas,
    SUM(CASE WHEN estado_actual = 'offline' THEN 1 ELSE 0 END) as offline
FROM panel_tarot.tarotistas;

-- Mostrar algunas tarotistas de ejemplo
SELECT 
    codigo_agente,
    nombre,
    extension,
    estado_actual,
    valoracion,
    telefono_contacto,
    last_sync_from_asterisk
FROM panel_tarot.tarotistas
WHERE activo = 1
LIMIT 10;