<?php
/**
 * Heritage Voice — ai.php
 * RAG: Tìm dữ liệu nội bộ → truyền vào Claude → trả lời chính xác
 * POST /api/ai/chat
 */

header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization');
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(200); exit; }
if ($_SERVER['REQUEST_METHOD'] !== 'POST') { echo json_encode(['error'=>'Method not allowed']); exit; }

define('CLAUDE_API_KEY', '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');
define('CLAUDE_MODEL',   'claude-sonnet-4-5');
define('MAX_TOKENS',     600);
define('MAX_CONTEXT',    1500); // Token giới hạn data RAG

// Rate limit 30 req/phút/IP
$ip      = $_SERVER['REMOTE_ADDR'] ?? 'unknown';
$rateKey = sys_get_temp_dir() . '/hv_ai_' . md5($ip);
$now     = time();
$hits    = file_exists($rateKey) ? array_filter(json_decode(file_get_contents($rateKey),true)??[], fn($t)=>$now-$t<60) : [];
if (count($hits) >= 30) { http_response_code(429); echo json_encode(['error'=>'Quá nhiều yêu cầu']); exit; }
$hits[] = $now;
file_put_contents($rateKey, json_encode(array_values($hits)));

// Parse body
$b        = json_decode(file_get_contents('php://input'), true) ?: [];
$messages = $b['messages'] ?? [];
$system   = $b['system']   ?? '';
$site_id  = trim($b['site_id'] ?? '');

if (empty($messages)) { echo json_encode(['error'=>'Thiếu messages']); exit; }

// ── RAG: Tìm dữ liệu nội bộ ──────────────────────────────────
$rag_context = '';
if ($site_id) {
    try {
        require_once __DIR__ . '/db.php';
        $db = db();

        // 1. Lấy thông tin site + description_long
        $s = $db->prepare("SELECT name, address_new, description_short, description_long FROM heritage_sites WHERE id=:id LIMIT 1");
        $s->execute([':id' => $site_id]);
        $site = $s->fetch();

        if ($site) {
            $rag_context .= "=== THÔNG TIN DI TÍCH ===\n";
            $rag_context .= "Tên: " . $site['name'] . "\n";
            $rag_context .= "Địa chỉ: " . $site['address_new'] . "\n";
            if ($site['description_short']) {
                $rag_context .= "Giới thiệu: " . $site['description_short'] . "\n";
            }
            // description_long — strip HTML, giới hạn 600 ký tự
            if ($site['description_long']) {
                $clean = strip_tags($site['description_long']);
                $clean = preg_replace('/\s+/', ' ', trim($clean));
                $rag_context .= "Nội dung chi tiết: " . mb_substr($clean, 0, 600) . "\n";
            }
        }

        // 2. Lấy transcript các điểm nghe
        $t = $db->prepare("
            SELECT title, short_description, transcript, tts_intro
            FROM audio_points
            WHERE site_id=:id AND status='active' AND (transcript IS NOT NULL OR short_description IS NOT NULL)
            ORDER BY order_index ASC
            LIMIT 5
        ");
        $t->execute([':id' => $site_id]);
        $points = $t->fetchAll();

        if ($points) {
            $rag_context .= "\n=== NỘI DUNG THUYẾT MINH ===\n";
            foreach ($points as $p) {
                $rag_context .= "\n[" . $p['title'] . "]\n";
                if ($p['short_description']) $rag_context .= $p['short_description'] . "\n";
                if ($p['transcript']) {
                    $tx = mb_substr(trim($p['transcript']), 0, 400);
                    $rag_context .= $tx . "\n";
                }
            }
        }

        // Giới hạn tổng context
        $rag_context = mb_substr($rag_context, 0, MAX_CONTEXT * 3); // ~3 chars/token

    } catch (Exception $e) {
        // Không có DB → dùng system prompt gốc
        $rag_context = '';
    }
}

// ── BUILD SYSTEM PROMPT ──────────────────────────────────────
$full_system = "Bạn là trợ lý AI thuyết minh cho Heritage Voice — ứng dụng audio tour di sản văn hoá Việt Nam.\n";
$full_system .= "Hướng dẫn: Trả lời ngắn gọn 2-4 câu bằng tiếng Việt tự nhiên. TUYỆT ĐỐI không dùng markdown, không dùng **, ##, gạch đầu dòng. Chỉ viết văn xuôi thông thường.\n";
$full_system .= "Nếu không có thông tin trong dữ liệu bên dưới, hãy trả lời dựa trên kiến thức chung nhưng thông báo rõ.\n\n";

if ($rag_context) {
    $full_system .= $rag_context;
} elseif ($system) {
    $full_system .= $system;
}

// ── GỌI CLAUDE ───────────────────────────────────────────────
$payload = json_encode([
    'model'      => CLAUDE_MODEL,
    'max_tokens' => MAX_TOKENS,
    'system'     => $full_system,
    'messages'   => $messages,
], JSON_UNESCAPED_UNICODE);

$ch = curl_init('https://api.anthropic.com/v1/messages');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_POSTFIELDS     => $payload,
    CURLOPT_HTTPHEADER     => [
        'Content-Type: application/json',
        'x-api-key: ' . CLAUDE_API_KEY,
        'anthropic-version: 2023-06-01',
    ],
    CURLOPT_TIMEOUT => 30,
]);

$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if (!$response) { http_response_code(500); echo json_encode(['error'=>'Lỗi kết nối Claude API']); exit; }

http_response_code($httpCode);
echo $response;
