<?php
require_once __DIR__ . '/../../config.php';
require_once __DIR__ . '/../../engine/Kernel.php';
require_once __DIR__ . '/../../engine/Logger.php'; // BRIDGE: financial audit
require_once __DIR__ . '/../../engine/BillingEngine.php';
require_once __DIR__ . '/../../engine/UsageMeter.php';
$ctx = Kernel::handle(['auth' => true]);
$u   = $ctx['user'];
$action = $_GET['action'] ?? 'request';
$b      = json_decode(file_get_contents('php://input'), true) ?? [];

// ── تقديم طلب الاشتراك ────────────────────────────────────────
if ($action === 'request') {
    if ($_SERVER['REQUEST_METHOD'] !== 'POST') Kernel::fail('method_not_allowed', '', 405);

    // فحص طلب معلق
    $ex = db()->prepare("SELECT id FROM subscription_requests WHERE user_id = ? AND status = 'pending' LIMIT 1");
    $ex->execute([$u['id']]);
    if ($ex->fetch()) Kernel::fail('pending_exists', 'لديك طلب اشتراك قيد المراجعة', 409);

    $bank_ref = mb_substr(trim($b['bank_ref'] ?? ''), 0, 100);
    $months   = max(1, min(12, (int)($b['duration_months'] ?? 1)));
    $amount   = PricingEngine::getSubscriptionPrice() * $months;

    // رفع صورة الإيصال (مطلوبة)
    if (empty($b['receipt_base64'])) Kernel::fail('receipt_required', 'صورة إيصال التحويل مطلوبة', 400);

    $receipt_url = save_uploaded_image($b['receipt_base64']);
    if (!$receipt_url) Kernel::fail('invalid_image', 'صورة الإيصال غير صالحة', 400);

    // إنشاء رقم فاتورة
    $inv_count = (int)db()->query('SELECT COUNT(*) FROM invoices')->fetchColumn() + 1;
    $inv_no    = 'SD-' . date('Y') . '-' . str_pad($inv_count, 4, '0', STR_PAD_LEFT);
    db()->prepare('INSERT INTO invoices (invoice_no, user_id, type, description, amount, currency, payment_method) VALUES (?,?,?,?,?,?,?)')
        ->execute([$inv_no, $u['id'], 'subscription', "اشتراك {$months} شهر", $amount, 'SDG', 'bank_transfer']);
    $inv_id = (int)db()->lastInsertId();

    db()->prepare(
        'INSERT INTO subscription_requests (user_id, amount, currency, bank_ref, receipt_url, duration_months, invoice_id)
         VALUES (?, ?, ?, ?, ?, ?, ?)'
    )->execute([$u['id'], $amount, 'SDG', $bank_ref, $receipt_url, $months, $inv_id]);

    $req_id = (int)db()->lastInsertId();
    save_notification($u['id'], 'subscription_pending', '✅ تم استلام طلبك', "طلب اشتراكك رقم {$inv_no} قيد المراجعة. سيُفعَّل خلال 24 ساعة.");

    // Gemini يقرأ الإيصال للمساعدة في المراجعة (internal — max 100 tokens)
    $ai_note = '';
    $_sub_plan = $u['plan_key'] ?? 'free';
    $_sub_limit = BillingEngine::checkAILimit((int)$u['id'], $_sub_plan);
    try {
        if (empty($_sub_limit['exceeded'])) { // skip AI if limit reached
        $_um_pay = UsageMeter::wrap((int)$u['id'], 'chat', 'finance', fn() => AIClient::call("هذا إيصال تحويل بنكي. استخرج: المبلغ المحوَّل، التاريخ، ورقم المرجع إن وُجد. أجب في سطرين فقط.", 'أنت مساعد مراجعة مالي. استخرج البيانات بدقة.', 'auto', 100, 0.1, false), ['skip_debit' => true]);
        $ai_note = $_um_pay['ok'] ? ($_um_pay['result']['text'] ?? '') : '';
    }} catch (Throwable $ignored) {}
    unset($_sub_plan, $_sub_limit);

    json_response(['success' => true, 'request_id' => $req_id, 'invoice_no' => $inv_no,
        'amount' => $amount, 'ai_receipt_note' => $ai_note,
        'message' => 'تم استلام طلبك. سيُراجع فريقنا إيصالك ويُفعَّل الاشتراك خلال 24 ساعة.']);
}

// ── حالة الاشتراك ─────────────────────────────────────────────
if ($action === 'status') {
    $st = db()->prepare("SELECT sr.*, i.invoice_no FROM subscription_requests sr LEFT JOIN invoices i ON i.id = sr.invoice_id WHERE sr.user_id = ? ORDER BY sr.id DESC LIMIT 5");
    $st->execute([$u['id']]);
    json_response(['success' => true,
        'requests'            => $st->fetchAll(),
        'subscription_tier'   => $u['subscription_tier'],
        'subscription_expires'=> $u['subscription_expires_at'] ?? null,
        'bank_name'           => 'بنك الخرطوم',
        'account_number'      => '1821425',
        'account_name'        => 'حامد مختار',
        'amount_sdg'          => PricingEngine::getSubscriptionPrice(),
    ]);
}

Kernel::fail('unknown_action', '', 400);
