<?php
// shamcash/passenger/finalize_deposit.php
// محرك الإيداع للركاب - شام كاش (مقتبس من منطق Syriatel/MTN)

// ملف سجلات الأخطاء المالي
define("LOG_FILE_FINALIZE_PASSENGER", __DIR__ . "/deposit_financial_passenger.log");

if (!function_exists('logFinancialPassenger')) {
    function logFinancialPassenger($step, $message, $data = null) {
        $logDir = dirname(LOG_FILE_FINALIZE_PASSENGER);
        if (!is_dir($logDir)) { mkdir($logDir, 0755, true); }
        
        $entry = "[" . date('Y-m-d H:i:s') . "] STEP {$step}: {$message}";
        if ($data) $entry .= " | Data: " . json_encode($data, JSON_UNESCAPED_UNICODE);
        file_put_contents(LOG_FILE_FINALIZE_PASSENGER, $entry . PHP_EOL, FILE_APPEND);
    }
}

// دوال مساعدة (Helpers) - تحاكي دوال الـ API الموجودة في كودك القديم
// في بيئة الإنتاج، يفضل استدعاء ملفات الـ API الموجودة لديك بالفعل لضمان التوافق
// لكن هنا سنكتب المنطق المباشر لقاعدة البيانات للسرعة والوضوح

if (!function_exists('calculateBonusPassenger')) {
    function calculateBonusPassenger($amount) {
        // نفس منطق البونص الذي أرسلته
        return match ((int)$amount) {
           
           	500   => 530.0,
            1000  => 1000.0,
            2000  => 2180.0,
            5000  => 5700.0,
            default => (float)$amount,
        };
    }
}

if (!function_exists('generatePassengerToken')) {
    function generatePassengerToken(PDO $con, $passengerId, $amount) {
        // إنشاء توكن فريد
        $data = $passengerId . $amount . time() . 'shamcash_passenger_secret';
        $hash = hash('sha256', $data);
        $token = substr($hash . bin2hex(random_bytes(16)), 0, 64);

        // حفظ التوكن (افترضنا وجود جدول payment_tokens_passenger أو استخدام الجدول العام)
        // سأستخدم الجدول العام payment_tokens مع وضع passengerId مكان driverID مؤقتاً
        // أو يفضل استخدام جدول خاص للركاب لتجنب الخلط
        
        // الخيار الأفضل: استخدام جدول `payment_tokens` ولكن تأكد من العمود (driverID)
        // سأفترض أنك ستستخدم جدول `payment_tokens_passenger` الذي اقترحته في الـ SQL السابق
        
        $stmt = $con->prepare("INSERT INTO payment_tokens_passenger (token, passengerID, dateCreated, amount) VALUES (:token, :id, NOW(), :amount)");
        $stmt->execute([':token' => $token, ':id' => $passengerId, ':amount' => $amount]);
        
        return $stmt->rowCount() > 0 ? $token : null;
    }
}

if (!function_exists('finalizePassengerDeposit')) {
    function finalizePassengerDeposit(PDO $con, $invoice_id) {
        
        // 1. جلب الفاتورة (يجب أن تكون في حالة processing)
        $stmt = $con->prepare("SELECT * FROM invoices_shamcash_passenger WHERE id = :id AND status = 'processing' LIMIT 1");
        $stmt->execute([':id' => $invoice_id]);
        $invoice = $stmt->fetch(PDO::FETCH_ASSOC);

        if (!$invoice) {
            logFinancialPassenger("INIT", "Invoice not found or not processing", ['id' => $invoice_id]);
            return false;
        }

        $con->beginTransaction();

        try {
            $passengerId = $invoice['passengerID'];
            $originalAmount = (float)$invoice['amount'];
            $paymentMethod = 'shamcash';

            // 2. حساب المكافأة (Bonus)
            $finalAmount = calculateBonusPassenger($originalAmount);

            // 3. إنشاء التوكنات
            $tokenPassenger = generatePassengerToken($con, $passengerId, $finalAmount);
            $tokenSiro = generatePassengerToken($con, $passengerId, $originalAmount);

            if (!$tokenPassenger || !$tokenSiro) throw new Exception('Token generation failed');

            // 4. الإيداع في محفظة الراكب (passengerWallet)
            // نضيف المبلغ النهائي (مع البونص)
            $stmtPassenger = $con->prepare("INSERT INTO passengerWallet (passenger_id, balance, type, create_at) VALUES (:pid, :amt, 'deposit', NOW())");
            // ملاحظة: تأكد من أسماء الأعمدة في جدول passengerWallet لديك
            // في كودك القديم كان يستخدم API: /passengerWallet/add.php
            // سأفترض هنا الإدخال المباشر أو تحديث الرصيد
            
           
            // حرق توكن الراكب
            $con->prepare("UPDATE payment_tokens_passenger SET isUsed = TRUE WHERE token = :t")->execute([':t' => $tokenPassenger]);

            // 5. الإيداع في محفظة الشركة (siroWallet)
            // نسجل المبلغ الأصلي (بدون البونص) كإيراد
            $insertSiro = $con->prepare("INSERT INTO siroWallet (driverId, passengerId, amount, paymentMethod, token, createdAt) VALUES ('passenger', :pid, :amt, :pm, :tok, NOW())");
            $insertSiro->execute([
                ':pid' => $passengerId,
                ':amt' => $originalAmount,
                ':pm' => $paymentMethod,
                ':tok' => $tokenSiro
            ]);
            
            if ($insertSiro->rowCount() === 0) throw new Exception('Insert to siroWallet failed');

            // حرق توكن الشركة
            $con->prepare("UPDATE payment_tokens_passenger SET isUsed = TRUE WHERE token = :t")->execute([':t' => $tokenSiro]);

            // 6. تحديث الفاتورة للنهاية
            $con->prepare("UPDATE invoices_shamcash_passenger SET status = 'completed', paid_at = NOW() WHERE id = :id")->execute([':id' => $invoice_id]);

            $con->commit();
            logFinancialPassenger("SUCCESS", "Deposit finalized for Passenger Inv #$invoice_id | Amount: $finalAmount");
            return true;

        } catch (Throwable $e) {
            $con->rollBack();
            logFinancialPassenger("EXCEPTION", $e->getMessage(), ['id' => $invoice_id]);
            return false;
        }
    }
}
?>