<?php
require_once __DIR__ . '/../../config.php';
require_once __DIR__ . '/../../engine/Kernel.php';
require_once __DIR__ . '/../../engine/Logger.php';        // BRIDGE
require_once __DIR__ . '/../../engine/BillingEngine.php'; // BRIDGE: AI daily limit
Logger::traceId();                                         // establish trace
$ctx = Kernel::handle(['auth' => true]);
$u   = $ctx['user'];
if ($_SERVER['REQUEST_METHOD'] !== 'POST') Kernel::fail('post_only', '', 405);
if (!check_rate_limit('vision_' . $u['id'], 10, 60)) Kernel::fail('rate_limit', '', 429);

$b       = json_decode(file_get_contents('php://input'), true) ?? [];
$img_b64 = $b['image_base64'] ?? '';
$mime    = in_array($b['mime_type'] ?? '', ['image/jpeg','image/png','image/webp']) ? $b['mime_type'] : 'image/jpeg';
$title   = mb_substr(trim($b['title'] ?? ''), 0, 100);
$cat     = $b['category'] ?? 'used';

if (!$img_b64) Kernel::fail('image_required', '', 400);

// Fix 4: استخدام الدالة المركزية للتحقق من الصورة
$img_check = validate_and_compress_image_base64($img_b64, MAX_UPLOAD_MB);
if (!$img_check['ok'])
    json_response(['error' => $img_check['error'], 'detail' => $img_check['note'] ?? ''], 400);
$pure = $img_check['pure'];
$mime = $img_check['mime'];    // MIME مؤكد من finfo يستبدل القيمة المرسلة

// ── تصنيفات السوق ──────────────────────────────────────────────
$cat_labels = [
    'food'      => 'طعام وأكل',
    'handmade'  => 'منتج يدوي',
    'services'  => 'خدمة',
    'used'      => 'منتج مستعمل',
    'education' => 'مستلزم تعليمي',
    'fresh'     => 'منتج طازج',
    'health'    => 'مستلزم طبي أو تقرير صحي',
];
$cat_label = $cat_labels[$cat] ?? 'منتج';

// ── ١️⃣ مساعد الأسرة: تفريع الـ system_instruction بناءً على الفئة ──
if ($cat === 'health') {
    // وضع المساعد الطبي الاستشاري
    $system_v = <<<SYS
أنت مساعد طبي استشاري أول في منصة سودانا مساعد الأسرة.
مهمتك: تحليل الصورة الطبية المرسلة (تقرير، أشعة، وصفة، دواء، أو مستلزم طبي) وتقديم قراءة استرشادية ودودة بالعربية.
أسلوبك: سوداني ودود وواضح — استخدم جمل مثل "أبشر" و"تمام العافية" عند الطمأنة.
التزم بالحيادية العلمية وتجنّب التشخيص القاطع.
أضف في نهاية كل رد هذا التحذير حرفياً دون تغيير:
"⚕️ هذا تحليل آلي استرشادي فقط؛ يجب استشارة الطبيب فوراً في الحالات الطارئة."
SYS;
    $prompt_v = "حلّل هذه الصورة الطبية" . ($title ? " (العنوان: $title)" : '') .
                " واذكر: (١) ما تراه بوضوح، (٢) ملاحظات استرشادية مفيدة، (٣) أي معلومات مهمة تظهر في الصورة.";
    $max_tokens_v = 350;
} else {
    // وضع التسويق للسوق — السلوك الأصلي
    $system_v = 'أنت خبير تسويق في سوق الجيران السوداني. مهمتك كتابة وصف تسويقي جذّاب وصادق للمنتج.';
    $prompt_v = "المنتج من فئة: $cat_label" . ($title ? " | الاسم: $title" : '') .
                "\nاكتب وصفاً تسويقياً قصيراً (جملتان بالعربية) يُشجّع على الشراء ويذكر أبرز مميزات المنتج من الصورة.";
    $max_tokens_v = 200;
}

