<?php
session_start();
header('Content-Type: application/json');

include '../../config/database.php';
include '../../llm/api/koneksi_gemini.php';

// Validasi request method
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    echo json_encode(['error' => 'Metode request tidak diizinkan.']); exit;
}

// Security: Hanya PRO dan Admin — ambil dari DB (session tidak menyimpan status_akun)
if (!isset($_SESSION['user_id'])) {
    echo json_encode(['error' => 'Sesi tidak valid, silakan login ulang.']); exit;
}
$_uid_cek = $_SESSION['user_id'];
$_stmt_cek = mysqli_prepare($conn, "SELECT status_akun, role FROM users WHERE id = ?");
mysqli_stmt_bind_param($_stmt_cek, "s", $_uid_cek);
mysqli_stmt_execute($_stmt_cek);
$_data_cek = mysqli_fetch_assoc(mysqli_stmt_get_result($_stmt_cek));
mysqli_stmt_close($_stmt_cek);

$status_akun = strtolower(trim($_data_cek['status_akun'] ?? 'free'));
$role = strtolower(trim($_data_cek['role'] ?? 'siswa'));

if ($status_akun !== 'pro' && $role !== 'admin') {
    echo json_encode(['error' => 'MOHON MAAF, Eksekusi Autokoding ditolak. Fitur ini HANYA untuk pengguna Akun PRO.']); 
    exit;
}

$inputRaw = file_get_contents('php://input');
$input    = json_decode($inputRaw, true);

if (!isset($input['message']) || empty(trim($input['message']))) {
    echo json_encode(['error' => 'Pesan tidak valid atau kosong.']); exit;
}

$userMsg   = trim($input['message']);
$phase     = $input['phase']      ?? 'PLANNING';
$history   = $input['history']    ?? [];
$sessionId = isset($input['session_id'])
           ? preg_replace('/[^a-zA-Z0-9_-]/', '', $input['session_id'])
           : 'default_session';
$dbMode = $input['db_mode'] ?? 'json';
if (!in_array($dbMode, ['json', 'mysql', 'excel', 'vba'])) $dbMode = 'json';

// =========================================================================
// HISTORY CONTEXT
// =========================================================================
$historyText = '';
foreach ($history as $h) {
    $role         = strtoupper($h['role']);
    $historyText .= "[$role]: " . $h['content'] . "\n\n";
}

// =========================================================================
// PATH SESI (PENYIMPANAN KOMPILASI BACKGROUND)
// =========================================================================
$baseProjectsDir = realpath(__DIR__ . '/../../autokoding/projects/');
if (!$baseProjectsDir) {
    mkdir(__DIR__ . '/../../autokoding/projects/', 0777, true);
    $baseProjectsDir = realpath(__DIR__ . '/../../autokoding/projects/');
}
$projectDir   = $baseProjectsDir . DIRECTORY_SEPARATOR . $sessionId . DIRECTORY_SEPARATOR;
$manifestFile = $projectDir . '_manifest.json';
$planFile     = $projectDir . '_plan.json';

// Baca manifest & plan
$manifest = [];
if (file_exists($manifestFile)) {
    $manifest = json_decode(file_get_contents($manifestFile), true) ?: [];
}
$plannedFiles = [];
if (file_exists($planFile)) {
    $plannedFiles = json_decode(file_get_contents($planFile), true) ?: [];
}

// Hitung sisa file
$doneNormalized  = array_map('strtolower', array_map('trim', $manifest));
$remainingFiles  = [];
foreach ($plannedFiles as $pf) {
    if (!in_array(strtolower(trim($pf)), $doneNormalized)) {
        $remainingFiles[] = $pf;
    }
}
$nextFile     = $remainingFiles[0] ?? null;
$totalPlanned = count($plannedFiles);
$totalDone    = count($manifest);

