-- Migration 019 — Vale Intelligence Layer
-- Tablas de memoria, hallazgos, recomendaciones, acciones, constitución y staff.
-- Idempotente: usa IF NOT EXISTS y CONTINUE HANDLERs para re-ejecución segura.

DROP PROCEDURE IF EXISTS migrate_019;

DELIMITER //
CREATE PROCEDURE migrate_019()
BEGIN
    DECLARE CONTINUE HANDLER FOR 1060 BEGIN END; -- Duplicate column
    DECLARE CONTINUE HANDLER FOR 1061 BEGIN END; -- Duplicate key
    DECLARE CONTINUE HANDLER FOR 1091 BEGIN END; -- Can't DROP key
    DECLARE CONTINUE HANDLER FOR 1050 BEGIN END; -- Table already exists

    -- ── 1. Constitución versionada de Vale ───────────────────────────────────
    -- Cada fila es una versión del system prompt. Solo una puede estar activa.
    CREATE TABLE IF NOT EXISTS vale_constitution_versions (
        id          INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        version     VARCHAR(20)  NOT NULL                COMMENT 'ej: 1.0, 1.1',
        activa      TINYINT(1)   NOT NULL DEFAULT 0      COMMENT '1 = versión en producción',
        identidad   TEXT         NOT NULL                COMMENT 'Quién es Vale',
        guardrails  TEXT         NOT NULL                COMMENT 'Lo que Vale nunca hace',
        reglas_citas TEXT        NOT NULL                COMMENT 'Cómo maneja el booking',
        reglas_escalado TEXT     NOT NULL                COMMENT 'Cuándo escala al dueño',
        reglas_idioma TEXT       NOT NULL                COMMENT 'Detección y respuesta de idioma',
        tono_default VARCHAR(40) NOT NULL DEFAULT 'calido',
        notas       TEXT         NULL                    COMMENT 'Por qué se hizo este cambio',
        created_by  VARCHAR(120) NULL,
        created_at  TIMESTAMP    DEFAULT CURRENT_TIMESTAMP,
        UNIQUE KEY uq_vcv_version (version),
        INDEX idx_vcv_activa (activa)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

    -- ── 2. Memoria flexible por tenant ───────────────────────────────────────
    -- Vale escribe aquí lo que aprende de cada negocio. Key-value con JSON.
    CREATE TABLE IF NOT EXISTS vale_memory (
        id          BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        tenant_id   BIGINT UNSIGNED NOT NULL,
        clave       VARCHAR(120)    NOT NULL  COMMENT 'ej: tono_preferido, ultimo_tema, preferencias',
        valor       JSON            NOT NULL,
        updated_at  TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
        UNIQUE KEY uq_vm_tenant_clave (tenant_id, clave),
        INDEX idx_vm_tenant (tenant_id),
        CONSTRAINT fk_vm_tenant
            FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

    -- ── 3. Hallazgos detectados por Vale ─────────────────────────────────────
    -- Un hallazgo = un problema u oportunidad detectado sobre el negocio.
    CREATE TABLE IF NOT EXISTS vale_findings (
        id            BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        tenant_id     BIGINT UNSIGNED NOT NULL,
        tipo          VARCHAR(60)     NOT NULL  COMMENT 'ficha_incompleta|foto_debil|resena_sin_responder|etc',
        severidad     TINYINT         NOT NULL DEFAULT 2 COMMENT '1=baja 2=media 3=alta',
        fuente        VARCHAR(40)     NOT NULL  COMMENT 'google|sitio|foto|resenas|instagram|manual',
        detalle       TEXT            NOT NULL  COMMENT 'Qué encontró Vale en lenguaje natural',
        evidencia_json JSON           NULL      COMMENT 'Data cruda que respalda el hallazgo',
        resuelto      TINYINT(1)      NOT NULL DEFAULT 0,
        created_at    TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        INDEX idx_vf_tenant (tenant_id),
        INDEX idx_vf_tipo (tipo),
        INDEX idx_vf_severidad (severidad),
        CONSTRAINT fk_vf_tenant
            FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

    -- ── 4. Recomendaciones accionables ───────────────────────────────────────
    -- Una recomendación sale de uno o más hallazgos y tiene un estado de ciclo de vida.
    CREATE TABLE IF NOT EXISTS vale_recommendations (
        id             BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        tenant_id      BIGINT UNSIGNED NOT NULL,
        finding_id     BIGINT UNSIGNED NULL      COMMENT 'Hallazgo que la originó',
        titulo         VARCHAR(160)    NOT NULL,
        accion         TEXT            NOT NULL  COMMENT 'Qué propone hacer Vale',
        prioridad      TINYINT         NOT NULL DEFAULT 2 COMMENT '1=baja 2=media 3=alta',
        estado         ENUM('nueva','aceptada','ejecutada','descartada') NOT NULL DEFAULT 'nueva',
        tier_minimo    VARCHAR(20)     NOT NULL DEFAULT 'free' COMMENT 'Plan mínimo para ejecutarla',
        created_at     TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        updated_at     TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
        INDEX idx_vr_tenant (tenant_id),
        INDEX idx_vr_estado (estado),
        CONSTRAINT fk_vr_tenant
            FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

    -- ── 5. Log de acciones ejecutadas por Vale ───────────────────────────────
    -- Registro de qué herramientas usó Vale, con qué args y qué resultado tuvo.
    CREATE TABLE IF NOT EXISTS vale_actions (
        id                  BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        tenant_id           BIGINT UNSIGNED NOT NULL,
        recommendation_id   BIGINT UNSIGNED NULL,
        herramienta         VARCHAR(60)     NOT NULL  COMMENT 'Nombre de la tool llamada',
        payload_json        JSON            NULL      COMMENT 'Args con que se llamó',
        resultado           ENUM('ok','error','cancelada') NOT NULL DEFAULT 'ok',
        detalle             TEXT            NULL      COMMENT 'Mensaje de resultado',
        created_at          TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        INDEX idx_va_tenant (tenant_id),
        INDEX idx_va_herramienta (herramienta),
        CONSTRAINT fk_va_tenant
            FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

    -- ── 6. Staff del negocio ─────────────────────────────────────────────────
    CREATE TABLE IF NOT EXISTS staff (
        id          BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        tenant_id   BIGINT UNSIGNED NOT NULL,
        nombre      VARCHAR(120)    NOT NULL,
        rol         VARCHAR(80)     NULL,
        activo      TINYINT(1)      NOT NULL DEFAULT 1,
        created_at  TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        updated_at  TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
        INDEX idx_staff_tenant (tenant_id),
        CONSTRAINT fk_staff_tenant
            FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

    -- ── 7. Ciudad en tenants (si no la puso la migración 018) ────────────────
    ALTER TABLE tenants ADD COLUMN ciudad VARCHAR(80) NULL;

    -- ── 8. Seed: primera versión de la constitución ───────────────────────────
    -- Solo inserta si la tabla está vacía (primera vez).
    SET @cnt = (SELECT COUNT(*) FROM vale_constitution_versions);
    IF @cnt = 0 THEN
        INSERT INTO vale_constitution_versions
            (version, activa, identidad, guardrails, reglas_citas, reglas_escalado, reglas_idioma, tono_default, notas, created_by)
        VALUES (
            '1.0',
            1,
            'Sos Vale, la asistente virtual con IA del negocio. Siempre te identificás como asistente de IA — nunca fingís ser humana. Tu rol es atender clientes, responder preguntas, agendar citas y resolver dudas con calidez, precisión y brevedad.',
            '- NUNCA inventés precios, horarios, disponibilidad ni compromisos. Si no sabés con certeza, usá las tools o escalá.\n- NUNCA pretendas ser humana ni neguéis que sos una IA si te lo preguntan.\n- NUNCA respondas sobre temas fuera del rubro del negocio.\n- Mensajes CORTOS y claros: estás en WhatsApp/chat, no escribas párrafos largos ni usés markdown.\n- Si no estás segura de algo, escalá con escalate_to_owner en vez de adivinar.',
            '- Antes de proponer cualquier horario, llamá SIEMPRE a get_availability(fecha) para obtener los slots reales del Calendar.\n- Para crear una cita necesitás tres cosas: SERVICIO + FECHA/HORA concreta + NOMBRE del cliente. Sin las tres, no creés la cita.\n- Resolvé expresiones relativas ("mañana a las 3", "el viernes") a YYYY-MM-DD HH:MM usando la fecha actual del negocio.\n- Llamá a crear_cita UNA SOLA VEZ por cita. Si devuelve ocupado → ofrecé otro slot. Si devuelve ya_agendada → confirmá sin crear otra.\n- Nunca confirmes una cita sin haber verificado disponibilidad real primero.',
            '- Escalá con escalate_to_owner cuando: el cliente tiene una queja, reclamo, solicitud de reembolso o insatisfacción.\n- Escalá cuando la situación requiera una decisión que solo el dueño puede tomar.\n- Escalá cuando el cliente repita la misma pregunta más de dos veces sin entender la respuesta.\n- Después de escalar, decile al cliente "Dejame confirmarlo con el equipo y te aviso a la brevedad." Nada más.',
            '- Detectá el idioma del cliente (español o inglés) y respondé SIEMPRE en ese mismo idioma.\n- No mezcles idiomas dentro de una misma respuesta.\n- Si el cliente escribe en español latinoamericano, usá voseo suave (como en Centroamérica) a menos que el negocio tenga configurado otro registro.',
            'calido',
            'Versión inicial — constitución base de Vale',
            'sistema'
        );
    END IF;

END //
DELIMITER ;

CALL migrate_019();
DROP PROCEDURE IF EXISTS migrate_019;
