<?php
// تأكد من أن هذا السكربت لا يمكن الوصول إليه مباشرة من الويب (للحماية)
// يمكنك وضع ملف .htaccess في المجلد لمنع الوصول المباشر

// المسار الصحيح لملف الاتصال
// هذه الطريقة تضمن أن المسار صحيح دائمًا بغض النظر عن كيفية استدعاء السكربت
include_once __DIR__ . '/../../jwtconnect.php'; 

// يمكنك هنا تضمين أي ملفات مساعدة أخرى
// استخدام __DIR__ هنا أيضًا يضمن إيجاد الملف في نفس المجلد الحالي
include_once __DIR__ . '/finalize_wallet_payment.php';
// --- إعدادات Gemini API ---
// من الأفضل قراءة مفتاح API من متغيرات البيئة لزيادة الأمان
$geminiApiKey = getenv('GEMINI_API_KEY'); 

$geminiApiUrl = "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-preview-05-20:generateContent?key=" . $geminiApiKey;

// 1. جلب رسالة واحدة بحالة "pending" لمعالجتها
$stmt_fetch = $con->prepare("SELECT id, message_body FROM `raw_sms_log` WHERE `status` = 'pending' ORDER BY created_at ASC LIMIT 1");
$stmt_fetch->execute();
$sms = $stmt_fetch->fetch(PDO::FETCH_ASSOC);

if (!$sms) {
    exit("No pending messages found.\n");
}

$sms_id = $sms['id'];
$sms_text = $sms['message_body'];

// 2. بناء الطلب (Prompt) الذكي إلى Gemini
$prompt = "Analyze the following financial SMS and return ONLY a valid JSON object.
- `transaction_type`: Must be 'income' (money received) or 'payout' (money sent).
- `amount`: Must be a number (float).
- `currency`: Must be a 3-letter code (e.g., SYP).
- `phone_number`: The phone number of the other party. Must be a string, or `null` if not found.

SMS Text: \"$sms_text\"";

$payload = ['contents' => [['parts' => [['text' => $prompt]]]]];

// 3. إرسال الطلب إلى Gemini API
$ch = curl_init($geminiApiUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
$response = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

// 4. معالجة رد Gemini
$result = json_decode($response, true);
$gemini_text_response = $result['candidates'][0]['content']['parts'][0]['text'] ?? null;

if ($httpcode == 200 && $gemini_text_response) {
    $clean_json_str = trim(str_replace(['```json', '```'], '', $gemini_text_response));
    $data = json_decode($clean_json_str, true);

    if ($data && isset($data['transaction_type'])) {
        // --- نجحت المعالجة: استخراج البيانات ---
        $phone_raw = $data['phone_number'] ?? null;
        $amount = isset($data['amount']) ? (float)$data['amount'] : 0;
        
        // توحيد صيغة رقم الهاتف (مثال بسيط)
        $phone_norm = $phone_raw; // يمكنك إضافة منطق أكثر تعقيداً هنا إذا لزم الأمر

        if ($data['transaction_type'] === 'income' && !empty($phone_norm) && $amount > 0) {
            // البحث عن فاتورة مطابقة خلال آخر 60 دقيقة
            $q = $con->prepare("SELECT id FROM invoices_sms WHERE status='pending' AND user_phone=:p AND amount=:a AND created_at >= (NOW() - INTERVAL 60 MINUTE) ORDER BY created_at DESC LIMIT 1");
            $q->execute([':p' => $phone_norm, ':a' => $amount]);
            $inv = $q->fetch(PDO::FETCH_ASSOC);

            if ($inv) {
                // تم العثور على فاتورة مطابقة -> قم بتحديثها وتنفيذ الإجراء النهائي
                $con->prepare("UPDATE invoices_sms SET status='completed' WHERE id=:id")->execute([':id' => $inv['id']]);
                
                // افترض أن هذه الدالة موجودة في ملف jwtconnect.php أو ملف مساعد آخر
                $ok = function_exists('finalizeWalletPaymentByInvoice') ? finalizeWalletPaymentByInvoice($con, $inv['id']) : false;
                $note = $ok ? 'finalized' : 'finalize_failed';

                $con->prepare("UPDATE raw_sms_log SET status='processed', gemini_result=:r WHERE id=:id")->execute([':r' => json_encode($data, JSON_UNESCAPED_UNICODE), ':id' => $sms_id]);
                echo "Income matched -> invoice {$inv['id']} -> $note\n";

            } else {
                // لم يتم العثور على فاتورة مطابقة
                $con->prepare("UPDATE raw_sms_log SET status='failed', gemini_result=:r WHERE id=:id")->execute([':r' => json_encode(['warn' => 'no pending invoice match', 'parsed' => $data], JSON_UNESCAPED_UNICODE), ':id' => $sms_id]);
                echo "No matching pending invoice found.\n";
            }

        } elseif ($data['transaction_type'] === 'payout' && !empty($phone_norm) && $amount > 0) {
    // --- منطق معالجة الدفعات الصادرة ---
    $q = $con->prepare("SELECT id FROM payout_requests WHERE status='pending' AND driver_phone=:p AND amount=:a ORDER BY created_at DESC LIMIT 1");
    $q->execute([':p' => $phone_norm, ':a' => $amount]);
    $payout = $q->fetch(PDO::FETCH_ASSOC);

    if ($payout) {
        // تم العثور على طلب سحب مطابق -> قم بتحديثه واستدعاء الإتمام
        $payout_id = $payout['id'];
        $con->prepare("UPDATE payout_requests SET status='completed', completed_at=NOW() WHERE id=:id")->execute([':id' => $payout_id]);
        
        include_once __DIR__ . '/finalize_payout.php';
        if (function_exists('finalizePayout')) {
            finalizePayout($con, $payout_id);
            $note = "Payout request {$payout_id} finalized.";
        } else {
            $note = "CRITICAL: finalizePayout function not found!";
        }

        $con->prepare("UPDATE raw_sms_log SET status='processed', gemini_result=:r WHERE id=:id")->execute([':r'=>json_encode($data), ':id'=>$sms_id]);
        error_log("[ProcessGemini] $note");

    } else {
        // لم يتم العثور على طلب سحب مطابق
        $con->prepare("UPDATE raw_sms_log SET status='failed', gemini_result=:r WHERE id=:id")->execute([':r'=>json_encode(['warn'=>'no pending payout match', 'parsed'=>$data]), ':id'=>$sms_id]);
        error_log("[ProcessGemini] No matching pending payout found for SMS ID {$sms_id}");
    }
} 

    } else {
        // فشل تحليل رد Gemini
        $stmt_update = $con->prepare("UPDATE `raw_sms_log` SET `status` = 'failed', `gemini_result` = :result WHERE `id` = :id");
        $stmt_update->execute([':result' => json_encode(['error' => "Failed to parse Gemini's JSON response", 'response' => $gemini_text_response]), ':id' => $sms_id]);
        echo "Failed to parse Gemini's JSON response for message ID $sms_id.\n";
    }
} else {
    // لم يتم استلام رد من Gemini أو حدث خطأ في الطلب
    $stmt_update = $con->prepare("UPDATE `raw_sms_log` SET `status` = 'failed', `gemini_result` = :result WHERE `id` = :id");
    $stmt_update->execute([':result' => json_encode(['error' => 'No valid response from Gemini API', 'http_code' => $httpcode]), ':id' => $sms_id]);
    echo "No valid response from Gemini API for message ID $sms_id. HTTP Code: $httpcode\n";
}
?>