// =========================================================================
// SYSTEM PROMPTS — DUAL MODE (JSON / MySQL)
// =========================================================================
if ($dbMode === 'json') {
    // ==================== MODE JSON STORAGE ====================
    $planningSystem = "Anda adalah Aistem Auto Koding, AI Arsitek Web & IoT.\nTugas: Analisis permintaan user dan rancang sistem yang sesuai.\n\nPERATURAN PENTING:\n1. SESUAIKAN TINGKAT KOMPLEKSITAS:\n   - Jika user HANYA meminta tampilan/UI/desain, buatkan saja file frontend (misal: index.html, style.css, script.js). TANPA helper/DataStore.php.\n   - Jika user meminta sistem lengkap/dinamis dengan data (contoh: buat aplikasi CRUD, sistem informasi), gunakan JSON Storage.\n2. ATURAN JSON STORAGE (WAJIB):\n   - JANGAN PERNAH buat file database.sql atau config/database.php.\n   - Data disimpan di folder data/ dalam format JSON (misal: data/users.json, data/products.json).\n   - File helper/DataStore.php SUDAH DISEDIAKAN OTOMATIS oleh sistem. JANGAN masukkan ke daftar file.\n   - Untuk akses data, cukup: include 'helper/DataStore.php'; lalu gunakan fungsi: loadData(), addRecord(), updateRecord(), deleteRecord(), findById(), searchData(), verifyLogin().\n3. STANDAR LOGIN: File data/users.json sudah berisi akun default username 'admin' password 'admin'. TIDAK PERLU buat file users.json di rencana.\n4. Jelaskan Arsitektur & Teknologi secara singkat namun jelas.\n5. Tentukan warna (HEX) dan font. Prioritaskan desain modern, premium, dan animasi halus.\n6. Jangan berikan kode sekarang, hanya konsep dan daftar file.\n\nFORMAT WAJIB DI AKHIR:\n[RENCANA_FILE: [\"file_pertama.ekstensi\", \"file_kedua.ekstensi\"]]\nTawarkan persetujuan ke user (IYA/TIDAK).";
} elseif ($dbMode === 'excel') {
    // ==================== MODE GOOGLE SHEETS ====================
    $planningSystem = "Anda adalah Aistem Auto Koding, AI Arsitek Web & IoT.\nTugas: Analisis permintaan user dan rancang sistem berbasis Google Sheets sebagai database.\n\nPERATURAN PENTING:\n1. DATABASE MENGGUNAKAN GOOGLE SHEETS (WAJIB):\n   - JANGAN PERNAH buat file database.sql, config/database.php, atau folder data/*.json.\n   - File helper/SheetsAPI.php dan config/sheets_config.php SUDAH DISEDIAKAN OTOMATIS. JANGAN masukkan ke daftar file.\n   - Untuk akses data, include 'helper/SheetsAPI.php' lalu gunakan fungsi: sheetsLoad(), sheetsAdd(), sheetsUpdate(), sheetsDelete(), sheetsFind(), sheetsLogin().\n2. STANDAR LOGIN: Sheet 'users' sudah berisi akun default username 'admin' password 'admin'. TIDAK PERLU buat file konfigurasi users.\n3. SESUAIKAN KOMPLEKSITAS: Jika hanya UI/desain, buat frontend saja tanpa backend Sheets.\n4. Jelaskan Arsitektur & Teknologi secara singkat namun jelas.\n5. Tentukan warna (HEX) dan font. Prioritaskan desain modern, premium, dan animasi halus.\n6. Jangan berikan kode sekarang, hanya konsep dan daftar file.\n\nFORMAT WAJIB DI AKHIR:\n[RENCANA_FILE: [\"file_pertama.ekstensi\", \"file_kedua.ekstensi\"]]\nTawarkan persetujuan ke user (IYA/TIDAK).";

} elseif ($dbMode === 'vba') {
    // ==================== MODE EXCEL VBA APP ====================
    $planningSystem = "Anda adalah Aistem Auto Koding, AI Arsitek Aplikasi Excel VBA.\nTugas: Analisis permintaan user dan rancang aplikasi desktop Excel VBA yang sesuai.\n\nPERATURAN PENTING:\n1. PLATFORM: Aplikasi BUKAN web/PHP. Output adalah kode VBA yang dijalankan di Microsoft Excel.\n2. FORMAT FILE WAJIB:\n   - Setiap module VBA disimpan sebagai file .bas (misal: Module_Main.bas, Module_Data.bas)\n   - File VBAHelper.bas SUDAH DISEDIAKAN OTOMATIS. JANGAN masukkan ke daftar.\n   - File README_SETUP.md SUDAH DISEDIAKAN OTOMATIS. JANGAN masukkan ke daftar.\n   - JANGAN buat file .php, .html, .sql, .css, atau .js.\n3. ARSITEKTUR VBA:\n   - Data disimpan di sheet Excel (bukan database eksternal)\n   - Gunakan UserForm untuk input data\n   - Gunakan fungsi dari VBAHelper.bas: GetLastRow(), GenerateID(), FormatHeader(), FormatTabel(), FormatRupiah(), Terbilang(), PrintArea(), PreviewCetak(), EksporPDF(), InitSheet(), dll\n   - Setiap module memiliki satu tanggung jawab (Main, Data, Cetak, Laporan, dll)\n4. STANDAR DESAIN:\n   - Warna tema: gunakan konstanta dari VBAHelper (CLR_PRIMARY, CLR_HEADER, dll)\n   - UserForm harus rapi, terstruktur, dan user-friendly\n5. Jelaskan alur aplikasi dan daftar module/sheet yang dibutuhkan.\n6. Jangan berikan kode sekarang, hanya konsep dan daftar file.\n\nFORMAT WAJIB DI AKHIR:\n[RENCANA_FILE: [\"Module_Xxx.bas\", \"Module_Yyy.bas\"]]\nTawarkan persetujuan ke user (IYA/TIDAK).";
} else {
    // ==================== MODE MYSQL ====================
    $planningSystem = "Anda adalah Aistem Auto Koding, AI Arsitek Web & Database MySQL.\nTugas: Analisis permintaan user dan rancang sistem yang sesuai.\n\nPERATURAN PENTING:\n1. SESUAIKAN TINGKAT KOMPLEKSITAS:\n   - Jika user HANYA meminta tampilan/UI/desain, JANGAN buat database.sql atau backend PHP. Buatkan saja file frontend.\n   - Jika user meminta sistem dinamis/CRUD dengan database, WAJIBKAN urutan file: database.sql -> config/database.php -> style.css -> index.php -> Fitur lainnya.\n2. STRUKTUR DATABASE (WAJIB JELAS): Pada penjelasan arsitektur, jabarkan struktur tabel dan kolom yang akan dibuat di `database.sql` agar fase eksekusi tidak bingung.\n3. KONSISTENSI UI & FUNGSI CRUD (SANGAT PENTING): Rencanakan secara spesifik apakah form Tambah/Edit/Hapus menggunakan halaman terpisah (tambah.php, edit.php, hapus.php) atau Modal/Popup. Pastikan semua file yang dibutuhkan dimasukkan ke daftar agar tombol tidak mati.\n4. STANDAR LOGIN & DATABASE: Untuk fitur login, buat default akun (username: 'admin', password: 'admin') di `database.sql`. Gunakan PLAIN-TEXT untuk password.\n5. Desain & Arsitektur: Jelaskan alur singkat dan teknologi. Tentukan penggunaan CSS (CDN seperti Tailwind/Bootstrap atau CSS murni). Pastikan desain premium dan responsif.\n6. JANGAN berikan kode sekarang, hanya konsep dan daftar file.\n\nFORMAT WAJIB DI AKHIR:\n[RENCANA_FILE: [\"database.sql\", \"config/database.php\", \"style.css\", \"index.php\"]]\nTawarkan persetujuan ke user (IYA/TIDAK).";
}

