<?php
/**
 * analisis/api/analyze.php 
 * API Backend untuk menganalisis grafik trading dengan Vision AI.
 */

session_start();
include '../../config/database.php';
include '../../llm/api/koneksi_gemini.php';

header('Content-Type: application/json');
error_reporting(0);

if (!isset($_SESSION['user_id'])) {
    http_response_code(403);
    echo json_encode(['error' => 'Akses ditolak. Silakan login terlebih dahulu.']);
    exit;
}

$user_id = $_SESSION['user_id'];

// Config Loader
$res = mysqli_query($conn, "SELECT gemini_model FROM settings WHERE id = 1");
$cfg = mysqli_fetch_assoc($res);
$g_model = $cfg['gemini_model'] ?? 'gemini-1.5-flash';

if (!isset($_FILES['gambar']) || $_FILES['gambar']['error'] !== 0) {
    echo json_encode(['error' => 'Gambar grafik tidak ditemukan atau gagal diunggah.']);
    exit;
}

// Validasi File
$f_size = $_FILES['gambar']['size'];
$max_size = 5 * 1024 * 1024; // 5MB limit
if ($f_size > $max_size) {
    echo json_encode(['error' => 'Ukuran grafik melebihi 5MB.']);
    exit;
}

$f_path = $_FILES['gambar']['tmp_name'];
$f_type = $_FILES['gambar']['type'];
$f_name = $_FILES['gambar']['name'];

function extractTextFromFile($filePath, $mimeType, $originalName) {
    if (in_array(strtolower(pathinfo($originalName, PATHINFO_EXTENSION)), ['csv'])) {
        return file_get_contents($filePath);
    }
    if (strtolower(pathinfo($originalName, PATHINFO_EXTENSION)) === 'xlsx') {
        $zip = new ZipArchive;
        if ($zip->open($filePath) === TRUE) {
            if (($index = $zip->locateName('xl/sharedStrings.xml')) !== false) {
                $text = strip_tags($zip->getFromIndex($index));
                $zip->close();
                return $text;
            }
            $zip->close();
        }
    }
    return null;
}

$extracted_text = extractTextFromFile($f_path, $f_type, $f_name);
$file_part = null;
$history_context = "";

if ($extracted_text) {
    $history_context = "\n[DATA HISTORI TRANSAKSI/CANDLESTICK]\n" . substr($extracted_text, 0, 30000) . "\n[AKHIR DATA]\n";
} else {
    // Jadikan Base64 untuk payload Vision LLM
    $data = file_get_contents($f_path);
    $base64 = base64_encode($data);
    $file_part = [
        "inlineData" => [
            "mimeType" => $f_type, 
            "data" => $base64
        ]
    ];
}

// PROMPT KHUSUS TRADING INSTITUSIONAL
$sys_prompt = "
PERAN: Anda adalah 'Senior Quantitative & Technical Analyst' (Smart Money Concepts / Price Action Expert) yang bekerja untuk institusi keuangan global.

INSTRUKSI KLINIS:
User akan mengunggah gambar berupa grafik harga (candlestick/line chart) ATAU rentetan data transaksi historis dalam format teks.
Tugas Anda adalah membedah grafik/data tersebut secara mendalam dan profesional menggunakan metodologi analisis teknikal tingkat lanjut (Break of Structure, Liquidity Pools, Fibonacci, Divergence, Volume Profile).
$history_context

FORMAT OUTPUT (WAJIB MENGGUNAKAN MARKDOWN TERSTRUKTUR):
1. 📊 ASESMEN MARKET STRUCTURE:
   Sebutkan _Timeframe_ dari grafik (jika terlihat). Evaluasi tren makro & mikro (Bullish/Bearish/Sideways). Analisis secara profesional apakah ada formasi teknikal spesifik (mis. Head & Shoulders, Wyckoff accumulation, Break of Structure, dll).

2. 🧮 TABEL SKENARIO PROBABILITAS:
   Buat tabel dengan 3 kolom: | Arah Gerak | Probabilitas (%) | Kondisi Validasi Tesis |
   (Contoh: Bullish | 65% | Resistance X ditembus dengan volume tinggi)

3. 🔎 BEDAH TEKNIKAL MENDALAM (DEEP DIVE TEXT):
   - **Price Action & Zona Kunci**: Elaborasi Support/Resistance dinamis, Order Block, atau zona Supply/Demand.
   - **Momentum & Osilator**: Analisis indikator yang tampak (misal RSI divergence, MACD cross, anomali Volume).
   - **Invalidation Level (Risiko)**: Di level mana analisis Anda ini sudah tidak berlaku (patah tren)?

