<?php
set_time_limit(60);
ini_set('max_execution_time', 60);
/**
 * AGENTE IA - ESCOMONTT CAPACITACIÓN
 * v6 — Feriados automáticos + interruptor on/off
 */

define('VERIFY_TOKEN',      'escomontt2024');
define('WHATSAPP_TOKEN',    'EAAcZCoyn72JABRyR7zXEDK1PqJOhqPPZB5rSsRZB29UXo8xFxwM51vYmAekenpVV6ZAod8iZC5NYdWobYHwFXjsvAj3Np1iVyh6Lk2e2qkNHC3OASB8ZCrQlF0zU3q9enJoUlWDzlpwlkM4BPOTGHvPFEry9IV2ik1LDFkZAI2uBCJZANOrYfg5kqhIp55CZCRa0XKPVa61vxENBDuIiicUe4JOl42PAWZBZBpJ43SHawEM0jYMdZCeWZBBjHWZCuPpoCNuhYca3GOwnwPddmCBDiqw9xIZBgZDZD');
define('WHATSAPP_PHONE_ID', '1083040444890104');
define('KAPSO_API_KEY',     'da9fb20e7561d99a11e3c06a9382778d980370ef235c60b38dd21bbb21e194ce'); // Cuenta Kapso separada para ESCOMONTT
define('CLAUDE_API_KEY',    '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');
define('CLAUDE_MODEL',      'claude-sonnet-4-5');
define('OPENAI_API_KEY',    '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'); // Para transcripción de audios con Whisper
define('CONFIG_FILE',       __DIR__ . '/config_agente.json');

define('DB_HOST', 'localhost');
define('DB_NAME', 'escomont_agente');
define('DB_USER', 'escomont_agente');
define('DB_PASS', 'Escuela2020.');

define('SMTP_HOST', 'mail.escomontt.cl');
define('SMTP_PORT', 465);
define('SMTP_USER', 'info@escomontt.cl');
define('SMTP_PASS', 'Escuela2020.');
define('SMTP_FROM_NAME', 'Valentina ESCOMONTT');

require_once __DIR__ . '/PHPMailer/src/Exception.php';
require_once __DIR__ . '/PHPMailer/src/PHPMailer.php';
require_once __DIR__ . '/PHPMailer/src/SMTP.php';

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception as PHPMailerException;

/**
 * Envía un correo por SMTP autenticado usando PHPMailer.
 * $destinatarios puede ser un string o un array de strings.
 * Retorna true/false y deja registro en error_log.txt si falla.
 */
function enviarCorreo($destinatarios, $asunto, $cuerpo) {
    $mail = new PHPMailer(true);
    try {
        $mail->isSMTP();
        $mail->Host       = SMTP_HOST;
        $mail->SMTPAuth   = true;
        $mail->Username   = SMTP_USER;
        $mail->Password   = SMTP_PASS;
        $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
        $mail->Port       = SMTP_PORT;
        $mail->CharSet    = 'UTF-8';

        $mail->setFrom(SMTP_USER, SMTP_FROM_NAME);
        $mail->addReplyTo(SMTP_USER, SMTP_FROM_NAME);

        if (is_array($destinatarios)) {
            foreach ($destinatarios as $d) { $mail->addAddress($d); }
        } else {
            $mail->addAddress($destinatarios);
        }

        $mail->Subject = $asunto;
        $mail->Body    = $cuerpo;
        $mail->isHTML(false);

        $mail->send();
        return true;
    } catch (PHPMailerException $e) {
        file_put_contents(__DIR__ . '/error_log.txt', date('Y-m-d H:i:s') . " PHPMailer: " . $mail->ErrorInfo . "\n", FILE_APPEND);
        return false;
    }
}

function enviarWhatsApp($to, $texto) {
    // Envío vía proxy de Kapso (compatible con Graph API de Meta).
    // Kapso gestiona la conexión en modo Coexistencia, por lo que el envío
    // saliente pasa por su API en vez de graph.facebook.com directo.
    $payload = ['messaging_product' => 'whatsapp', 'to' => $to, 'type' => 'text', 'text' => ['body' => $texto]];
    $ch = curl_init('https://api.kapso.ai/meta/whatsapp/v24.0/' . WHATSAPP_PHONE_ID . '/messages');
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => json_encode($payload),
        CURLOPT_HTTPHEADER => ['Content-Type: application/json', 'X-API-Key: ' . KAPSO_API_KEY]
    ]);
    $resp = curl_exec($ch);
    $err  = curl_error($ch);
    curl_close($ch);
    file_put_contents(__DIR__ . '/wa_log.txt', date('Y-m-d H:i:s') . " To: $to\n" . $resp . ($err ? " CURL_ERR: $err" : '') . "\n\n", FILE_APPEND);
    return $resp;
}

/**
 * Descarga cualquier archivo multimedia de WhatsApp (imagen, audio, etc.) vía el proxy de Kapso.
 * Requiere phone_number_id como query param para que Kapso sepa qué configuración usar.
 * Devuelve ['bytes' => binario_crudo, 'mime' => mime_type] o null si falla en cualquier paso.
 */