$progressCtx = '';
if ($phase === 'EXECUTION' && $totalPlanned > 0) {
    $doneLine      = !empty($manifest)        ? implode(', ', $manifest)        : '(belum ada)';
    $remainingLine = !empty($remainingFiles)  ? implode(', ', $remainingFiles)  : '(semua sudah selesai)';
    $progressCtx   = "\n\n=== STATUS PROYEK ===\n"
                   . "Total Tugas   : $totalPlanned file\n"
                   . "Selesai       : $doneLine\n"
                   . "Belum dibuat  : $remainingLine\n"
                   . ($nextFile ? "FOKUS KERJAKAN FILE INI: $nextFile\n" : "SEMUA FILE SELESAI.\n")
                   . "=====================";
}

if ($dbMode === 'json') {
    $executionSystem = "Anda adalah Aistem Auto Koding, AI Eksekutor Kode.\nTugas: Tulis kode yang SIAP PAKAI, AMAN, dan SESUAI arsitektur.\n\nPERATURAN:\n1. Fokus HANYA pada file: \"FOKUS KERJAKAN FILE INI\".\n2. DATA STORAGE MENGGUNAKAN JSON (WAJIB!):\n   - File helper/DataStore.php SUDAH ADA di project (auto-inject). Cukup include saja.\n   - Cara include: include __DIR__ . '/helper/DataStore.php'; (sesuaikan path relatif)\n   - FUNGSI YANG TERSEDIA:\n     * loadData('collection') - ambil semua data\n     * saveData('collection', \$array) - simpan data\n     * findById('collection', \$id) - cari 1 record\n     * addRecord('collection', ['field'=>'value']) - tambah (auto id)\n     * updateRecord('collection', \$id, ['field'=>'value']) - update\n     * deleteRecord('collection', \$id) - hapus\n     * searchData('collection', 'field', 'value') - cari by field\n     * searchLike('collection', 'field', 'keyword') - cari mengandung kata\n     * countRecords('collection') - hitung jumlah\n     * paginate('collection', \$page, \$perPage) - pagination\n     * verifyLogin(\$username, \$password) - cek login\n     * initData('collection', [...]) - buat data default jika belum ada\n   - JANGAN PERNAH gunakan mysqli, PDO, mysql_connect, atau query SQL apapun.\n   - JANGAN buat file config/database.php.\n3. LOGIN: Gunakan verifyLogin(\$username, \$password). Data default sudah ada.\n4. Desain UI (HTML/CSS) harus modern, responsif, dan premium.\n5. Tulis kode UTUH (No placeholders).\n6. Bungkus dengan: [FILE: nama_file.ekstensi] ...kode... [/FILE].\n7. Berikan penanda: [ADA_LANJUTAN] jika belum selesai, [TUGAS_SELESAI] jika sudah semua.";
} elseif ($dbMode === 'excel') {
    $executionSystem = "Anda adalah Aistem Auto Koding, AI Eksekutor Kode.\nTugas: Tulis kode yang SIAP PAKAI, AMAN, dan SESUAI arsitektur Google Sheets.\n\nPERATURAN:\n1. Fokus HANYA pada file: \"FOKUS KERJAKAN FILE INI\".\n2. DATA STORAGE MENGGUNAKAN GOOGLE SHEETS (WAJIB!):\n   - File helper/SheetsAPI.php dan config/sheets_config.php SUDAH ADA (auto-inject). Cukup include saja.\n   - Cara include: include __DIR__ . '/helper/SheetsAPI.php'; (sesuaikan path relatif)\n   - FUNGSI YANG TERSEDIA:\n     * sheetsLoad('sheet') - ambil semua data dari sheet\n     * sheetsAdd('sheet', ['field'=>'value']) - tambah record baru (auto id)\n     * sheetsUpdate('sheet', \$id, ['field'=>'value']) - update record\n     * sheetsDelete('sheet', \$id) - hapus record\n     * sheetsFind('sheet', \$id) - cari by ID\n     * sheetsSearch('sheet', 'field', 'value') - cari by field\n     * sheetsSearchLike('sheet', 'field', 'keyword') - cari mengandung kata\n     * sheetsCount('sheet') - hitung jumlah record\n     * sheetsPaginate('sheet', \$page, \$perPage) - pagination\n     * sheetsLogin(\$username, \$password) - cek login dari sheet users\n   - JANGAN PERNAH gunakan mysqli, PDO, DataStore, atau query SQL apapun.\n   - JANGAN buat file config/database.php atau folder data/*.json.\n   - Nama 'sheet' = nama tab di Google Spreadsheet (misal: 'siswa', 'produk', 'users').\n3. LOGIN: Gunakan sheetsLogin(\$username, \$password). Akun default admin/admin sudah ada di sheet 'users'.\n4. Desain UI (HTML/CSS) harus modern, responsif, dan premium.\n5. Tulis kode UTUH (No placeholders).\n6. Bungkus dengan: [FILE: nama_file.ekstensi] ...kode... [/FILE].\n7. Berikan penanda: [ADA_LANJUTAN] jika belum selesai, [TUGAS_SELESAI] jika sudah semua.";
} elseif ($dbMode === 'vba') {
    $executionSystem = "Anda adalah Aistem Auto Koding, AI Eksekutor Kode VBA.\nTugas: Tulis kode VBA yang SIAP PAKAI, LENGKAP, dan SESUAI arsitektur.\n\nPERATURAN:\n1. Fokus HANYA pada file: \"FOKUS KERJAKAN FILE INI\".\n2. PLATFORM EXCEL VBA (WAJIB):\n   - Tulis kode Visual Basic for Applications (VBA) murni — bukan PHP, bukan HTML.\n   - Awali setiap file .bas dengan: Attribute VB_Name = \"NamaModule\"\n   - File VBAHelper.bas SUDAH ADA (auto-inject). Gunakan fungsinya langsung.\n   - FUNGSI VBAHELPER YANG TERSEDIA:\n     * GetLastRow(ws) - baris terakhir berisi data\n     * GetLastCol(ws) - kolom terakhir\n     * GenerateID(prefix, ws) - generate ID otomatis (TRX-001)\n     * TanggalSekarang() - tanggal format dd/mm/yyyy\n     * TanggalWaktu() - tanggal+waktu\n     * ShowMsg(msg, tipe) - pesan info/sukses/error\n     * KonfirmasiHapus(nama) - dialog konfirmasi hapus\n     * ClearForm(frm) - reset semua field UserForm\n     * FormatHeader(ws, row, cols) - format header tabel\n     * FormatTabel(ws, start, end, cols) - zebra striping\n     * AutoFitKolom(ws) - auto-fit lebar kolom\n     * PrintArea(ws, area) - cetak area tertentu\n     * PreviewCetak(ws, area) - preview cetak\n     * EksporPDF(ws, path) - ekspor ke PDF\n     * CariData(ws, keyword, col) - cari data\n     * FormatRupiah(angka) - format Rp 150.000\n     * Terbilang(angka) - konversi ke teks Indonesia\n     * InitSheet(ws, headers) - inisialisasi header sheet\n3. DATA: Disimpan di sheet Excel. Gunakan Worksheets(\"NamaSheet\") untuk akses sheet.\n4. UserForm: Buat UserForm yang rapi dengan label, textbox, combobox, dan tombol aksi.\n5. Tulis kode UTUH dan LENGKAP — jangan potong di tengah.\n6. Bungkus dengan: [FILE: NamaModule.bas] ...kode... [/FILE].\n7. Berikan penanda: [ADA_LANJUTAN] jika belum selesai, [TUGAS_SELESAI] jika sudah semua.";
} else {
    $executionSystem = "Anda adalah Aistem Auto Koding, AI Eksekutor Kode MySQL PHP.\nTugas: Tulis kode PHP/MySQL yang SIAP PAKAI, AMAN, dan FULLY FUNCTIONAL.\n\nPERATURAN:\n1. Fokus HANYA pada file: \"FOKUS KERJAKAN FILE INI\".\n2. SINKRONISASI DATABASE WAJIB: Pastikan semua query tabel dan kolom 100% cocok dengan struktur `database.sql` pada bagian 'DATABASE & CONNECTION REFERENCE'.\n3. KONEKSI DATABASE: Gunakan `include 'config/database.php';` (atau path yang sesuai) dan gunakan variabel koneksi yang ada di dalamnya. WAJIB gunakan Prepared Statements (mysqli).\n4. SINKRONISASI UI, CSS, DAN LOGIKA CRUD (SANGAT KRITIKAL):\n   - HTML DAN CSS WAJIB SINKRON! Class dan ID pada tombol, form, tabel, dan layout di HTML HARUS sama persis dengan yang dibuat di file CSS. Jangan sampai UI hancur atau berantakan.\n   - TOMBOL HARUS BERFUNGSI! Tombol Tambah, Edit, dan Hapus tidak boleh hanya hiasan. Jika link ke file terpisah (misal `href=\"edit.php?id=...\"`), pastikan format URL benar dan filenya ada di rencana. Jika modal, pastikan atribut modal/JS sinkron.\n   - Tambah (Create): Form method=\"POST\" wajib memiliki action yang benar dan input `name` sesuai kolom database.\n   - Tampil (Read): Jika data kosong, tampilkan pesan \"Belum ada data\".\n   - Edit (Update): Form edit wajib menampilkan data lama (value=\"...\"). Query UPDATE memakai WHERE id=?.\n   - Hapus (Delete): Aksi hapus (DELETE WHERE id=?) harus berjalan lancar.\n5. ATURAN LOGIN/AUTENTIKASI: JANGAN gunakan password hash. Gunakan pengecekan PLAIN-TEXT untuk kolom password.\n6. Desain UI (HTML/CSS): Wajib modern, responsif, rapi, dan premium.\n7. Tulis kode UTUH (No placeholders). Logika PHP backend (isset(\$_POST), isset(\$_GET)) wajib diletakkan di bagian paling atas file sebelum doctype/tag HTML.\n8. Bungkus dengan: [FILE: nama_file.ekstensi] ...kode... [/FILE].\n9. Berikan penanda: [ADA_LANJUTAN] jika belum selesai, [TUGAS_SELESAI] jika sudah semua.";
}