// ── بناء الـ payload مع الصورة ──────────────────────────────────
$payload = [
    'system_instruction' => ['parts' => [['text' => trim($system_v)]]],
    'contents'           => [['role' => 'user', 'parts' => [
        ['inline_data' => ['mime_type' => $mime, 'data' => $pure]],
        ['text'        => $prompt_v],
    ]]],
    'generationConfig' => [
        'maxOutputTokens' => $max_tokens_v,
        'temperature'     => $cat === 'health' ? 0.3 : 0.7,  // أكثر دقة للمحتوى الطبي
    ],
    'safetySettings' => [
        ['category' => 'HARM_CATEGORY_HARASSMENT',        'threshold' => 'BLOCK_ONLY_HIGH'],
        ['category' => 'HARM_CATEGORY_HATE_SPEECH',       'threshold' => 'BLOCK_ONLY_HIGH'],
        ['category' => 'HARM_CATEGORY_SEXUALLY_EXPLICIT', 'threshold' => 'BLOCK_MEDIUM_AND_ABOVE'],
        ['category' => 'HARM_CATEGORY_DANGEROUS_CONTENT', 'threshold' => 'BLOCK_ONLY_HIGH'],
    ],
];

// BRIDGE: AI daily limit check (vision uses the shared AI quota)
$_vis_plan  = $u['plan_key'] ?? $u['subscription_tier'] ?? 'free';
$_vis_limit = BillingEngine::checkAILimit((int)$u['id'], $_vis_plan);
if (!empty($_vis_limit['exceeded'])) {
    json_response([
        'error'   => 'daily_limit_exceeded',
        'message' => "تجاوزت حد {$_vis_limit['limit']} استدعاء/يوم",
        'used'    => $_vis_limit['used'],
        'limit'   => $_vis_limit['limit'],
    ], 429);
}
unset($_vis_plan, $_vis_limit);
// END BRIDGE pre-check

// ── استدعاء Gemini (gemini-2.0-flash أولاً، fallback لـ 1.5-flash) ──
$r = _gemini_call($payload, GEMINI_MODEL);

if ($r['err'] || !$r['raw']) {
    error_log('[vision/describe] curl error: ' . $r['err']);
    Kernel::fail('ai_network_error', '', 502);
}

if (in_array($r['http'], [400, 404, 500])) {
    $r = _gemini_call($payload, GEMINI_FALLBACK);
}

if (isset($r['data']['error'])) {
    error_log('[vision/describe] API error http=' . $r['http'] . ' body=' . json_encode($r['data']['error'], JSON_UNESCAPED_UNICODE));
    json_response(['error' => 'ai_api_error', 'detail' => $r['data']['error']['message'] ?? ''], 502);
}

$desc = trim($r['data']['candidates'][0]['content']['parts'][0]['text'] ?? '');

// ── ضمان وجود جملة التحذير الطبي في ردود الفئة health ────────────
if ($cat === 'health' && $desc && stripos($desc, 'استرشادي') === false) {
    $desc .= "\n\n⚕️ هذا تحليل آلي استرشادي فقط؛ يجب استشارة الطبيب فوراً في الحالات الطارئة.";
}

if (!$desc) {
    $fallback_msg = $cat === 'health'
        ? 'لم يتمكن الذكاء الاصطناعي من تحليل الصورة الطبية. تأكد من وضوحها أو اعرضها على طبيب مباشرةً. ⚕️'
        : 'لم يتمكن الذكاء الاصطناعي من وصف الصورة، أضف وصفاً يدوياً.';
    json_response([
        'success'     => false,
        'description' => '',
        'message'     => $fallback_msg,
        'mode'        => $cat === 'health' ? 'medical' : 'market',
    ], 200);
}

// BRIDGE: log to ai_usage with trace_id (replaces _log_ai which had no trace)
_log_ai($cat === 'health' ? 'vision_medical' : 'vision', (int)$u['id']); // keep for backward compat
// Vision pricing not yet configured — log usage for future billing
// When enable_image_generation is enabled + pricing set, update cost_sdg here
$_vis_price_sdg = (int)\PricingEngine::getSetting('vision_price_sdg_' . $plan, 0);
Logger::aiUsage((int)$u['id'], $cat === 'health' ? 'vision_medical' : 'vision', [
    'service'    => 'vision:' . $cat,
    'cost_sdg'   => $_vis_price_sdg,
    'cost_usd'   => 0,
    'provider'   => 'gemini',
    'plan'       => $plan,
]);
// Debit if price is configured
if ($_vis_price_sdg > 0) {
    UsageMeter::debit((int)$u['id'], $_vis_price_sdg, 'vision', $cat);
}
// END BRIDGE

json_response([
    'success'     => true,
    'description' => $desc,
    'category'    => $cat,
    'cat_label'   => $cat_label,
    'mode'        => $cat === 'health' ? 'medical' : 'market',
    'trace_id'    => Logger::traceId(),
]);
