<?php
require_once __DIR__ . '/../../connect.php';

$driverId = filterRequest("driver_id");
$type     = filterRequest("type");

// 🔒 Validate image
if (!isset($_FILES['image']) || $_FILES['image']['error'] !== UPLOAD_ERR_OK) {
    error_log("Upload error: Image not provided or upload failed.");
    jsonError("Image upload failed");
    exit;
}

$file      = $_FILES['image'];
$extension = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
$allowed   = ['jpg', 'jpeg', 'png'];

if (!in_array($extension, $allowed)) {
    error_log("Unsupported file type: $extension");
    jsonError("Unsupported file type");
    exit;
}

$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime_type = finfo_file($finfo, $file['tmp_name']);
finfo_close($finfo);

$allowed_mime_types = ['image/jpeg', 'image/png', 'image/jpg'];
if (!in_array($mime_type, $allowed_mime_types)) {
    error_log("Unsupported MIME type: $mime_type");
    jsonError("Unsupported file type (MIME mismatch)");
    exit;
}

$uniqueName  = "driver_" . $type . "_" . $driverId . ".$extension";
$uploadDir   = "../uploads/documents/";
$uploadPath  = $uploadDir . $uniqueName;

if (!is_dir($uploadDir)) {
    mkdir($uploadDir, 0755, true);
}

if (!move_uploaded_file($file['tmp_name'], $uploadPath)) {
    error_log("Failed to move uploaded file.");
    jsonError("Failed to move uploaded image");
    exit;
}

$host = $_SERVER['HTTP_HOST'] ?? 'api-syria.siromove.com';
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? "https" : "http";
$imageUrl    = "$protocol://$host/siro/auth/uploads/documents/" . $uniqueName ;
$imageData   = file_get_contents($uploadPath);
$imageBase64 = base64_encode($imageData);

$mimeType = match ($extension) {
    'jpg', 'jpeg' => 'image/jpeg',
    'png'         => 'image/png',
    default       => 'application/octet-stream',
};

