<?php
/**
 * سودانا — BankAnswerEngine v1
 * SECTION 5: Bank Q&A — bilingual (AR/EN)
 * Answers ALL bank-related questions from internal knowledge
 * NO hallucination — answers from system only + traceable
 */
class BankAnswerEngine {

    /**
     * Answer a bank-related question
     * @param string $question — user question (AR or EN)
     * @param string $lang     — 'ar' | 'en' | 'auto'
     * @return array
     */
    public static function answer(string $question, string $lang = 'auto'): array {
        $q       = mb_strtolower(trim($question));
        $traceId = uniqid('bqa_', true);
        $lang    = self::detectLang($q, $lang);

        // Try exact + pattern match from internal KB
        foreach (self::getKnowledgeBase() as $entry) {
            foreach ($entry['patterns'] as $pat) {
                if (preg_match($pat . 'ui', $q)) {
                    return [
                        'matched'    => true,
                        'question'   => $question,
                        'answer'     => $entry[$lang] ?? $entry['ar'],
                        'category'   => $entry['category'],
                        'source'     => 'internal_kb',
                        'confidence' => 0.97,
                        'trace_id'   => $traceId,
                        'lang'       => $lang,
                    ];
                }
            }
        }

        // Fallback: structured "not available" answer
        return [
            'matched'    => false,
            'question'   => $question,
            'answer'     => $lang === 'en'
                ? "This question is outside my current knowledge base. Please contact support at support@sudanna.ai"
                : "هذا السؤال خارج نطاق معلوماتي الحالية. تواصل مع الدعم على support@sudanna.ai",
            'category'   => 'unknown',
            'source'     => 'fallback',
            'confidence' => 0.0,
            'trace_id'   => $traceId,
            'lang'       => $lang,
        ];
    }