function obtenerMediaKapso($media_id) {
    $ch = curl_init('https://api.kapso.ai/meta/whatsapp/v24.0/' . $media_id . '?phone_number_id=' . WHATSAPP_PHONE_ID);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER => ['X-API-Key: ' . KAPSO_API_KEY],
        CURLOPT_TIMEOUT => 15
    ]);
    $resp = curl_exec($ch);
    curl_close($ch);
    $info = json_decode($resp, true);

    // Se prioriza download_url (URL propia de Kapso, ya con el token embebido)
    $urlDescarga = $info['download_url'] ?? $info['url'] ?? null;
    if (!$urlDescarga) {
        file_put_contents(__DIR__ . '/error_log.txt', date('Y-m-d H:i:s') . " Media URL fail (media_id=$media_id): " . $resp . "\n", FILE_APPEND);
        return null;
    }

    $ch2 = curl_init($urlDescarga);
    $opts = [CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 25];
    if (!isset($info['download_url'])) {
        $opts[CURLOPT_HTTPHEADER] = ['X-API-Key: ' . KAPSO_API_KEY];
    }
    curl_setopt_array($ch2, $opts);
    $bytes = curl_exec($ch2);
    $httpCode = curl_getinfo($ch2, CURLINFO_HTTP_CODE);
    curl_close($ch2);

    if ($httpCode !== 200 || empty($bytes)) {
        file_put_contents(__DIR__ . '/error_log.txt', date('Y-m-d H:i:s') . " Media download fail HTTP $httpCode (media_id=$media_id)\n", FILE_APPEND);
        return null;
    }

    return ['bytes' => $bytes, 'mime' => $info['mime_type'] ?? 'application/octet-stream'];
}

/**
 * Descarga una imagen de WhatsApp y la deja lista en base64 para la visión de Claude.
 */
function obtenerImagenBase64($media_id) {
    $media = obtenerMediaKapso($media_id);
    if (!$media) return null;
    return ['base64' => base64_encode($media['bytes']), 'mime' => $media['mime']];
}

/**
 * Descarga un audio de WhatsApp y lo transcribe con Whisper (OpenAI).
 * Devuelve el texto transcrito o null si falla en cualquier paso.
 */
function transcribirAudioWhisper($media_id) {
    $media = obtenerMediaKapso($media_id);
    if (!$media) return null;

    $ext = (strpos($media['mime'], 'ogg') !== false) ? 'ogg' : 'mp3';
    $tmpFile = tempnam(sys_get_temp_dir(), 'wa_audio_') . '.' . $ext;
    file_put_contents($tmpFile, $media['bytes']);

    $ch = curl_init('https://api.openai.com/v1/audio/transcriptions');
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST           => true,
        CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . OPENAI_API_KEY],
        CURLOPT_POSTFIELDS     => [
            'file'     => new CURLFile($tmpFile, $media['mime'], 'audio.' . $ext),
            'model'    => 'whisper-1',
            'language' => 'es'
        ],
        CURLOPT_TIMEOUT => 40
    ]);
    $resp = curl_exec($ch);
    $err  = curl_error($ch);
    curl_close($ch);
    @unlink($tmpFile);

    file_put_contents(__DIR__ . '/whisper_log.txt', date('Y-m-d H:i:s') . "\n" . $resp . ($err ? " CURL_ERR: $err" : '') . "\n\n", FILE_APPEND);

    $data  = json_decode($resp, true);
    $texto = trim($data['text'] ?? '');
    return $texto !== '' ? $texto : null;
}

function getSystemPrompt() {
    $config_file = __DIR__ . '/config_agente.json';
    if (file_exists($config_file)) {
        $config = json_decode(file_get_contents($config_file), true);
        if (!empty($config['system_prompt'])) {
            return $config['system_prompt'];
        }
    }
    return 'Eres Valentina, asesora comercial de ESCOMONTT Capacitación. Responde consultas sobre cursos de conducción de manera amable y profesional.';
}

function cargarConfig() {
    if (file_exists(CONFIG_FILE)) {
        $c = json_decode(file_get_contents(CONFIG_FILE), true);
        return $c ?: [];
    }
    return [];
}

function esFeriado($fecha) {
    $anio = date('Y', strtotime($fecha));
    $cache_file = __DIR__ . "/feriados_{$anio}.json";
    if (!file_exists($cache_file) || (time() - filemtime($cache_file)) > 86400) {
        $ch = curl_init("https://apis.digital.gob.cl/fl/feriados/{$anio}");
        curl_setopt_array($ch, [
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_TIMEOUT        => 5,
            CURLOPT_HTTPHEADER     => ['Accept: application/json']
        ]);
        $response = curl_exec($ch);
        curl_close($ch);
        if ($response) {
            file_put_contents($cache_file, $response);
        }
    }
    if (file_exists($cache_file)) {
        $feriados = json_decode(file_get_contents($cache_file), true);
        if (is_array($feriados)) {
            foreach ($feriados as $f) {
                if (isset($f['fecha']) && substr($f['fecha'], 0, 10) === $fecha) {
                    return true;
                }
            }
        }
    }
    return false;
}