if ($phase === 'EXECUTION') {
    $executionSystem .= $progressCtx;
}

$systemPrompt = ($phase === 'EXECUTION') ? $executionSystem : $planningSystem;

// =========================================================================
// AUTO-INJECT: DataStore.php + data/users.json (hanya mode JSON)
// =========================================================================
if ($phase === 'EXECUTION') {
    if (!is_dir($projectDir)) mkdir($projectDir, 0777, true);
    $helperDir = $projectDir . 'helper' . DIRECTORY_SEPARATOR;
    if (!is_dir($helperDir)) mkdir($helperDir, 0777, true);

    if ($dbMode === 'json') {
        // Inject helper/DataStore.php
        $helperDest = $helperDir . 'DataStore.php';
        if (!file_exists($helperDest)) {
            $templateSrc = realpath(__DIR__ . '/../templates/DataStore.php');
            if ($templateSrc && file_exists($templateSrc)) copy($templateSrc, $helperDest);
            if (!in_array('helper/DataStore.php', $manifest)) {
                $manifest[] = 'helper/DataStore.php';
                $doneNormalized[] = 'helper/datastore.php';
            }
        }
        // Inject data/users.json
        $dataDir = $projectDir . 'data' . DIRECTORY_SEPARATOR;
        if (!is_dir($dataDir)) mkdir($dataDir, 0777, true);
        $usersJsonPath = $dataDir . 'users.json';
        if (!file_exists($usersJsonPath)) {
            $defaultUsers = ['collection'=>'users','updated_at'=>date('Y-m-d H:i:s'),'total'=>1,'records'=>[
                ['id'=>1,'username'=>'admin','password'=>'admin','role'=>'admin','nama'=>'Administrator']
            ]];
            file_put_contents($usersJsonPath, json_encode($defaultUsers, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
        }

    } elseif ($dbMode === 'excel') {
        // Inject helper/SheetsAPI.php
        $sheetsHelperDest = $helperDir . 'SheetsAPI.php';
        if (!file_exists($sheetsHelperDest)) {
            $sheetsTemplateSrc = realpath(__DIR__ . '/../templates/SheetsAPI.php');
            if ($sheetsTemplateSrc && file_exists($sheetsTemplateSrc)) copy($sheetsTemplateSrc, $sheetsHelperDest);
            if (!in_array('helper/SheetsAPI.php', $manifest)) {
                $manifest[] = 'helper/SheetsAPI.php';
                $doneNormalized[] = 'helper/sheetsapi.php';
            }
        }
        // Inject config/sheets_config.php
        $cfgDir  = $projectDir . 'config' . DIRECTORY_SEPARATOR;
        if (!is_dir($cfgDir)) mkdir($cfgDir, 0777, true);
        $sheetsCfgDest = $cfgDir . 'sheets_config.php';
        if (!file_exists($sheetsCfgDest)) {
            $sheetsCfgSrc = realpath(__DIR__ . '/../templates/sheets_config.php');
            if ($sheetsCfgSrc && file_exists($sheetsCfgSrc)) copy($sheetsCfgSrc, $sheetsCfgDest);
            if (!in_array('config/sheets_config.php', $manifest)) {
                $manifest[] = 'config/sheets_config.php';
                $doneNormalized[] = 'config/sheets_config.php';
            }
        }
        // Inject AppScript.gs
        $gsDest = $projectDir . 'AppScript.gs';
        if (!file_exists($gsDest)) {
            $gsSrc = realpath(__DIR__ . '/../templates/AppScript.gs');
            if ($gsSrc && file_exists($gsSrc)) copy($gsSrc, $gsDest);
            if (!in_array('AppScript.gs', $manifest)) {
                $manifest[] = 'AppScript.gs';
                $doneNormalized[] = 'appscript.gs';
            }
        }
    } elseif ($dbMode === 'vba') {
        // Inject VBAHelper.bas
        $vbaHelperDest = $projectDir . 'VBAHelper.bas';
        if (!file_exists($vbaHelperDest)) {
            $vbaHelperSrc = realpath(__DIR__ . '/../templates/VBAHelper.bas');
            if ($vbaHelperSrc && file_exists($vbaHelperSrc)) copy($vbaHelperSrc, $vbaHelperDest);
            if (!in_array('VBAHelper.bas', $manifest)) {
                $manifest[] = 'VBAHelper.bas';
                $doneNormalized[] = 'vbahelper.bas';
            }
        }
        // Inject README_SETUP.md
        $readmeDest = $projectDir . 'README_SETUP.md';
        if (!file_exists($readmeDest)) {
            $readmeSrc = realpath(__DIR__ . '/../templates/README_VBA.md');
            if ($readmeSrc && file_exists($readmeSrc)) copy($readmeSrc, $readmeDest);
            if (!in_array('README_SETUP.md', $manifest)) {
                $manifest[] = 'README_SETUP.md';
                $doneNormalized[] = 'readme_setup.md';
            }
        }
    }

    // Update manifest
    file_put_contents($manifestFile, json_encode(array_values(array_unique($manifest)), JSON_PRETTY_PRINT));
}

// =========================================================================
// BANGUN FULL PROMPT EXECUTOR
// =========================================================================
$dbRef = "";

if ($dbMode === 'mysql') {
    $sqlFile = $projectDir . "database.sql";
    $cfgFile = $projectDir . "config/database.php";
    if (file_exists($sqlFile)) $dbRef .= "--- FILE: database.sql ---\n" . file_get_contents($sqlFile) . "\n\n";
    if (file_exists($cfgFile)) $dbRef .= "--- FILE: config/database.php ---\n" . file_get_contents($cfgFile) . "\n\n";
} elseif ($dbMode === 'excel') {
    $dbRef = "--- HELPER: SheetsAPI.php (SUDAH AUTO-INJECT) ---\nFile helper/SheetsAPI.php dan config/sheets_config.php sudah ada di project.\nFungsi: sheetsLoad(), sheetsAdd(), sheetsUpdate(), sheetsDelete(), sheetsFind(), sheetsSearch(), sheetsSearchLike(), sheetsCount(), sheetsPaginate(), sheetsLogin()\nNama sheet = nama tab Google Spreadsheet. Login default: username='admin', password='admin' (sudah ada di sheet 'users').\nFile AppScript.gs juga sudah ada untuk di-deploy user ke Google Apps Script.\n\n";
} elseif ($dbMode === 'vba') {
    $dbRef = "--- HELPER: VBAHelper.bas (SUDAH AUTO-INJECT) ---\nFile VBAHelper.bas sudah ada di project. Gunakan fungsinya langsung tanpa import ulang.\nFungsi tersedia: GetLastRow(), GetLastCol(), GenerateID(), TanggalSekarang(), TanggalWaktu(), ShowMsg(), KonfirmasiHapus(), ClearForm(), FormatHeader(), FormatTabel(), AutoFitKolom(), PrintArea(), PreviewCetak(), EksporPDF(), CariData(), FormatRupiah(), Terbilang(), InitSheet()\nKonstanta warna: CLR_PRIMARY, CLR_HEADER, CLR_SUCCESS, CLR_DANGER, CLR_ROW_ODD, CLR_ROW_EVEN\nFile README_SETUP.md juga sudah ada berisi panduan import ke Excel.\n\n";
} else {
    $dbRef = "--- HELPER: DataStore.php (SUDAH AUTO-INJECT) ---\nFile helper/DataStore.php sudah ada di project. Cukup include dan gunakan fungsi CRUD.\nFungsi: loadData(), saveData(), findById(), addRecord(), updateRecord(), deleteRecord(), searchData(), searchLike(), countRecords(), paginate(), verifyLogin(), initData()\nData login default: username='admin', password='admin' (di data/users.json)\n\n";
}

// Ambil pesan asli user (biasanya pesan pertama di history atau pesan saat ini jika baru mulai)
$originalGoal = '';
if (!empty($history)) {
    foreach ($history as $h) {
        if ($h['role'] === 'user') {
            $originalGoal = $h['content'];
            break; 
        }
    }
}
if (empty($originalGoal)) $originalGoal = $userMsg;

$full_prompt  = "### SYSTEM INSTRUCTION ###\n" . $systemPrompt . "\n##########################\n\n";
$full_prompt .= "### CORE PROJECT OBJECTIVE (DON'T FORGET THIS!) ###\n" . $originalGoal . "\n#################################################\n\n";

if (!empty($dbRef)) {
    $full_prompt .= "### DATABASE & CONNECTION REFERENCE (SYNC REQUIRED!) ###\n" . $dbRef . "#######################################################\n\n";
}

if (!empty($historyText)) {
    $full_prompt .= "### PROJECT PROGRESS & HISTORY ###\n" . $historyText . "##################################\n\n";
}
$full_prompt .= "### CURRENT TASK / NEXT STEP ###\n" . $userMsg . "\n################################";

// Instruksi LUNAK (bukan hard limit) agar AI tetap menulis kode lengkap dan berkualitas
$full_prompt .= "\n\n[CATATAN: Tulis kode yang efisien, terstruktur, dan tidak bertele-tele. Jangan potong kode di tengah jalan.]";

// Trim history agar tidak terlalu panjang (hemat input token)
if (strlen($historyText) > 1500) {
    $historyText = substr($historyText, -1500); // Ambil 1500 karakter terakhir saja
}

// =========================================================================
// TEMBAK KE GEMINI SECARA LANGSUNG (BYPASS, SETARA PRO EXPERT)
// =========================================================================
$resCfg = mysqli_query($conn, "SELECT nama_aplikasi FROM settings WHERE id = 1");
$cfg = mysqli_fetch_assoc($resCfg);

$jawaban = executeInternalLLM($full_prompt, null, 0.6, $conn, $cfg, 'gemini', $systemPrompt, $userMsg, $historyText);

if (strpos($jawaban, 'ERROR_JSON:') !== false || strpos($jawaban, 'ERROR:') !== false || strpos($jawaban, 'FAIL (HTTP') !== false || strpos($jawaban, 'PEMBERITAHUAN SISTEM:') !== false || strpos($jawaban, 'Sistem mendeteksi') !== false || strpos($jawaban, 'Akses internal') !== false) {
    $pesanElegan = "✨ **Mohon maaf, jaringan AI kami sedang sibuk.**\nKami sedang memproses banyak permintaan secara bersamaan. Silakan tunggu beberapa saat lalu coba kirimkan ulang pesan Anda. 🙏";
    echo json_encode(['reply' => $pesanElegan, 'status' => 'degraded']);
    exit;
}

// =========================================================================
// FASE PLANNING: Ekstrak [RENCANA_FILE:] dan simpan _plan.json
// =========================================================================
if ($phase === 'PLANNING') {
    if (preg_match('/\[RENCANA_FILE:\s*(\[.*?\])\]/s', $jawaban, $planMatch)) {
        $parsedPlan = json_decode($planMatch[1], true);
        if (is_array($parsedPlan) && !empty($parsedPlan)) {
            if (!is_dir($projectDir)) mkdir($projectDir, 0777, true);
            file_put_contents($planFile, json_encode(array_values(array_map('trim', $parsedPlan)), JSON_PRETTY_PRINT));
            $plannedFiles = $parsedPlan;
            $totalPlanned = count($plannedFiles);
        }
        $jawaban = trim(preg_replace('/\[RENCANA_FILE:\s*\[.*?\]\]/s', '', $jawaban));
    }
}

// =========================================================================
// INTERCEPT & SIMPAN FILE KE SERVER LOKAL
// =========================================================================
$savedFiles   = [];
$skippedFiles = [];
$pattern      = '/\[FILE:\s*([^\]]+)\](.*?)(?:\[\/FILE\]|(?=\[FILE:)|$)/is';

if (preg_match_all($pattern, $jawaban, $matches)) {
    if (!is_dir($projectDir)) mkdir($projectDir, 0777, true);

    foreach ($matches[1] as $idx => $filename) {
        $filename = ltrim(str_replace('\\', '/', trim($filename)), '/');
        
        // Keamanan: Cegah Path Traversal secara ketat
        if (strpos($filename, '../') !== false || strpos($filename, '..') !== false) {
            $jawaban .= "\n\n⚠️ **Sistem Peringatan:** AI mencoba menulis ke path di luar direktori proyek ($filename). Operasi dibatalkan untuk keamanan.";
            continue;
        }
        
        $content  = trim($matches[2][$idx]);
        if (empty($filename) || empty($content)) continue;

        // Pembersihan halusinasi markdown backticks
        $content = preg_replace('/^\s*```[a-zA-Z0-9]*\s*\n/i', '', $content);
        $content = preg_replace("/\n\s*```\s*$/", '', $content);
        $content = trim($content);

        // Verifikasi Sintaks sebelum simpan
        $v = verifyFileContent($filename, $content, $dbMode);
        if (!$v['valid']) {
            $jawaban .= "\n\n⚠️ **Peringatan Sintaks ($filename):** " . $v['error'];
            // Tetap simpan tapi beri peringatan, atau bisa di-abort jika mau lebih ketat
        }

        // Jangan save ulang kalau sudah di manifest (kecuali file yang gagal verifikasi sebelumnya mungkin?)
        if (in_array(strtolower(trim($filename)), $doneNormalized)) {
            $skippedFiles[] = $filename;
            continue;
        }

        $fullPath = $projectDir . $filename;
        $dir      = dirname($fullPath);
        if (!is_dir($dir)) mkdir($dir, 0777, true);

        file_put_contents($fullPath, $content);
        $savedFiles[]       = $filename;
        $manifest[]         = $filename;
        $doneNormalized[]   = strtolower(trim($filename));
    }

    if (!empty($savedFiles)) {
        file_put_contents($manifestFile, json_encode(array_values(array_unique($manifest)), JSON_PRETTY_PRINT));
    } else {
        // FAIL-SAFE: Jika fase eksekusi tapi tidak ada file yang tersimpan
        if ($phase === 'EXECUTION') {
            $jawaban .= "\n\n⚠️ **Sistem Peringatan:** AI tidak memberikan blok kode `[FILE: ...]` yang valid untuk tugas ini. Silakan ketik 'Coba lagi' atau periksa instruksi Anda.";
        }
    }
}

// Hitung ulang progress sisa file
$remainingAfter = [];
$doneAfterNorm  = array_map('strtolower', array_map('trim', $manifest));
foreach ($plannedFiles as $pf) {
    if (!in_array(strtolower(trim($pf)), $doneAfterNorm)) {
        $remainingAfter[] = $pf;
    }
}
$nextFileAfter    = $remainingAfter[0] ?? null;
$totalDoneAfter   = count($manifest);
$allPlanDone      = ($totalPlanned > 0 && empty($remainingAfter));

// =========================================================================
// TAMPILAN RESPONS BALASAN (BEAUTIFIER)
// =========================================================================
if (!empty($savedFiles)) {
    $jawaban = trim(preg_replace($pattern, '', $jawaban));
    $suksesMsg  = "✔️ **File Proyek berhasil dikompilasi ke server!** (" . $totalDoneAfter . "/" . $totalPlanned . "):\n\n";
    foreach ($savedFiles as $f) {
        $fileUrl    = 'api/download_file.php?session_id=' . $sessionId . '&file=' . urlencode($f);
        $suksesMsg .= "<a href=\"$fileUrl\" target=\"_blank\" style=\"display:inline-block;padding:6px 12px;background:rgba(26,115,232,0.1);border:1px solid rgba(26,115,232,0.3);border-radius:8px;color:#1a73e8;text-decoration:none;margin-bottom:5px;font-weight:500;font-size:0.9rem;\"><i class=\"bi bi-file-earmark-code\"></i> $f <span style=\"font-size:0.75rem;opacity:0.7;\">(download)</span></a><br>\n";
    }
    if (!empty($remainingAfter)) {
        $suksesMsg .= "\n📋 **Tersisa " . count($remainingAfter) . " file lagi:** " . implode(', ', $remainingAfter);
    }
    $jawaban = $suksesMsg . "\n\n" . trim($jawaban);
}

echo json_encode([
    'reply'           => $jawaban,
    'status'          => 'success',
    'next_file'       => $nextFileAfter,
    'remaining_files' => $remainingAfter,
    'total_planned'   => $totalPlanned,
    'total_done'      => $totalDoneAfter,
    'all_plan_done'   => $allPlanDone,
]);

/**
 * Verifikasi sintaks file (PHP Lint / SQL Basic)
 */
function verifyFileContent($filename, $content, $dbMode = 'json') {
    $extension = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
    $isValid = true;
    $errorMsg = '';

    if ($extension === 'php') {
        $tmpFile = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'ak_check_' . uniqid() . '.php';
        file_put_contents($tmpFile, $content);
        
        // Deteksi PHP Binary
        $phpBinary = 'php';
        if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
            $winPaths = ['C:\xampp\php\php.exe', 'C:\php\php.exe'];
            foreach ($winPaths as $wp) {
                if (file_exists($wp)) { $phpBinary = $wp; break; }
            }
        }

        $output = [];
        $returnVar = 0;
        
        // HOSTING SAFEGUARD: Cek apakah fungsi exec() diizinkan di server
        if (function_exists('exec')) {
            exec("\"$phpBinary\" -l " . escapeshellarg($tmpFile) . " 2>&1", $output, $returnVar);
            
            if ($returnVar !== 0) {
                $isValid = false;
                $errorMsg = $output[0] ?? 'Syntax error detected.';
                // Bersihkan path file temporary dari pesan error agar user tidak bingung
                $errorMsg = str_replace($tmpFile, $filename, $errorMsg);
            }
        } else {
            // Jika exec di-disable hosting (sangat umum), kita skip linting secara halus 
            // agar sistem Autokoding tidak crash, karena PHP syntax error tidak merusak file lainnya.
        }
        
        if (file_exists($tmpFile)) unlink($tmpFile);
        
        // Warning: JSON mode tapi pakai MySQL
        if ($dbMode === 'json' && $isValid) {
            if (preg_match('/(mysqli_connect|mysqli_query|new\s+PDO|mysql_connect|new\s+mysqli)/i', $content)) {
                $errorMsg = "Mode JSON aktif tapi file ini menggunakan koneksi MySQL. Gunakan helper/DataStore.php.";
            }
        }
        // Warning: Excel mode tapi pakai MySQL atau DataStore
        if ($dbMode === 'excel' && $isValid) {
            if (preg_match('/(mysqli_connect|mysqli_query|new\s+PDO|mysql_connect|loadData\s*\(|saveData\s*\()/i', $content)) {
                $errorMsg = "Mode Google Sheets aktif tapi file ini menggunakan MySQL/DataStore. Gunakan helper/SheetsAPI.php.";
            }
        }
        // Warning: MySQL mode tapi halusinasi fungsi DataStore/SheetsAPI
        if ($dbMode === 'mysql' && $isValid) {
            if (preg_match('/(loadData\s*\(|saveData\s*\(|sheetsLoad|DataStore\.php|SheetsAPI\.php)/i', $content)) {
                $errorMsg = "Mode MySQL aktif tapi AI menggunakan fungsi JSON Storage atau Sheets API. Gunakan fungsi mysqli_* untuk database MySQL.";
            }
        }
    } elseif ($extension === 'bas') {
        // Cek dasar VBA: harus ada minimal Sub atau Function
        if (!preg_match('/(^\s*Sub\s+|^\s*Function\s+|^\s*Private Sub|^\s*Public Sub|^\s*Public Function)/im', $content)) {
            $isValid = false;
            $errorMsg = "File .bas tidak memiliki Sub atau Function yang valid.";
        }
        // Warning: VBA mode tapi ada kode PHP
        if ($dbMode === 'vba' && $isValid) {
            if (preg_match('/(<\?php|mysqli_|echo\s+["\']|\$_POST|\$_GET)/i', $content)) {
                $errorMsg = "Mode Excel VBA aktif tapi file ini mengandung kode PHP. Tulis kode VBA murni.";
            }
        }
    } elseif ($extension === 'sql') {
        // Cek dasar SQL: Kutip tunggal harus genap, harus ada minimal satu keyword SQL utama
        if (substr_count($content, "'") % 2 !== 0) {
            $isValid = false;
            $errorMsg = "Terdapat tanda kutip tunggal (') yang tidak tertutup.";
        }
        if ($isValid && !preg_match('/(CREATE|INSERT|UPDATE|DELETE|SELECT|TABLE|DATABASE)/i', $content)) {
            $isValid = false;
            $errorMsg = "File SQL tampak tidak memiliki perintah database yang valid.";
        }
    }

    return ['valid' => $isValid, 'error' => $errorMsg];
}
?>