    // ── Internal Knowledge Base (bilingual) ─────────────────────
    private static function getKnowledgeBase(): array {
        return [
            // ── Account & Banking Basics ─────────────────────────────
            [
                'category' => 'account',
                'patterns' => ['/رقم.*حساب|account.*number|حساب.*سودانا|الحساب.*بنكي/'],
                'ar' => "رقم الحساب البنكي لسودانا:\n🏦 بنك الخرطوم\n📋 رقم الحساب: 1821425\n\nعند التحويل: أدخل الرقم المرجعي (reference_code) في خانة البيان.",
                'en' => "Sudanna's bank account:\n🏦 Bank of Khartoum\n📋 Account No: 1821425\n\nWhen transferring: enter your reference_code in the description field.",
            ],
            [
                'category' => 'transfer',
                'patterns' => ['/كيف.*أحول|how.*transfer|خطوات.*التحويل|طريقة.*الدفع.*بنكي/'],
                'ar' => "خطوات التحويل البنكي:\n1️⃣ افتح تطبيق بنكك أو انتقل للفرع\n2️⃣ حوّل للحساب: 1821425 (بنك الخرطوم)\n3️⃣ ضع الرقم المرجعي في البيان\n4️⃣ ارفع صورة الإيصال في سودانا\n5️⃣ الموافقة خلال 2 ساعة ✅",
                'en' => "Bank transfer steps:\n1️⃣ Open your bank app or visit a branch\n2️⃣ Transfer to: 1821425 (Bank of Khartoum)\n3️⃣ Put your reference_code in description\n4️⃣ Upload the receipt in Sudanna\n5️⃣ Approval within 2 hours ✅",
            ],
            [
                'category' => 'receipt',
                'patterns' => ['/إيصال|receipt|وصل.*دفع|proof.*payment|رفع.*إيصال/'],
                'ar' => "الإيصال الرقمي 🧾\n\nبعد تأكيد الدفع:\n• إيصال يُولَّد تلقائياً بصيغة: RCP-YYYYMMDD-NNNNNN\n• يُرسَل لبريدك من: finance@sudanna.ai\n• يمكن استرجاعه من: /api/payment/status?ref=رمزك\n\nملاحظة: الإيصال مرتبط بالسجل المحاسبي الكامل.",
                'en' => "Digital Receipt 🧾\n\nAfter payment confirmation:\n• Receipt auto-generated: RCP-YYYYMMDD-NNNNNN\n• Sent to your email from: finance@sudanna.ai\n• Retrieve via: /api/payment/status?ref=your_ref\n\nNote: receipt is linked to the full ledger record.",
            ],
            [
                'category' => 'limits',
                'patterns' => ['/حد.*المعاملات|transaction.*limit|الحد.*اليومي|كم.*أحول|maximum.*transfer/'],
                'ar' => "حدود المعاملات حسب مستوى التوثيق:\n\n• مستوى 0 (بريد): 2,000 SDG/يوم — 500 SDG/معاملة\n• مستوى 1 (هاتف): 10,000 SDG/يوم — 5,000 SDG/معاملة\n• مستوى 2 (هوية): 50,000 SDG/يوم — 25,000 SDG/معاملة\n• مستوى 3 (KYC كامل): 200,000 SDG/يوم\n\n→ وثّق هويتك لرفع الحدود ⬆️",
                'en' => "Transaction limits by KYC level:\n\n• Level 0 (email): 2,000 SDG/day — 500 SDG/txn\n• Level 1 (phone): 10,000 SDG/day — 5,000 SDG/txn\n• Level 2 (ID): 50,000 SDG/day — 25,000 SDG/txn\n• Level 3 (full KYC): 200,000 SDG/day\n\n→ Verify your identity to increase limits ⬆️",
            ],
            [
                'category' => 'reconciliation',
                'patterns' => ['/تسوية|reconciliation|مطابقة.*حسابات|متى.*التسوية|موعد.*الصرف/'],
                'ar' => "التسوية المحاسبية ⚖️\n\nسودانا تُجري تسوية يومية تلقائية:\n• الوقت: 2:30 صباحاً يومياً\n• تُطابق: النظام ↔ السجل المحاسبي ↔ البنك\n• صرف المزودين: بعد التسوية فقط (3:00 صباحاً)\n\nمبدأ: لا صرف قبل التسوية أبداً 🔒",
                'en' => "Accounting Reconciliation ⚖️\n\nSudanna runs automatic daily reconciliation:\n• Time: 2:30 AM daily\n• Matches: System ↔ Ledger ↔ Bank\n• Provider payouts: only after reconciliation (3:00 AM)\n\nPrinciple: no payout before reconciliation 🔒",
            ],
            [
                'category' => 'wallet',
                'patterns' => ['/محفظة|wallet|رصيد.*سودانا|شحن.*محفظة|balance/'],
                'ar' => "المحفظة الرقمية 💰\n\nمحفظة سودانا هي سجل محاسبي (shadow ledger).\n\n• الرصيد يُضاف تلقائياً بعد تأكيد الدفع\n• يُستخدم لدفع الخدمات\n• البنك هو مصدر الحقيقة دائماً\n\nمبدأ: سودانا لا تحتجز أموالك (NO_CUSTODY) ✅",
                'en' => "Digital Wallet 💰\n\nSudanna wallet is an accounting ledger (shadow).\n\n• Balance added automatically after payment confirmation\n• Used to pay for services\n• Bank is always source of truth\n\nPrinciple: Sudanna never holds your money (NO_CUSTODY) ✅",
            ],
            [
                'category' => 'refund',
                'patterns' => ['/استرداد|refund|إرجاع.*مبلغ|رجّع.*فلوسي|cancel.*payment/'],
                'ar' => "الاسترداد ↩️\n\nشروط الاسترداد:\n• الخدمة لم تُنجز بعد\n• الطلب خلال 24 ساعة من الدفع\n\nعملية الاسترداد:\n1️⃣ تواصل مع الدعم\n2️⃣ مراجعة خلال 24 ساعة\n3️⃣ الاسترداد للمحفظة فوراً\n\n4 قيود عكسية تُسجَّل محاسبياً لضمان التوازن ✅",
                'en' => "Refund ↩️\n\nRefund conditions:\n• Service not yet delivered\n• Request within 24 hours of payment\n\nProcess:\n1️⃣ Contact support\n2️⃣ Review within 24 hours\n3️⃣ Refund to wallet immediately\n\n4 reverse ledger entries recorded for accounting balance ✅",
            ],
            [
                'category' => 'security',
                'patterns' => ['/أمان.*الدفع|payment.*security|هل.*آمن|secure.*payment|تشفير/'],
                'ar' => "أمان المدفوعات 🔒\n\n• التوقيع الرقمي: HMAC-SHA256 لكل webhook\n• لا مفاتيح مكشوفة في الكود\n• HTTPS إلزامي لكل الطلبات\n• idempotency: reference_code + txn_id UNIQUE\n• audit_log: كل معاملة مسجلة بـ trace_id\n• AI يفحص كل معاملة: Risk + Fraud + Limits",
                'en' => "Payment Security 🔒\n\n• Digital signature: HMAC-SHA256 for each webhook\n• No exposed keys in code\n• HTTPS mandatory for all requests\n• Idempotency: reference_code + txn_id UNIQUE\n• audit_log: every transaction with trace_id\n• AI checks each transaction: Risk + Fraud + Limits",
            ],
            [
                'category' => 'email',
                'patterns' => ['/بريد.*الدفع|payment.*email|finance@|إيصال.*بريد|تأكيد.*بريد/'],
                'ar' => "بريد تأكيد الدفع 📧\n\nالمُرسِل: finance@sudanna.ai\nمتى يُرسَل: فور تأكيد الدفع\n\nيحتوي على:\n• رقم الإيصال (RCP-...)\n• المبلغ والرمز المرجعي\n• وقت الدفع\n• رابط الإيصال الرقمي\n\nإذا لم يصل: تحقق من Spam أو تواصل معنا.",
                'en' => "Payment confirmation email 📧\n\nSender: finance@sudanna.ai\nWhen: immediately after payment confirmation\n\nContains:\n• Receipt number (RCP-...)\n• Amount and reference code\n• Payment timestamp\n• Digital receipt link\n\nNot received? Check Spam or contact us.",
            ],
            [
                'category' => 'invoice',
                'patterns' => ['/فاتورة|invoice|رمز.*مرجعي|reference.*code|صلاحية.*فاتورة/'],
                'ar' => "الفاتورة 🧾\n\n• تُنشأ تلقائياً عند طلب خدمة مدفوعة\n• الرمز المرجعي: SD-{userId}-{SVC}-{YYYYMMDD}-{RANDOM}\n• الصلاحية: 48 ساعة\n• الحالات: pending → proof_uploaded → paid ✅\n\nقاعدة: لا تنفيذ للخدمة قبل تأكيد الدفع أبداً.",
                'en' => "Invoice 🧾\n\n• Auto-created when a paid service is requested\n• Reference code: SD-{userId}-{SVC}-{YYYYMMDD}-{RANDOM}\n• Validity: 48 hours\n• States: pending → proof_uploaded → paid ✅\n\nRule: service never executed before payment confirmation.",
            ],
        ];
    }

    private static function detectLang(string $q, string $hint): string {
        if ($hint === 'ar' || $hint === 'en') return $hint;
        // Arabic Unicode range
        return preg_match('/[\x{0600}-\x{06FF}]/u', $q) ? 'ar' : 'en';
    }
}