$prompts = [
    "id_front_sy" => <<<EOT
You are an OCR expert for Syrian national ID cards (green card).

### TASK
Analyse the **front side** of the ID and return **raw JSON only** with exactly these keys:

{
  "full_name": "",          // الاسم الثلاثي أو الرباعي
  "national_number": "",    // الرقم الوطني (LATIN digits only)
  "dob": "YYYY-MM-DD",      // تاريخ الميلاد
  "address": ""             // العنوان
}

### RULES
* Read the red number on the bottom of the card.
* Convert any Eastern-Arabic digits (٠١٢٣٤٥٦٧٨٩) to Western-Arabic digits (0-9).
* `national_number` must contain **Latin digits only, no spaces or other characters**.
* If a field is missing, set it to **null**.
* Convert the birth date to ISO `YYYY-MM-DD`.
* Return valid JSON only — no extra keys, no markdown.
EOT,
    "id_back_sy" => <<<EOT
أنت خبير OCR مختص ببطاقات الهوية السورية (الوجه الخلفي).

### المطلوب
حلّل صورة الوجه الخلفي للهوية السورية وأعد **JSON صِرف** يحتوي المفاتيح التالية فقط:

{
  "governorate": "",        // المحافظة (مثال: دمشق)
  "address": "",            // العنوان التفصيلي (حيّ، بلدة …)
  "gender": "",         //Male or Female
  "issue_date": "YYYY-MM-DD"// تاريخ الإصدار بصيغة ISO
}

### القواعد
1. حوّل أي أرقام عربية شرقية (٠١٢٣٤٥٦٧٨٩) إلى أرقام لاتينية (0-9).
2. أعدّ تاريخ الإصدار بالتقويم الميلادي بصيغة `YYYY-MM-DD`.
3. استخدم أحرف لاتينية كبيرة لزمرة الدم مع رمز ‎`+`‎ أو ‎`-`‎ فقط.
4. إذا كان أحد الحقول غير موجود مطلقًا، أعد قيمته **null**.
5. لا تُرجع أي مفاتيح إضافية أو شروح أو Markdown — JSON صالح فقط.
EOT,
    "driving_license_sy_front" => <<<EOT
You are an OCR expert for Syrian documents.

### TASK
Analyse the **front side of a Syrian driving licence** and return **clean JSON only** with the following keys (no extra keys, no markdown):

{
  "name_arabic": "",        // الاسم الثلاثي أو الرباعي بالعربية
  "birth_place": "",        // المحافظة أو المنطقة المكتوبة بعد كلمة الولادة
  "birth_year": "",         // سنة الميلاد فقط (أربعة أرقام)
  "national_number": ""
  "civil_registry": "",     // سطر "القيد" (مثال: سهوة 3)
  "blood_type": ""          // زمرة الدم بالشكل: A+ , A- , B+ , B- , AB+ , AB- , O+ , O-
}

### RULES
* إذا كانت القيمة مفقودة تمامًا اكتب **null**.
* لا تُغيّر ترتيب المفاتيح.
* لا تُرسل أى شرح أو أسطر إضافية – JSON خالص فقط.
EOT,
  
    "driving_license_sy_back" => <<<EOT
You are an OCR expert for Syrian driving licences.

### TASK
Analyse the **back side** of a Syrian  driving licence and return **raw JSON only** with exactly these keys:

{
  "issue_date": "YYYY-MM-DD",    // تاريخ المنح
  "expiry_date": "YYYY-MM-DD",   // صالحة لغاية
  "license_number": "",          // رقم الإجازة
  "license_category": ""         // D1, D2, D3 … (as printed after "UNIVERSAL DRIVING LICENCE")
}

### RULES
* If a value is totally absent, set it to **null**.
* Convert all dates to ISO `YYYY-MM-DD` (Gregorian).
* Do **NOT** add extra keys, comments, or markdown — return valid JSON only.
EOT,
    "vehicle_license_sy_front" => <<<EOT
You are an OCR expert specialized in analyzing Syrian vehicle registration cards (الرخصة البرتقالية).

Your task is to extract structured data from the **front side** of the Syrian orange vehicle card and return **raw JSON only** with the following exact fields:

{
  "car_plate": "",          // رقم المركبة الكامل مع اسم المحافظة، مأخوذ من الجهة اليسرى في السطر الأول (مثال: "155186 درعا")
  "owner": "",              // اسم المالك الكامل
  "vin": "",                // رقم الهيكل
  "color": "",              // اللون بالعربية أو الإنجليزية (مثال: "أبيض" أو "White")
  "color_hex": "",          // كود اللون بصيغة Hex (مثال: "#FFFFFF") أو #27332F إن تعذّر
  "issue_date": "YYYY-MM-DD",        // تاريخ المنح بصيغة ISO
  "inspection_date": "YYYY-MM-DD"    // تاريخ الفحص القادم بصيغة ISO
}

### Instructions & Rules:

1. Do **not** extract the "رمز المركبة" (on the right side of the first line) — use only the **left side** of the first line for `car_plate`.
2. Convert any Arabic dates (like `2024/05/13`) into ISO format `YYYY-MM-DD`.
3. If any value is missing or unreadable, return `null` for it.
4. Maintain Arabic encoding (e.g., owner name, city name, color).
5. Never guess — extract only what's visually found on the card.
6. Never include any explanation or extra output — return the JSON only.

Example of valid `car_plate`:
- "155186 درعا"
- "45291 دمشق"
- "122334 حمص"
EOT,
  "vehicle_license_sy_back" => <<<EOT
You are an OCR expert for Syrian vehicle registration cards (orange card).

### TASK
Analyse the **back side** of the card and return **raw JSON only** with exactly these keys (no more, no less):

{
  "make": "",         // الصانع (Hyundai …)
  "model": "",        // الطراز (H1 …)
  "year": "",         // سنة الصنع بالأرقام اللاتينية (e.g. "2019")
  "fuel": "",         // نوع الوقود (بنزين، ديزل …) أو بالإنجليزية (Petrol, Diesel,electric)
  "chassis": ""       // رقم الهيكل (VIN)
}

### RULES
* Convert any Eastern-Arabic digits (٠١٢٣٤٥٦٧٨٩) to Western digits (0-9).
* Normalise color names to standard English if possible, then map to a common Hex code  
  • "أبيض / White" → **#FFFFFF**  
  • "أسود / Black" → **#000000**  
  • "أحمر / Red"   → **#FF0000**  
  • "أزرق / Blue"  → **#0000FF**  
  • … (use the closest basic colour); if no match, set **color_hex = null**.
* If any field is unreadable or absent, set its value to **null**.
* Do **NOT** include extra keys, comments, or markdown — output valid JSON only.
EOT
];

$prompt = $prompts[$type] ?? $prompts["id_front_sy"];

$apiKey = getenv("GEMINI_API_KEY");
$apiURL = "https://generativelanguage.googleapis.com/v1beta/models/gemini-flash-lite-latest:generateContent?key=$apiKey";

$headers = ["Content-Type: application/json"];
$payload = [
    "contents" => [
        ["role" => "user", "parts" => [["text" => $prompt]]],
        ["role" => "user", "parts" => [["inlineData" => ["mimeType" => $mimeType, "data" => $imageBase64]]]]
    ]
];

$ch = curl_init($apiURL);
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($payload));

$response = curl_exec($ch);

if (curl_errno($ch)) {
    $error_msg = curl_error($ch);
    error_log("CURL error: $error_msg");
    jsonError("AI Error: $error_msg");
    curl_close($ch);
    exit;
}

curl_close($ch);
error_log("AI raw response: $response");

$data = json_decode($response, true);
if (json_last_error() !== JSON_ERROR_NONE) {
    error_log("JSON decode error: " . json_last_error_msg());
    jsonError("Failed to parse AI response");
    exit;
}

$textRaw = $data['candidates'][0]['content']['parts'][0]['text'] ?? '';
$textRaw = trim(preg_replace('/```json|```/', '', $textRaw));
$json = json_decode($textRaw, true);

$requiredKey = match ($type) {
    'id_front_sy' => 'national_number',
    'id_back_sy' => 'gender',
    'driving_license_sy' => 'license_type',
    'vehicle_license_sy' => 'chassis',
    default => null,
};

if (!$json || ($requiredKey && !isset($json[$requiredKey]))) {
    error_log("AI response missing required key '$requiredKey': $textRaw");
    jsonError("AI failed to extract required information");
    exit;
}

printSuccess([
    "image_url" => $imageUrl,
    "data"      => $json
]);