<?php
require_once 'db.php';

// Atur header dan timeout untuk long-polling/stream
header('Content-Type: text/html; charset=utf-8');
header('Cache-Control: no-cache');
set_time_limit(0); // Unlimited execution time for scanner
ob_implicit_flush(true);
while (ob_get_level()) ob_end_flush();

function stream_log($msg, $type = 'info') {
    $color = '#333';
    if($type == 'error') $color = 'red';
    if($type == 'success') $color = 'green';
    if($type == 'warn') $color = 'orange';
    echo "<p style='color: {$color}; font-family: monospace; margin: 5px 0;'>[".date('H:i:s')."] {$msg}</p>";
    flush();
}

try {
    stream_log("=== MULAI SCANNER KATEGORI BERITA ===", "info");

    // Ambil berita yang belum dikategorikan
    $stmt = $pdo->prepare("SELECT b.id, b.judul, b.cuplikan, b.instansi_id, i.api_key_ai, i.ai_agent, i.ai_model 
                           FROM berita b 
                           JOIN instansi i ON b.instansi_id = i.id 
                           WHERE b.kategori_berita IS NULL OR b.kategori_berita = ''");
    $stmt->execute();
    $berita_list = $stmt->fetchAll(PDO::FETCH_ASSOC);

    if (empty($berita_list)) {
        stream_log("Semua berita sudah memiliki kategori.", "success");
        exit;
    }

    $total = count($berita_list);
    stream_log("Ditemukan {$total} berita yang belum terkategori.", "warn");

    $count = 0;
    foreach ($berita_list as $b) {
        $count++;
        stream_log("[$count/$total] Memproses ID {$b['id']} - " . substr($b['judul'], 0, 50) . "...");

        $api_key = trim($b['api_key_ai']);
        $ai_agent = trim($b['ai_agent'] ?? 'Groq');
        $ai_model = trim($b['ai_model'] ?? 'llama3-70b-8192');

        if (empty($api_key)) {
            stream_log("   -> Skip: API Key tidak tersedia untuk instansi ID {$b['instansi_id']}", "error");
            continue;
        }

        $system_prompt = "Anda adalah asisten AI pengkategorian berita.\n";
        $system_prompt .= "Tugas Anda adalah menentukan kategori dari berita yang diberikan berdasarkan Judul dan Isi.\n";
        $system_prompt .= "Pilih SATU dari kategori berikut ini:\n";
        $system_prompt .= "- Infrastruktur\n- Pelayanan Publik\n- Pendidikan\n- Kesehatan\n- Sosial\n- Keamanan\n- Politik\n- Lingkungan\n- Ekonomi\n- Lainnya\n\n";
        $system_prompt .= "Balas HANYA dengan JSON berikut (tanpa ada tambahan teks apapun):\n";
        $system_prompt .= "{\n\"kategori\":\"Kategori Terpilih\"\n}";

        $user_prompt = "Judul: '{$b['judul']}'\nIsi: '{$b['cuplikan']}'";

        $headers = [
            'Content-Type: application/json',
            'Authorization: Bearer ' . $api_key
        ];

        $data = [
            "model" => $ai_model,
            "messages" => [
                ["role" => "system", "content" => $system_prompt],
                ["role" => "user", "content" => $user_prompt]
            ],
            "temperature" => 0.1
        ];

        $api_url = "https://api.groq.com/openai/v1/chat/completions";
        if ($ai_agent === 'KoboiLLM') {
            $api_url = "https://api.koboillm.com/v1/chat/completions";
        }

        $ch = curl_init($api_url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
        curl_setopt($ch, CURLOPT_TIMEOUT, 15);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        
        $response = curl_exec($ch);
        curl_close($ch);

        $kategori_ai = 'Lainnya'; // Default

        if ($response) {
            $res_json = json_decode($response, true);
            $raw_ai = $res_json['choices'][0]['message']['content'] ?? '';
            
            if (preg_match('/\{[\s\S]*\}/', str_replace(['```json', '```'], '', $raw_ai), $matches)) {
                $hasil_ai = json_decode($matches[0], true);
                if ($hasil_ai && isset($hasil_ai['kategori'])) {
                    $kategori_ai = trim($hasil_ai['kategori']);
                }
            }
        } else {
             stream_log("   -> Error AI response/Timeout.", "error");
        }

        // Update DB
        $update = $pdo->prepare("UPDATE berita SET kategori_berita = ? WHERE id = ?");
        if ($update->execute([$kategori_ai, $b['id']])) {
            stream_log("   -> Kategori: {$kategori_ai}", "success");
        } else {
            stream_log("   -> Gagal update DB", "error");
        }

        // Jeda 3 detik agar aman dari limit Groq Gratisan (Max ~30 request per menit)
        sleep(3);
    }

    stream_log("=== SCANNER SELESAI ===", "info");

} catch (Exception $e) {
    stream_log("Error Server: " . $e->getMessage(), "error");
}
?>