function valentinaDbeResponder() {
    date_default_timezone_set('America/Santiago');
    $config = cargarConfig();
    if (isset($config['valentina_activa']) && $config['valentina_activa'] === false) {
        file_put_contents(__DIR__ . '/webhook_log.txt', date('Y-m-d H:i:s') . " [VALENTINA APAGADA MANUALMENTE]\n\n", FILE_APPEND);
        return false;
    }
    $dia   = (int)date('N');
    $hora  = (int)date('H');
    $min   = (int)date('i');
    $time  = $hora * 60 + $min;
    $hoy   = date('Y-m-d');
    if (esFeriado($hoy)) {
        file_put_contents(__DIR__ . '/webhook_log.txt', date('Y-m-d H:i:s') . " [FERIADO - Valentina activa]\n\n", FILE_APPEND);
        return true;
    }
    if ($dia >= 6) return true;
    $hora_inicio      = isset($config['hora_inicio'])      ? (int)$config['hora_inicio']      : 9;
    $hora_fin         = isset($config['hora_fin'])         ? (int)$config['hora_fin']         : 19;
    $hora_fin_viernes = isset($config['hora_fin_viernes']) ? (int)$config['hora_fin_viernes'] : 18;
    if ($dia === 5) return !($time >= $hora_inicio * 60 && $time < $hora_fin_viernes * 60);
    return !($time >= $hora_inicio * 60 && $time < $hora_fin * 60);
}

header('Content-Type: application/json');