4. 🛡️ REKOMENDASI EKSEKUSI TRANSAKSI:
   Sajikan ringkasan sinyal Anda dengan format baku di bawah ini agar user yang awam bisa mengambil aksi riil.
   *PENTING: Jangan ubah label format di bawah ini, wajib sama persis, keluarkan salah satu blok (Beli atau Jual) saja!*
   JIKA REKOMENDASINYA **BELI**:
   - \"Rekomendasi: **BELI / NAIK**\"
   - \"Harga Beli Terbaik: di angka [Sebutkan Angka Saja]\"
   - \"Harga Jual Untuk Untung (Target): di angka [Sebutkan Angka Saja]\"
   - \"Harga Jual Darurat (Cut Loss): di angka [Sebutkan Angka Saja]\"
   JIKA REKOMENDASINYA **JUAL / SHORT**:
   - \"Rekomendasi: **JUAL / TURUN**\"
   - \"Harga Jual Terbaik: di angka [Sebutkan Angka Saja]\"
   - \"Harga Beli Kembali Untuk Untung (Target): di angka [Sebutkan Angka Saja]\"
   - \"Harga Beli Kembali Darurat (Cut Loss): di angka [Sebutkan Angka Saja]\"
   JIKA REKOMENDASINYA **TUNGGU (WAIT & SEE)** (Saat asar turun drastis tanpa support / sideways tidak jelas):
   - \"Rekomendasi: **WAIT AND SEE / SIDEWAYS**\"
   - \"Area Tunggu Terbaik (Bottom Fishing): di angka [Sebutkan Angka Saja]\"
   - \"Harga Jual Untuk Untung (Target): di angka [Sebutkan Angka Saja]\"
   - \"Harga Batal / Cut Loss: di angka [Sebutkan Angka Saja]\"

5. KESIMPULAN & TABEL OPINI ALOKASI:
   Berikan 1 paragraf kesimpulan opini pribadi Anda, kemudian buatkan TABEL ALOKASI SEDERHANA dengan struktur berikut:
   | Skenario Posisi User | Rekomendasi Alokasi | Aksi Lanjutan |
   |---|---|---|
   | Jika pegang aset/saham ini | <font color='#ef4444'>**SELL**</font> [sebut berapa %] dari aset | Tunggu <font color='#10b981'>**BUY**</font> kembali di harga [X] |
   | Jika punya dana/saldo tunai | <font color='#10b981'>**BUY**</font> [sebut berapa %] dari dana | Tunggu <font color='#ef4444'>**SELL**</font> kembali di harga [Y] |
   
   (*Instruksi Warna:* Selalu tebalkan dan warnai merah untuk kata <font color='red'>**SELL**</font> / 🔴 **SELL**, dan warna hijau untuk <font color='green'>**BUY**</font> / 🟢 **BUY**.)

6. SIKAP SAAT PASAR TURUN (BEARISH):
   Jika melihat tren sedang dump / turun tajam, **JANGAN MENYURUH BELI SECARA SPEKULATIF**. Paksa output ke rekomendasi **JUAL / SHORT** atau **WAIT AND SEE** dan suruh _user_ menunggu di area Support major selanjutnya.

7. AKHIR JAWABAN:
   Tutup selalu dengan: **Disclaimer On**. Segala risiko menjadi tanggung jawab trader. Not Financial Advice.
";

$timeframe = $_POST['timeframe'] ?? 'Tidak Diketahui';
$user_input = "Konteks Timeframe Grafik/Data yang diunggah User saat ini adalah: " . $timeframe . ".\nLakukan pembedahan teknikal tingkat lanjut. Identifikasi Support/Resistance, struktur harga, dan berikan probabilitas. Jika pasar sedang dump/turun, jujur saja bilang turun dan suruh Wait and See, jangan maksa Beli.";
$hist_ctx = ""; 
$mode_instr = "Gunakan kosa kata trading profesional (seperti Liquidity, Retracement, Divergence, Order Block) di bagian analisis teknikal agar terdengar berbobot dan pro, namun patuhi format rekomendasi harga yang tetap baku untuk pemula.";

// Eksekusi Panggilan AI
$ai_reply = executeInternalLLM(
    $sys_prompt . "\n" . $mode_instr . "\n[PERINTAH]\n" . $user_input, 
    $file_part, 
    0.4, // Temperatur sedikit dinaikkan untuk keseimbangan analitik dan probabilitas
    $conn, 
    $cfg, 
    $g_model, 
    $sys_prompt, 
    $user_input, 
    $hist_ctx
);

if ($ai_reply === "FAIL" || empty($ai_reply)) {
    echo json_encode(['error' => 'Gagal memproses gambar. Server sedang sibuk.']);
    exit;
}

echo json_encode(['jawaban' => trim($ai_reply)]);
?>
