<?php

namespace App\Core\Flows;

use App\Services\GeminiService;
use App\Models\ChatbotRule;

/**
 * PaymentFlow
 * Handles payment receipt uploads and verification.
 */
class PaymentFlow extends BaseFlow
{
    public function handleStep(string $step, array $messageData, array &$context): FlowResult
    {
        $companyId = $context['company_id'] ?? 1;
        $phone = $messageData['phone'] ?? '';

        switch ($step) {
            case 'start':
                return new FlowResult(
                    "أهلاً بك كابتن. يرجى إرسال صورة **إيصال التحويل المالي أو وصل الدفع** لكي نقوم بمراجعته وإضافته لحسابك:",
                    "awaiting_receipt"
                );

            case 'awaiting_receipt':
                if (empty($messageData['image']) || empty($messageData['imageMimeType'])) {
                    return new FlowResult("الرجاء إرسال صورة وصل الدفع بوضوح للاستمرار، أو اكتب 'إلغاء' للخروج:", "awaiting_receipt");
                }

                if ($companyId !== 1) {
                    if (!\App\Models\CompanySubscriptionUsage::hasRemainingLimit($companyId, 'ocr')) {
                        return new FlowResult("⚠️ عذراً، تجاوز المتجر الحد المسموح لمعالجة الصور لهذا الشهر.", "finished", true);
                    }
                }

                $rule = ChatbotRule::findActiveForRule($companyId);
                $configuredGeminiKey = ($rule && !empty($rule['gemini_api_key'])) ? $rule['gemini_api_key'] : null;
                $apiKey = GeminiService::getGeminiApiKey($configuredGeminiKey);

                if (empty($apiKey)) {
                    return new FlowResult("عذراً، عطل فني في خادم معالجة الصور بالذكاء الاصطناعي. يرجى المحاولة لاحقاً.", "finished", true);
                }

                $imageSystemPrompt = "أنت خبير في مراجعة إيصالات الدفع. استخرج البيانات التالية بدقة بالغة واكتبها بصيغة JSON محاطة بـ [PAYMENT_RECEIPT: { ... }] كالتالي:\n[PAYMENT_RECEIPT: {\"transaction_id\": \"رقم المعاملة أو الحوالة هنا\", \"amount\": \"المبلغ المستخرج كأرقام فقط\", \"method\": \"طريقة الدفع مثل Syriatel Cash أو Bemo Bank\"}]\nفي حال عدم وضوح الإيصال، أرجع JSON فارغًا.";
                
                $mimeType = $messageData['imageMimeType'];
                if (strpos($mimeType, ';') !== false) {
                    $mimeType = trim(explode(';', $mimeType)[0]);
                }

                $replyText = GeminiService::generateResponseFromImage($apiKey, $imageSystemPrompt, $messageData['image'], $mimeType);

                if ($companyId !== 1) {
                    \App\Models\CompanySubscriptionUsage::incrementUsage($companyId, 'ocr');
                    \App\Models\CompanySubscriptionUsage::incrementUsage($companyId, 'request');
                }

                if (!empty($replyText) && preg_match('/\[PAYMENT_RECEIPT:\s*(\{.*?\})\]/s', $replyText, $matches)) {
                    $jsonStr = $matches[1];
                    $verificationResult = \App\Controllers\WhatsAppController::verifyPaymentSlipStatic($companyId, $phone, $jsonStr);
                    
                    if ($verificationResult) {
                        return new FlowResult("تم فحص الإيصال:\n" . $verificationResult, "finished", true);
                    } else {
                        return new FlowResult("لم نتمكن من التأكد من بيانات الإيصال. يرجى إرسال صورة أوضح أو التواصل مع الدعم الفني.", "finished", true);
                    }
                }

                return new FlowResult("لم أتمكن من التعرف على بيانات الإيصال المرفق. يرجى التأكد من وضوح الصورة وإعادة المحاولة.", "awaiting_receipt");

            default:
                return new FlowResult("حدث خطأ في المسار.", "finished", true);
        }
    }
}