if ($_SERVER['REQUEST_METHOD'] === 'GET') {
    if (isset($_GET['hub_mode']) && $_GET['hub_mode'] === 'subscribe' &&
        isset($_GET['hub_verify_token']) && $_GET['hub_verify_token'] === VERIFY_TOKEN) {
        http_response_code(200);
        echo $_GET['hub_challenge'];
    } else {
        http_response_code(403);
        echo 'Forbidden';
    }
    exit;
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $input = file_get_contents('php://input');
    $data  = json_decode($input, true);

    file_put_contents(__DIR__ . '/webhook_log.txt', date('Y-m-d H:i:s') . "\n" . $input . "\n\n", FILE_APPEND);

    $value = $data['entry'][0]['changes'][0]['value'] ?? null;

    // ── ECOS DE MENSAJES ENVIADOS MANUALMENTE DESDE LA APP (Coexistence) ──
    // Cuando alguien del equipo escribe directo desde el celular, Kapso reenvía
    // el evento "smb_message_echoes" en vez de "messages". Los registramos como
    // role='equipo' para que valentinaDbeResponder / silencio_humano los detecten.
    if (isset($value['message_echoes']) && is_array($value['message_echoes'])) {
        try {
            $pdo_echo = new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME.";charset=utf8mb4",
                DB_USER, DB_PASS, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
            foreach ($value['message_echoes'] as $echo) {
                $tel_cliente = $echo['to'] ?? '';
                if (!$tel_cliente) continue;
                $texto_echo = $echo['text']['body'] ?? ('[' . ($echo['type'] ?? 'mensaje') . ' enviado desde la app]');
                $pdo_echo->prepare("INSERT INTO conversaciones (telefono, role, mensaje) VALUES (?, 'equipo', ?)")
                    ->execute([$tel_cliente, $texto_echo]);
                $pdo_echo->prepare("UPDATE contactos SET ultimo_contacto=NOW() WHERE telefono=?")->execute([$tel_cliente]);
            }
            file_put_contents(__DIR__ . '/webhook_log.txt', date('Y-m-d H:i:s') . " [MESSAGE_ECHO registrado]\n\n", FILE_APPEND);
        } catch (Exception $e) {
            file_put_contents(__DIR__ . '/error_log.txt', date('Y-m-d H:i:s') . " Echo DB: " . $e->getMessage() . "\n", FILE_APPEND);
        }
        http_response_code(200);
        echo json_encode(['status' => 'echo_registrado']);
        exit;
    }

    if (!isset($value['messages'])) {
        http_response_code(200);
        echo json_encode(['status' => 'no_message']);
        exit;
    }

    $message    = $value['messages'][0];
    $from       = $message['from'];
    $msg_type   = $message['type'];
    $message_id = $message['id'] ?? '';

    if ($message_id) {
        try {
            $pdo_dedup = new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME.";charset=utf8mb4",
                DB_USER, DB_PASS, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
            $pdo_dedup->exec("CREATE TABLE IF NOT EXISTS mensajes_procesados (
                message_id VARCHAR(255) PRIMARY KEY,
                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
            )");
            $pdo_dedup->exec("DELETE FROM mensajes_procesados WHERE created_at < NOW() - INTERVAL 1 HOUR");
            try {
                $stmt_dedup = $pdo_dedup->prepare("INSERT INTO mensajes_procesados (message_id) VALUES (?)");
                $stmt_dedup->execute([$message_id]);
            } catch (PDOException $e) {
                file_put_contents(__DIR__ . '/webhook_log.txt', date('Y-m-d H:i:s') . " [DUPLICADO IGNORADO] $message_id\n\n", FILE_APPEND);
                http_response_code(200);
                echo json_encode(['status' => 'duplicate']);
                exit;
            }
        } catch (Exception $e) {
            file_put_contents(__DIR__ . '/error_log.txt', date('Y-m-d H:i:s') . " Dedup DB: " . $e->getMessage() . "\n", FILE_APPEND);
        }
    }

    $contact_name = $value['contacts'][0]['profile']['name'] ?? null;
    $user_text    = ($msg_type === 'text') ? ($message['text']['body'] ?? '') : ('[' . $msg_type . ' recibido]');

    $pdo_check = null;
    try {
        $pdo_check = new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME.";charset=utf8mb4",
            DB_USER, DB_PASS, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
    } catch (Exception $e) {}

    $ejecutivo_activo = false;
    $estado_actual_contacto = null;
    if ($pdo_check) {
        try {
            $stmt_check = $pdo_check->prepare("SELECT COUNT(*) FROM conversaciones 
                WHERE telefono=? AND role='equipo' AND created_at >= NOW() - INTERVAL 2 HOUR");
            $stmt_check->execute([$from]);
            $ejecutivo_activo = ($stmt_check->fetchColumn() > 0);
        } catch (Exception $e) {}

        try {
            $stmt_estado_chk = $pdo_check->prepare("SELECT estado FROM contactos WHERE telefono=?");
            $stmt_estado_chk->execute([$from]);
            $estado_actual_contacto = $stmt_estado_chk->fetchColumn() ?: null;
        } catch (Exception $e) {}
    }

    // Estados donde se asume que un humano ya tomó el lead: Valentina se queda en silencio,
    // sin importar si alguien le escribió por el chat del CRM en las últimas 2 horas.
    $estados_gestion_humana = ['nuevo', 'en_gestion', 'listo', 'matriculado'];
    $requiere_silencio = $ejecutivo_activo || in_array($estado_actual_contacto, $estados_gestion_humana);

    if ($requiere_silencio) {
        $motivo = $ejecutivo_activo ? 'EJECUTIVO ACTIVO' : "ESTADO '$estado_actual_contacto' - requiere gestión humana";
        file_put_contents(__DIR__ . '/webhook_log.txt', date('Y-m-d H:i:s') . " [$motivo - Valentina en silencio]\n\n", FILE_APPEND);
        if ($pdo_check) {
            try {
                $pdo_check->prepare("INSERT INTO conversaciones (telefono, nombre, role, mensaje) VALUES (?, ?, 'user', ?)")
                    ->execute([$from, $contact_name, $user_text]);
                $pdo_check->prepare("UPDATE contactos SET ultimo_contacto=NOW() WHERE telefono=?")
                    ->execute([$from]);
            } catch (Exception $e) {}
        }
        http_response_code(200);
        echo json_encode(['status' => 'silencio_humano', 'motivo' => $motivo]);
        exit;
    }

    $mediaImagen = null;

    if ($msg_type === 'image') {
        $media_id = $message['image']['id'] ?? null;
        $caption  = $message['image']['caption'] ?? '';
        $mediaImagen = $media_id ? obtenerImagenBase64($media_id) : null;
        if ($mediaImagen) {
            $user_text = $caption !== '' ? $caption : '[Imagen recibida, sin texto adicional]';
        } else {
            enviarWhatsApp($from, 'Uy, no pude abrir esa imagen 😅 ¿Puedes intentar enviarla de nuevo o contarme tu consulta por texto?');
            http_response_code(200);
            echo json_encode(['status' => 'imagen_fallo']);
            exit;
        }
    } elseif ($msg_type === 'audio') {
        $media_id = $message['audio']['id'] ?? null;
        $audio_texto = $media_id ? transcribirAudioWhisper($media_id) : null;
        if ($audio_texto) {
            $user_text = $audio_texto;
        } else {
            enviarWhatsApp($from, 'No pude escuchar bien tu audio 🙈 ¿Me lo puedes escribir o volver a grabar?');
            http_response_code(200);
            echo json_encode(['status' => 'audio_fallo']);
            exit;
        }
    } elseif ($msg_type !== 'text') {
        enviarWhatsApp($from, '¡Hola! 😊 Por el momento solo puedo atenderte por texto, foto o audio. ¿Me cuentas tu consulta? 👍');
        http_response_code(200);
        echo json_encode(['status' => 'ignored_type']);
        exit;
    }

    $es_horario_laboral = !valentinaDbeResponder();
    $es_primera_vez = false;
    if ($es_horario_laboral && $pdo_check) {
        try {
            $chk = $pdo_check->prepare("SELECT COUNT(*) FROM contactos WHERE telefono=?");
            $chk->execute([$from]);
            $es_primera_vez = ($chk->fetchColumn() == 0);
            file_put_contents(__DIR__ . '/webhook_log.txt', date('Y-m-d H:i:s') . " [HORARIO LABORAL] primera_vez=" . ($es_primera_vez?'SI':'NO') . "\n\n", FILE_APPEND);
        } catch (Exception $e) {
            file_put_contents(__DIR__ . '/error_log.txt', date('Y-m-d H:i:s') . " DB chequeo primera_vez: " . $e->getMessage() . "\n", FILE_APPEND);
        }
    }

    $pdo = $pdo_check;
    if (!$pdo) {
        try {
            $pdo = new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME.";charset=utf8mb4",
                DB_USER, DB_PASS, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
        } catch (Exception $e) {
            file_put_contents(__DIR__ . '/error_log.txt', date('Y-m-d H:i:s') . " DB: " . $e->getMessage() . "\n", FILE_APPEND);
            http_response_code(500); exit;
        }
    }

    $pdo->exec("CREATE TABLE IF NOT EXISTS conversaciones (
        id INT AUTO_INCREMENT PRIMARY KEY,
        telefono VARCHAR(30) NOT NULL,
        nombre VARCHAR(100),
        role ENUM('user','assistant','equipo') NOT NULL,
        mensaje TEXT NOT NULL,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    )");

    $pdo->exec("CREATE TABLE IF NOT EXISTS contactos (
        id INT AUTO_INCREMENT PRIMARY KEY,
        telefono VARCHAR(30) UNIQUE NOT NULL,
        nombre VARCHAR(100),
        estado VARCHAR(50) DEFAULT 'valentina',
        temperatura VARCHAR(20) DEFAULT 'frio',
        primer_contacto TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        ultimo_contacto TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    )");
    try { $pdo->exec("ALTER TABLE contactos ADD COLUMN temperatura VARCHAR(20) DEFAULT 'frio'"); } catch(Exception $e) {}
    try { $pdo->exec("ALTER TABLE contactos ADD COLUMN empresa_notificada TINYINT DEFAULT 0"); } catch(Exception $e) {}
    try { $pdo->exec("ALTER TABLE contactos ADD COLUMN caliente_notificada TINYINT DEFAULT 0"); } catch(Exception $e) {}

    $stmt = $pdo->prepare("INSERT INTO contactos (telefono, nombre, estado) VALUES (?, ?, 'valentina')
        ON DUPLICATE KEY UPDATE nombre = COALESCE(?, nombre), ultimo_contacto = NOW()");
    $stmt->execute([$from, $contact_name, $contact_name]);

    // Si el contacto estaba descartado y vuelve a escribir, se reabre automáticamente
    $stmt_reabrir = $pdo->prepare("UPDATE contactos SET estado='valentina' WHERE telefono=? AND estado='no_interesado'");
    $stmt_reabrir->execute([$from]);
    if ($stmt_reabrir->rowCount() > 0) {
        // Se resetean los flags de notificación para que, si vuelve a calentarse
        // o a consultar como empresa, el equipo reciba el aviso de nuevo.
        $pdo->prepare("UPDATE contactos SET empresa_notificada=0, caliente_notificada=0 WHERE telefono=?")->execute([$from]);
        file_put_contents(__DIR__ . '/webhook_log.txt', date('Y-m-d H:i:s') . " [REABIERTO] Tel: $from volvió a escribir tras estar Descartado, vuelve a columna Valentina\n\n", FILE_APPEND);
    }

    $stmt = $pdo->prepare("INSERT INTO conversaciones (telefono, nombre, role, mensaje) VALUES (?, ?, 'user', ?)");
    $stmt->execute([$from, $contact_name, $user_text]);

    if ($es_primera_vez) {
        $bienvenida = "¡Hola! 👋 Soy Valentina, asesora de ESCOMONTT Capacitación.\n\nDesde 1998 somos la escuela de conductores más antigua de Puerto Montt 🚗\n\n¿Qué curso te interesa?\n\n1️⃣ Licencia Clase B\n2️⃣ Licencias A2 / A4 (Profesional)\n3️⃣ Licencias A3 / A5 (Profesional)\n4️⃣ Empresas (Franquicia SENCE)\n5️⃣ Servicio a Alumnos (Plataforma, horarios y dudas)";
        enviarWhatsApp($from, $bienvenida);
        $pdo->prepare("INSERT INTO conversaciones (telefono, nombre, role, mensaje) VALUES (?, ?, 'assistant', ?)")
            ->execute([$from, $contact_name, $bienvenida]);

        file_put_contents(__DIR__ . '/webhook_log.txt', date('Y-m-d H:i:s') . " [PRIMERA VEZ - Bienvenida enviada, Claude omitido]\n\n", FILE_APPEND);
        http_response_code(200);
        echo json_encode(['status' => 'bienvenida_enviada']);
        exit;
    }

    $stmt = $pdo->prepare("SELECT role, mensaje FROM conversaciones WHERE telefono=? ORDER BY created_at DESC LIMIT 20");
    $stmt->execute([$from]);
    $historial = array_reverse($stmt->fetchAll(PDO::FETCH_ASSOC));

    $messages = [];
    foreach ($historial as $row) {
        $role = $row['role'] === 'equipo' ? 'assistant' : $row['role'];
        $content = $row['mensaje'];
        if (empty($messages)) {
            if ($role === 'user') $messages[] = ['role' => $role, 'content' => $content];
            continue;
        }
        $last = count($messages) - 1;
        if ($messages[$last]['role'] === $role) {
            $messages[$last]['content'] .= "\n" . $content;
        } else {
            $messages[] = ['role' => $role, 'content' => $content];
        }
    }
    if (empty($messages)) $messages = [['role' => 'user', 'content' => $user_text]];

    // Si este turno trae una imagen real, se reemplaza el texto del último mensaje del usuario
    // por un bloque de contenido con la imagen + el texto/caption, para que Claude la vea de verdad.
    if ($mediaImagen && !empty($messages)) {
        $lastIdx = count($messages) - 1;
        if ($messages[$lastIdx]['role'] === 'user') {
            $messages[$lastIdx]['content'] = [
                ['type' => 'image', 'source' => ['type' => 'base64', 'media_type' => $mediaImagen['mime'], 'data' => $mediaImagen['base64']]],
                ['type' => 'text', 'text' => $user_text]
            ];
        }
    }

    date_default_timezone_set('America/Santiago');
    $dias_nombres = [1=>'Lunes',2=>'Martes',3=>'Miércoles',4=>'Jueves',5=>'Viernes',6=>'Sábado',7=>'Domingo'];
    $dia_semana   = $dias_nombres[(int)date('N')];
    $contexto_horario = "CONTEXTO ACTUAL (uso interno, nunca lo menciones ni lo repitas al cliente):\n"
        . "Hoy es $dia_semana " . date('d-m-Y') . ", hora actual en Puerto Montt: " . date('H:i') . " hrs.\n"
        . "¿Estamos en horario de oficina ahora mismo? " . ($es_horario_laboral ? "SÍ" : "NO") . ".\n"
        . "Si la respuesta es NO, aplica la instrucción de 'Fuera de horario laboral' del prompt (indicar que un ejecutivo contactará en horario de oficina). Si es SÍ, responde con normalidad.\n\n";

    $claude_payload = [
        'model'      => CLAUDE_MODEL,
        'max_tokens' => 700,
        'system'     => [
            // Bloque estático (prompt de Valentina, cursos, precios, personalidad):
            // va PRIMERO y con cache_control para que Anthropic lo cachee y no
            // se cobre/reprocese completo en cada mensaje. Válido ~5 min desde
            // la última vez que se usó; con tráfico normal se mantiene caliente.
            ['type' => 'text', 'text' => getSystemPrompt(), 'cache_control' => ['type' => 'ephemeral']],
            // Bloque dinámico (fecha/hora actual): va DESPUÉS, sin cache, porque
            // cambia en cada request y rompería el cache si estuviera primero.
            ['type' => 'text', 'text' => $contexto_horario],
        ],
        'messages'   => $messages
    ];

    $ch = curl_init('https://api.anthropic.com/v1/messages');
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST           => true,
        CURLOPT_POSTFIELDS     => json_encode($claude_payload),
        CURLOPT_HTTPHEADER     => ['Content-Type: application/json', 'x-api-key: '.CLAUDE_API_KEY, 'anthropic-version: 2023-06-01'],
        CURLOPT_TIMEOUT        => 30
    ]);
    $claude_response = curl_exec($ch);
    $curl_error = curl_error($ch);
    curl_close($ch);

    file_put_contents(__DIR__ . '/claude_log.txt', date('Y-m-d H:i:s') . "\n" . $claude_response . "\n\n", FILE_APPEND);

    if ($curl_error) {
        file_put_contents(__DIR__ . '/error_log.txt', date('Y-m-d H:i:s') . " CURL: " . $curl_error . "\n", FILE_APPEND);
        http_response_code(500); exit;
    }

    $claude_data = json_decode($claude_response, true);
    if (isset($claude_data['error'])) {
        file_put_contents(__DIR__ . '/error_log.txt', date('Y-m-d H:i:s') . " Claude: " . json_encode($claude_data['error']) . "\n", FILE_APPEND);
    }

    $agent_reply = $claude_data['content'][0]['text'] ?? '';

    if (empty(trim($agent_reply))) {
        file_put_contents(__DIR__ . '/webhook_log.txt', date('Y-m-d H:i:s') . " [RESPUESTA VACIA - reintentando]\n\n", FILE_APPEND);
        $ch_retry = curl_init('https://api.anthropic.com/v1/messages');
        curl_setopt_array($ch_retry, [
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POST           => true,
            CURLOPT_POSTFIELDS     => json_encode($claude_payload),
            CURLOPT_HTTPHEADER     => ['Content-Type: application/json', 'x-api-key: '.CLAUDE_API_KEY, 'anthropic-version: 2023-06-01'],
            CURLOPT_TIMEOUT        => 30
        ]);
        $claude_response_retry = curl_exec($ch_retry);
        curl_close($ch_retry);
        file_put_contents(__DIR__ . '/claude_log.txt', date('Y-m-d H:i:s') . " RETRY\n" . $claude_response_retry . "\n\n", FILE_APPEND);
        $claude_data_retry = json_decode($claude_response_retry, true);
        $agent_reply = $claude_data_retry['content'][0]['text'] ?? '';
    }

    if (empty(trim($agent_reply))) {
        $agent_reply = 'Disculpa, tuve un problema técnico. ¿Puedes repetir tu consulta?';
    }

    $stmt = $pdo->prepare("INSERT INTO conversaciones (telefono, nombre, role, mensaje) VALUES (?, ?, 'assistant', ?)");
    $stmt->execute([$from, $contact_name, $agent_reply]);

    // ENVIAR RESPUESTA A WHATSAPP PRIMERO (antes de análisis) para no demorar al cliente
    enviarWhatsApp($from, $agent_reply);

    // Responder HTTP 200 al webhook de Meta inmediatamente
    http_response_code(200);
    echo json_encode(['status' => 'ok']);

    // Cerrar la conexión con el cliente HTTP pero seguir ejecutando el script en background
    if (function_exists('fastcgi_finish_request')) {
        fastcgi_finish_request();
    }

    // ===== ANÁLISIS EN BACKGROUND (no bloquea la respuesta al cliente) =====
    try {
        $conv_resumen = "";
        $msgs_para_temp = array_slice($messages, -10);
        foreach ($msgs_para_temp as $m) {
            $rol = $m['role'] === 'user' ? 'Cliente' : 'Valentina';
            $conv_resumen .= $rol . ": " . substr($m['content'], 0, 500) . "\n";
        }
        $conv_resumen .= "Valentina: " . substr($agent_reply, 0, 500) . "\n";

        // UNA SOLA LLAMADA combinando temperatura + empresa para reducir tiempo total
        $analisis_payload = [
            'model'      => CLAUDE_MODEL,
            'max_tokens' => 20,
            'messages'   => [[
                'role'    => 'user',
                'content' => "Analiza esta conversacion de ventas de una escuela de conductores.\n\nConversacion:\n" . $conv_resumen . "\n\nResponde EXACTAMENTE en este formato de una linea, sin texto adicional:\nTEMPERATURA|ESEMPRESA|DESCARTA\n\nDonde TEMPERATURA es CALIENTE, TIBIO o FRIO segun:\n- CALIENTE: did horario especifico, pregunto pago, dio RUT, confirmo matricularse\n- TIBIO: pregunto que incluye, requisitos, horarios o precios\n- FRIO: solo saludo o info general\n\nY ESEMPRESA es EMPRESA si consulta en nombre de una empresa o Franquicia SENCE, sino NO.\n\nY DESCARTA es SI unicamente si el cliente dijo explicitamente que NO le interesa, que no quiere el curso, o rechazo la oferta de forma clara y directa. Si solo esta dudando, pidiendo tiempo para pensarlo, o no ha respondido nada negativo, DESCARTA es NO.\n\nEjemplo de respuesta: CALIENTE|EMPRESA|NO"
            ]]
        ];
        $ch_an = curl_init('https://api.anthropic.com/v1/messages');
        curl_setopt_array($ch_an, [
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POST           => true,
            CURLOPT_POSTFIELDS     => json_encode($analisis_payload),
            CURLOPT_HTTPHEADER     => ['Content-Type: application/json', 'x-api-key: '.CLAUDE_API_KEY, 'anthropic-version: 2023-06-01'],
            CURLOPT_TIMEOUT        => 15
        ]);
        $analisis_response = curl_exec($ch_an);
        curl_close($ch_an);

        $analisis_data = json_decode($analisis_response, true);
        $analisis_raw = trim($analisis_data['content'][0]['text'] ?? 'FRIO|NO|NO');
        file_put_contents(__DIR__ . '/webhook_log.txt', date('Y-m-d H:i:s') . " [ANALISIS RAW] $analisis_raw\n\n", FILE_APPEND);

        $partes = explode('|', strtoupper($analisis_raw));
        $temperatura_raw = trim($partes[0] ?? 'FRIO');
        $es_empresa_raw  = trim($partes[1] ?? 'NO');
        $descarta_raw    = trim($partes[2] ?? 'NO');

        $temperatura = in_array($temperatura_raw, ['CALIENTE', 'TIBIO', 'FRIO']) ? strtolower($temperatura_raw) : 'frio';
        $es_empresa  = (strpos($es_empresa_raw, 'EMPRESA') !== false);
        $descarta    = (strpos($descarta_raw, 'SI') !== false);

        $pdo->prepare("UPDATE contactos SET temperatura=? WHERE telefono=?")->execute([$temperatura, $from]);

        $nombre_lead = $contact_name ?: $from;
        $stmt_nombre = $pdo->prepare("SELECT nombre FROM contactos WHERE telefono=?");
        $stmt_nombre->execute([$from]);
        $row_nombre = $stmt_nombre->fetch(PDO::FETCH_ASSOC);
        if ($row_nombre && $row_nombre['nombre']) $nombre_lead = $row_nombre['nombre'];

        if ($descarta) {
            $stmt_desc = $pdo->prepare("UPDATE contactos SET estado='no_interesado' WHERE telefono=?");
            $stmt_desc->execute([$from]);
            file_put_contents(__DIR__ . '/webhook_log.txt', date('Y-m-d H:i:s') . " [DESCARTADO AUTOMÁTICO - cliente rechazó la oferta] Tel: $from\n\n", FILE_APPEND);
        } elseif ($temperatura === 'caliente') {
            $stmt_move = $pdo->prepare("UPDATE contactos SET estado='nuevo' WHERE telefono=? AND estado='valentina'");
            $stmt_move->execute([$from]);
            $filas_afectadas = $stmt_move->rowCount();
            file_put_contents(__DIR__ . '/webhook_log.txt', date('Y-m-d H:i:s') . " [CALIENTE] Tel: $from Filas movidas: $filas_afectadas\n\n", FILE_APPEND);

            // Aviso por correo al equipo, una sola vez por lead mientras siga caliente.
            $chk_cal = $pdo->prepare("SELECT caliente_notificada FROM contactos WHERE telefono=?");
            $chk_cal->execute([$from]);
            $row_cal = $chk_cal->fetch(PDO::FETCH_ASSOC);
            $ya_notificado_caliente = $row_cal && !empty($row_cal['caliente_notificada']);

            if (!$ya_notificado_caliente) {
                $asunto_cal = "Lead CALIENTE: $nombre_lead listo para matricular";
                $cuerpo_cal = "Hola equipo ESCOMONTT,\n\nValentina detecto un lead CALIENTE (dio horario especifico, pregunto pago, dio RUT o confirmo matricularse):\n\nNombre/Contacto: $nombre_lead\nTelefono: +$from\nUltimo mensaje: " . substr($user_text, 0, 200) . "\n\nLa tarjeta ya se movio a la columna 'Atender Urgente' en el CRM. Ingresa a revisar y contactar cuanto antes:\nhttps://escomontt.cl/agente/crm.php\n\n-- Valentina IA, ESCOMONTT Capacitacion";
                $rc1 = enviarCorreo('ventas@escomontt.cl', $asunto_cal, $cuerpo_cal);
                $rc2 = enviarCorreo('contacto@escomontt.cl', $asunto_cal, $cuerpo_cal);
                $pdo->prepare("UPDATE contactos SET caliente_notificada=1 WHERE telefono=?")->execute([$from]);
                file_put_contents(__DIR__ . '/webhook_log.txt', date('Y-m-d H:i:s') . " [CALIENTE - Email ventas:" . ($rc1?'OK':'FAIL') . " contacto:" . ($rc2?'OK':'FAIL') . "]\n\n", FILE_APPEND);
            }
        }

        if ($es_empresa && !$descarta) {
            $chk_emp = $pdo->prepare("SELECT empresa_notificada FROM contactos WHERE telefono=?");
            $chk_emp->execute([$from]);
            $row_emp = $chk_emp->fetch(PDO::FETCH_ASSOC);
            $ya_notificado = $row_emp && !empty($row_emp['empresa_notificada']);

            file_put_contents(__DIR__ . '/webhook_log.txt', date('Y-m-d H:i:s') . " [CHEQUEO EMPRESA] ya_notificado=" . ($ya_notificado?'SI':'NO') . "\n\n", FILE_APPEND);

            if (!$ya_notificado) {
                $asunto_emp = "Cliente EMPRESA: $nombre_lead consulta por capacitacion";
                $cuerpo_emp = "Hola equipo ESCOMONTT,\n\nValentina detecto una consulta de EMPRESA o Franquicia Tributaria SENCE:\n\nNombre/Contacto: $nombre_lead\nTelefono: +$from\nUltimo mensaje: " . substr($user_text, 0, 200) . "\n\nIngresa al CRM para revisar la conversacion completa y preparar cotizacion:\nhttps://escomontt.cl/agente/crm.php\n\n-- Valentina IA, ESCOMONTT Capacitacion";
                $re1 = enviarCorreo('ventas@escomontt.cl', $asunto_emp, $cuerpo_emp);
                $re2 = enviarCorreo('contacto@escomontt.cl', $asunto_emp, $cuerpo_emp);
                $pdo->prepare("UPDATE contactos SET empresa_notificada=1 WHERE telefono=?")->execute([$from]);
                file_put_contents(__DIR__ . '/webhook_log.txt', date('Y-m-d H:i:s') . " [EMPRESA DETECTADA - Email ventas:" . ($re1?'OK':'FAIL') . " contacto:" . ($re2?'OK':'FAIL') . "]\n\n", FILE_APPEND);
            }
        }

    } catch (Exception $e) {
        file_put_contents(__DIR__ . '/error_log.txt', date('Y-m-d H:i:s') . " Analisis: " . $e->getMessage() . "\n", FILE_APPEND);
    }

    exit;
}

http_response_code(405);
echo json_encode(['error' => 'Method not allowed']);