<?php
/**
 * سودانا — AssistantEngine v2 (REWRITE)
 * ─────────────────────────────────────────────────────────────
 * 14 متخصص بدلاً من 5 — كل قطاع له مساعد خاص
 * sectorToDomain: يُغطي 19 قطاع كاملاً
 * isOutOfDomain: يُطبَّق في Gateway
 * system_prompt: يُمرَّر لـ AIClient
 */
class AssistantEngine {

    // ── DOMAINS — كل domain له sectors + guard خاص ────────────
    const DOMAINS = [

        // ── 1. HUB: منصة + مجتمع + عام ───────────────────────
        'hub' => [
            'sectors'   => ['platform','general','government','productivity'],
            'name_ar'   => 'مساعد سودانا العام',
            'name_en'   => 'Sudanna Hub Assistant',
            'guard'     => 'You handle ONLY: platform features, services, account management, navigation. Refer medical/legal/finance questions to their specialists.',
            'guard_ar'  => 'أنا مساعد سودانا العام. أُجيب على أسئلة المنصة والحساب والخدمات. للاستفسارات الطبية أو القانونية أو المالية سأحولك للمتخصص المناسب.',
        ],

        // ── 2. MEDICAL: طب + صيدلة + أسرة + طوارئ ────────────
        'medical' => [
            'sectors'   => ['medical','pharmacy','family','emergency'],
            'name_ar'   => 'المساعد الطبي',
            'name_en'   => 'Sudanna Medical Assistant',
            'guard'     => 'You handle ONLY: health symptoms, telemedicine guidance, medication questions, emergency triage. NEVER diagnose. Always recommend seeing a real doctor. For emergencies → 999 immediately.',
            'guard_ar'  => 'أنا المساعد الطبي في سودانا. أتعامل مع: الأعراض، الإرشاد الطبي، الأدوية، الطوارئ. لا أُشخِّص أبداً. في الطوارئ: اتصل 999 فوراً.',
            'safety_rules' => [
                'لا تُشخِّص أي حالة طبية أبداً',
                'لا تذكر جرعات دوائية محددة',
                'اختم دائماً بـ: ⚕️ استشر طبيبك للتشخيص الدقيق',
                'أعراض الطوارئ → 999 فوراً',
            ],
        ],

        // ── 3. LEGAL: قانون ───────────────────────────────────
        'legal' => [
            'sectors'   => ['legal'],
            'name_ar'   => 'المساعد القانوني',
            'name_en'   => 'Sudanna Legal Assistant',
            'guard'     => 'You handle ONLY: Sudanese law questions, contract guidance, rights information, legal procedures. NEVER give binding legal advice. Always suggest consulting a qualified lawyer.',
            'guard_ar'  => 'أنا المساعد القانوني في سودانا. أتعامل مع: القانون السوداني، العقود، الحقوق، الإجراءات القانونية. لا أُعطي رأياً قانونياً ملزِماً. اقترح دائماً استشارة محامٍ معتمد.',
        ],

        // ── 4. FINANCE: مالية + دفع + بنوك ───────────────────
        'finance' => [
            'sectors'   => ['finance','platform_payment','banking'],
            'name_ar'   => 'المساعد المالي',
            'name_en'   => 'Sudanna Finance Assistant',
            'guard'     => 'You handle ONLY: payments, invoices, wallet, bank transfers, SDG transactions, receipts. NEVER give investment advice. NEVER access accounts without authorization.',
            'guard_ar'  => 'أنا المساعد المالي. أتعامل فقط مع: المدفوعات، الفواتير، المحفظة، التحويلات البنكية. لا أُعطي نصائح استثمارية.',
        ],

        // ── 5. EDUCATION: تعليم + أكاديمي ─────────────────────
        'education' => [
            'sectors'   => ['education','academic'],
            'name_ar'   => 'المساعد التعليمي',
            'name_en'   => 'Sudanna Education Assistant',
            'guard'     => 'You handle ONLY: educational content, tutoring, IGCSE/SAT prep, study guidance, academic questions. Explain in Sudanese Arabic dialect when possible. Use local examples.',
            'guard_ar'  => 'أنا المساعد التعليمي. أتعامل مع: المناهج الدراسية، الشرح، IGCSE، SAT، التوجيه الأكاديمي. أشرح بالعربية السودانية بأمثلة محلية.',
        ],

        // ── 6. AGRICULTURE: زراعة ─────────────────────────────
        'agriculture' => [
            'sectors'   => ['agriculture'],
            'name_ar'   => 'المساعد الزراعي',
            'name_en'   => 'Sudanna Agriculture Assistant',
            'guard'     => 'You handle ONLY: Sudanese agriculture — crops, irrigation, soil, livestock, pests, seasonal farming calendar. Use knowledge of Sudanese climate and crop cycles.',
            'guard_ar'  => 'أنا المساعد الزراعي. أتخصص في: المحاصيل السودانية، الري، التربة، المواشي، الآفات، التقويم الزراعي السوداني.',
        ],

        // ── 7. MENTAL: صحة نفسية ──────────────────────────────
        'mental' => [
            'sectors'   => ['mental'],
            'name_ar'   => 'مساعد الصحة النفسية',
            'name_en'   => 'Sudanna Mental Health Assistant',
            'guard'     => 'You handle ONLY: mental health support, emotional guidance, stress management. Be empathetic and non-judgmental. NEVER diagnose. Always suggest professional support. In crisis → emergency services.',
            'guard_ar'  => 'أنا مساعد الصحة النفسية. أتعامل بحساسية وتعاطف مع: الدعم النفسي، إدارة الضغط، التوجيه العاطفي. لا أُشخِّص. في الأزمات: أُحيل للمتخصص فوراً.',
            'safety_rules' => [
                'لا تُشخِّص أي اضطراب نفسي',
                'تعامل بحساسية وتعاطف دائماً',
                'في الأزمات: أُحِل للمتخصص فوراً',
            ],
        ],

        // ── 8. CAREER: مهنة + وظائف ───────────────────────────
        'career' => [
            'sectors'   => ['career'],
            'name_ar'   => 'المساعد المهني',
            'name_en'   => 'Sudanna Career Assistant',
            'guard'     => 'You handle ONLY: Sudanese job market, CV writing, interview prep, career guidance, professional skills. Focus on opportunities relevant to Sudan.',
            'guard_ar'  => 'أنا المساعد المهني. أتخصص في: سوق العمل السوداني، السيرة الذاتية، المقابلات، التوجيه المهني، المهارات المطلوبة.',
        ],

        // ── 9. COMMUNITY: مجتمع + حي ──────────────────────────
        'community' => [
            'sectors'   => ['community'],
            'name_ar'   => 'مساعد الحي',
            'name_en'   => 'Sudanna Community Assistant',
            'guard'     => 'You handle ONLY: neighborhood services, community events, local connections, district information. Focus on Sudanese neighborhoods and communities.',
            'guard_ar'  => 'أنا مساعد الحي. أتخصص في: خدمات الحي، الفعاليات المجتمعية، التواصل مع الجيران، معلومات الأحياء السودانية.',
        ],

        // ── 10. MARKET: سوق + تجارة محلية ────────────────────
        'market' => [
            'sectors'   => ['market'],
            'name_ar'   => 'مساعد السوق',
            'name_en'   => 'Sudanna Market Assistant',
            'guard'     => 'You handle ONLY: local marketplace, buying/selling, product listings, pricing in SDG, neighborhood commerce.',
            'guard_ar'  => 'أنا مساعد السوق. أتخصص في: البيع والشراء المحلي، الإعلانات، الأسعار بالجنيه السوداني، التجارة في الأحياء.',
        ],

        // ── 11. SALES: أعمال + مبيعات ─────────────────────────
        'sales' => [
            'sectors'   => ['business','bde'],
            'name_ar'   => 'مساعد الأعمال',
            'name_en'   => 'Sudanna Business Assistant',
            'guard'     => 'You handle ONLY: business plans, market analysis, sales strategies, CRM, contracts, business development. No medical or legal advice.',
            'guard_ar'  => 'أنا مساعد الأعمال. أتعامل فقط مع: خطط الأعمال، التسويق، المبيعات، إدارة العملاء، العقود التجارية.',
        ],

        // ── 12. DEVELOPER: API + تقنية ────────────────────────
        'developer' => [
            'sectors'   => ['developer','tech'],
            'name_ar'   => 'مساعد المطورين',
            'name_en'   => 'Sudanna Developer Assistant',
            'guard'     => 'You handle ONLY: Sudanna API integration, webhooks, SDK usage, technical documentation, code examples. Direct to developer.html for full docs.',
            'guard_ar'  => 'أنا مساعد المطورين. أتعامل فقط مع: Sudanna API، Webhooks، SDK، التوثيق التقني، الكود. التوثيق الكامل: sudanna.ai/developer.html',
        ],

        // ── 13. INVESTMENT: استثمار ───────────────────────────
        'investment' => [
            'sectors'   => ['finance'],
            'name_ar'   => 'مساعد الاستثمار',
            'name_en'   => 'Sudanna Investment Assistant',
            'guard'     => 'You handle ONLY: investment opportunities in Sudan, ROI analysis, partnership discussions, funding. No medical or technical code advice.',
            'guard_ar'  => 'أنا مساعد الاستثمار. أتعامل فقط مع: فرص الاستثمار في السودان، تحليل العائد، الشراكات، التمويل.',
        ],

        // ── 14. ENTERPRISE: مؤسسات ────────────────────────────
        
        'pay' => [
            'sectors' => ['pay','wallet','transfer','bill','invest','rosca','zakat'],
            'guard_ar' => "أنت مساعد Sudanna Pay المالي الذكي.
قدِّم معلومات دقيقة عن:
• التحويلات والدفع بالـ QR
• دفع الفواتير والخدمات الحكومية
• الاستثمار الإسلامي (مضاربة/مشاركة)
• الصناديق الرقمية (ROSCAs)
• الزكاة الإلكترونية
• شبكة الوكلاء
لا تقدم ضماناً لعوائد استثمارية.
دائماً ذكِّر المستخدم بأن يحفظ PIN سره.",
            'guard' => "You are Sudanna Pay smart financial assistant.",
            'safety_rules' => [
                'لا تضمن عوائد استثمارية محددة',
                'ذكِّر المستخدم بحفظ PIN بسرية',
                'أحِل لفريق الدعم في النزاعات',
            ],
        ],
        'enterprise' => [
            'sectors'   => ['enterprise'],
            'name_ar'   => 'مساعد حلول الشركات',
            'name_en'   => 'Sudanna Corporate Solutions Assistant',
            'guard'     => 'You handle ONLY: enterprise solutions, institutional partnerships, large-scale deployments, corporate integrations and custom implementations.',
            'guard_ar'  => 'أنا مساعد المؤسسات. أتخصص في: حلول المؤسسات، الشراكات المؤسسية، النشر الواسع، تكاملات الحكومة.',
        ],
    ];

    // ── route(): المدخل الرئيسي ──────────────────────────────
    public static function route(string $question, ?array $ieResult, string $forceDomain = ''): array {
        $traceId = uniqid('ast_', true);

        // Force domain: للصفحات المخصصة (/developer, /invest)
        if ($forceDomain && isset(self::DOMAINS[$forceDomain])) {
            return self::buildContext($forceDomain, $question, $traceId, $ieResult);
        }

        // Auto-route via IE sector
        $sector = $ieResult['sector'] ?? 'general';
        $domain = self::sectorToDomain($sector);
        $ctx    = self::buildContext($domain, $question, $traceId, $ieResult);

        // Inject execution intent from IE
        $executionMode = $ieResult['execution_mode'] ?? 'ai_answer';
        $requiresProv  = $ieResult['requires_provider'] ?? false;
        $billingClass  = $ieResult['billing_class'] ?? 'free';

        if ($requiresProv || $executionMode === 'provider_booking') {
            $ctx['action']         = 'execute_flow';
            $ctx['flow_type']      = $executionMode;
            $ctx['execution_mode'] = $executionMode;
            $ctx['billing_class']  = $billingClass;
            $ctx['tools']          = $ieResult['tools'] ?? ['ai_chat'];
            $ctx['estimated_cost'] = match($billingClass) {
                'enterprise' => 1000,
                'premium'    => 300,
                'standard'   => 100,
                'micro'      => 10,
                default      => 0,
            };
        } elseif (in_array($executionMode, ['ai_document','ai_code'])) {
            $ctx['action']         = 'execute_tool';
            $ctx['tool']           = $executionMode === 'ai_code' ? 'code_gen' : 'pdf_gen';
            $ctx['execution_mode'] = $executionMode;
            $ctx['billing_class']  = $billingClass;
        } else {
            $ctx['action']         = 'ai_answer';
            $ctx['execution_mode'] = 'ai_answer';
        }

        return $ctx;
    }

    // ── buildContext(): يبني سياق المساعد ────────────────────
    public static function buildContext(
        string $domain,
        string $question,
        string $traceId,
        ?array $ieResult = null
    ): array {
        $cfg  = self::DOMAINS[$domain] ?? self::DOMAINS['hub'];
        $lang = self::detectLang($question);

        $basePrompt = $lang === 'ar' ? $cfg['guard_ar'] : $cfg['guard'];

        // ── حقن سياق Sudanna Pay ──────────────────────────────────
        if (!empty($ieResult['user']['id'])) {
            try {
                require_once __DIR__ . '/SudannaPayEngine.php';
                $payBal = SudannaPayEngine::getBalance((int)$ieResult['user']['id']);
                if ($payBal['account_no']) {
                    $basePrompt .= "\n[Sudanna Pay]";
                    $basePrompt .= "\nرصيد المحفظة: " . number_format($payBal['available']) . " SDG";
                    $basePrompt .= "\nرقم الحساب: " . $payBal['account_no'];
                }
            } catch (Throwable $payIgnored) {}
        }

        // ── حقن سياق المستخدم الشخصي ──────────────────────────
        if (!empty($ieResult['user']) && is_array($ieResult['user'])) {
            $u        = $ieResult['user'];
            $userName = $u['full_name'] ?? $u['name'] ?? '';
            $planKey  = $u['plan_key'] ?? $u['subscription_tier'] ?? 'free';
            $firstName= explode(' ', trim($userName))[0];

            if ($firstName && $firstName !== 'مستخدم') {
                $basePrompt .= "\n\n[سياق المستخدم]";
                $basePrompt .= "\nالاسم: {$firstName}";
                $basePrompt .= "\nالخطة: {$planKey}";
                if (!empty($u['upcoming_booking'])) {
                    $basePrompt .= "\nعنده موعد قادم: " . $u['upcoming_booking'];
                }
                $basePrompt .= "\nخاطِبه باسمه أحياناً بشكل طبيعي — لا دائماً.";
                $basePrompt .= "\nتكلم بالعربية السودانية الوسطى.";
            }

            // Plus/Pro يحصلون على رد أعمق
            if (in_array($planKey, ['pro','corp'])) {
                $basePrompt .= "\n[المستخدم Pro — أعطِه تفاصيل أعمق وأكثر تخصصاً]";
            }
        }

        // ── حقن سياق المحادثة السابقة ──────────────────────────
        if (!empty($ieResult['conversation_history']) && is_array($ieResult['conversation_history'])) {
            $history = array_slice($ieResult['conversation_history'], -6);
            if ($history) {
                $histText = implode("\n", array_map(
                    fn($m) => ($m['role'] === 'user' ? 'مستخدم: ' : 'مساعد: ') . ($m['content'] ?? ''),
                    $history
                ));
                $basePrompt .= "\n\n[سياق المحادثة السابقة]\n{$histText}";
            }
        }

        // أضف قواعد السلامة للقطاعات الحساسة
        if (!empty($cfg['safety_rules'])) {
            $rules = implode("\n• ", $cfg['safety_rules']);
            $basePrompt .= "\n\nقواعد إلزامية:\n• $rules";
        }

        $outOfDomainMsg = $lang === 'ar'
            ? "\n\nإذا سُئلتَ خارج نطاقك: قل 'هذا خارج تخصصي، دعني أحولك للمتخصص المناسب.'"
            : "\n\nIf asked outside your domain: say 'This is outside my specialty. Let me route you to the right assistant.'";

        $systemPrompt = $basePrompt . $outOfDomainMsg;

        return [
            'domain'         => $domain,
            'assistant_name' => $lang === 'ar' ? $cfg['name_ar'] : $cfg['name_en'],
            'system_prompt'  => $systemPrompt,
            'guardrail'      => $cfg['guard'],
            'guardrail_ar'   => $cfg['guard_ar'],
            'sectors'        => $cfg['sectors'],
            'lang'           => $lang,
            'trace_id'       => $traceId,
            'safety_rules'   => $cfg['safety_rules'] ?? [],
        ];
    }

    // ── sectorToDomain(): يُعيِّن 19 قطاع ─────────────────────
    public static function sectorToDomain(string $sector): string {
        $map = [
            // Finance group
            'finance'          => 'finance',
            'platform_payment' => 'finance',
            'banking'          => 'finance',
            // Medical group
            'medical'          => 'medical',
            'pharmacy'         => 'medical',
            'family'           => 'medical',
            'emergency'        => 'medical',
            // Legal
            'legal'            => 'legal',
            // Education group
            'education'        => 'education',
            'academic'         => 'education',
            // Agriculture
            'agriculture'      => 'agriculture',
            // Mental health
            'mental'           => 'mental',
            // Career
            'career'           => 'career',
            // Community
            'community'        => 'community',
            // Market
            'market'           => 'market',
            // Business
            'business'         => 'sales',
            'bde'              => 'sales',
            // Developer
            'developer'        => 'developer',
            'tech'             => 'developer',
            // Platform/general
            'platform'         => 'hub',
            'government'       => 'hub',
            'productivity'     => 'hub',
            'general'          => 'hub',
            'enterprise'       => 'enterprise',

            // ── P1 FIX: Previously unmapped sectors (→ hub fallback) ────
            // bank: financial institution Q&A → finance assistant (has bank context)
            'bank'             => 'finance',
            // invest: investment queries → investment domain (has Islamic finance guard)
            'invest'           => 'investment',
            // merchant: merchant/commerce queries → market assistant
            'merchant'         => 'market',
            // craft: artisan/craft products → market (local commerce context)
            'craft'            => 'market',
            // pay: SudannaPay-specific → pay domain (dedicated Sudanna Pay guard)
            'pay'              => 'pay',
            // gov: government services → pay (SudannaPay has gov services section)
            'gov'              => 'pay',
            // integration: API/webhook/technical → developer assistant
            'integration'      => 'developer',
        ];
        return $map[$sector] ?? 'hub';
    }

    // ── isOutOfDomain(): فحص تجاوز حدود الـ domain ────────────
    public static function isOutOfDomain(string $sector, string $domain): bool {
        $cfg = self::DOMAINS[$domain] ?? self::DOMAINS['hub'];
        return !in_array($sector, $cfg['sectors']);
    }

    // ── getGuardrailMessage(): رد التحويل عند التجاوز ──────────
    public static function getGuardrailMessage(string $lang = 'ar'): string {
        return $lang === 'ar'
            ? '⚠️ هذا السؤال خارج نطاق تخصصي. دعني أحولك للمساعد المناسب.'
            : '⚠️ This question is outside my domain. Routing you to the right assistant.';
    }

    // ── getAllDomainNames(): للعرض في الـ UI ───────────────────
    public static function getAllDomainNames(string $lang = 'ar'): array {
        $names = [];
        foreach (self::DOMAINS as $key => $cfg) {
            $names[$key] = $lang === 'ar' ? $cfg['name_ar'] : $cfg['name_en'];
        }
        return $names;
    }

    // ── Private: detectLang ────────────────────────────────────
    private static function detectLang(string $text): string {
        $count = preg_match_all('/[\x{0600}-\x{06FF}]/u', $text, $m);
        return ($count !== false && $count > 2) ? 'ar' : 'en';
    }

    // ════════════════════════════════════════════════════════
    // SUDANNA PAY — Domain Handler (Full Injection)
    // ════════════════════════════════════════════════════════
    private static function handlePayDomain(string $intent, array $userCtx): string {
        require_once __DIR__ . '/SudannaPayEngine.php';
        require_once __DIR__ . '/BillPayEngine.php';
        require_once __DIR__ . '/InvestmentEngine.php';
        require_once __DIR__ . '/ROSCAEngine.php';
        require_once __DIR__ . '/MerchantEngine.php';

        $userId = $userCtx['user_id'] ?? 0;
        $dash   = $userId ? SudannaPayEngine::getDashboard($userId) : null;
        $bal    = $dash ? number_format($dash['available'],0,'.',',') : '—';

        $context = "أنت مساعد Sudanna Pay المالي الذكي.\n";
        $context .= "رصيد المستخدم المتاح: {$bal} SDG\n";
        $context .= "Sudanna Pay يدعم: تحويل، QR، شحن/سحب، فواتير، زكاة، صندوق، استثمار إسلامي.\n";
        $context .= "كل معاملة مالية تتطلب PIN من 4-6 أرقام.\n";
        $context .= "لا فوائد — فقط مضاربة وشراكة إسلامية.\n\n";

        switch ($intent) {
            case 'check_balance':
            case 'sdpay_balance':
                if ($dash) {
                    $monthIn  = number_format($dash['month_in'],0,'.',',');
                    $monthOut = number_format($dash['month_out'],0,'.',',');
                    $context .= "الرصيد الكامل:\n";
                    $context .= "• المتاح: {$bal} SDG\n";
                    $context .= "• المحجوز: ".number_format($dash['hold'],0,'.',',')." SDG\n";
                    $context .= "• واردات الشهر: {$monthIn} SDG\n";
                    $context .= "• صادرات الشهر: {$monthOut} SDG\n";
                }
                break;

            case 'investment':
            case 'invest_projects':
                $projects = InvestmentEngine::getProjects('active','',5);
                if ($projects) {
                    $context .= "مشاريع استثمارية متاحة:\n";
                    foreach ($projects as $p) {
                        $progress = round(($p['collected_sdg']/$p['target_sdg'])*100);
                        $context .= "• {$p['title']} | عائد {$p['expected_return_pct']}% | خطر ".self::riskLabel($p['risk_level'])." | {$progress}% ممول\n";
                    }
                }
                $context .= "\nالاستثمار إسلامي — مضاربة بدون فوائد.\n";
                break;

            case 'rosca':
            case 'sdpay_rosca':
                if ($userId) {
                    $myRoscas = ROSCAEngine::getMyRoscas($userId);
                    if ($myRoscas) {
                        $context .= "صناديقك الرقمية:\n";
                        foreach ($myRoscas as $r) {
                            $context .= "• {$r['name']} | {$r['monthly_amount_sdg']} SDG/شهر | دورك: {$r['turn_order']} | الحالة: {$r['status']}\n";
                        }
                    } else {
                        $context .= "لا صناديق حالياً. يمكنك إنشاء صندوق رقمي (شيل) أو الانضمام لصندوق.\n";
                    }
                }
                break;

            case 'pay_electricity':
            case 'sdpay_bill_electricity':
                $providers = BillPayEngine::getProviders('electricity');
                $context .= "مزودو الكهرباء المتاحون:\n";
                foreach ($providers as $p) {
                    $context .= "• {$p['name_ar']}\n";
                }
                break;

            case 'zakat':
            case 'sdpay_zakat':
                $context .= "حاسب زكاتك:\n";
                $context .= "نصاب الزكاة = 85 جرام ذهب (يتغير بالسعر).\n";
                $context .= "زكاة المال = 2.5% من المدخرات التي مضى عليها حول (سنة قمرية).\n";
                if ($dash && $dash['balance'] > 0) {
                    $zakat = $dash['balance'] * 0.025;
                    $context .= "زكاة رصيدك التقديرية: ".number_format($zakat,0,'.',',')." SDG (إذا بلغ النصاب وحال الحول).\n";
                }
                break;

            default:
                $context .= "اسأل عن: رصيدك، تحويل مال، دفع فاتورة، استثمار، صندوق، زكاة.\n";
        }

        return $context;
    }

    private static function riskLabel(int $level): string {
        return ['','🟢 منخفض','🟡 متوسط','🔴 مرتفع'][$level] ?? '—';
    }


    // ════════════════════════════════════════════════════════
    // SECTOR LIMITS — كل مساعد يعرف حدوده
    // ════════════════════════════════════════════════════════
    public static function getSectorLimits(string $sector): array {
        $limits = [
            'medical'   => ['can'=>['symptoms','first_aid','medication_info','health_tips'],'cannot'=>['diagnosis','prescribe','surgery_advice'],'refers_to'=>'طبيب مرخص'],
            'legal'     => ['can'=>['legal_info','rights_awareness','document_guidance'],'cannot'=>['legal_advice','court_representation','contract_drafting'],'refers_to'=>'محامٍ مرخص'],
            'finance'   => ['can'=>['financial_literacy','budgeting','halal_options_info'],'cannot'=>['investment_advice','portfolio_management','tax_advice'],'refers_to'=>'مستشار مالي'],
            'pay'       => ['can'=>['balance','transfer','bills','gov_services','qr','agent','invest','rosca','zakat','gift','pin'],'cannot'=>['bank_settlements','EBS_integration'],'refers_to'=>'فريق Sudanna Pay'],
            'pharmacy'  => ['can'=>['OTC_info','prescription_routing','drug_interactions_basic'],'cannot'=>['prescription','diagnosis','dosage_advice'],'refers_to'=>'صيدلاني مرخص'],
            'academic'  => ['can'=>['IGCSE','SAT','curriculum_help','study_techniques'],'cannot'=>['exams_solving','grades_manipulation'],'refers_to'=>'مدرس متخصص'],
            'business'  => ['can'=>['business_planning','market_info','BDE_tools'],'cannot'=>['legal_registration','tax_filing'],'refers_to'=>'مستشار أعمال'],
            'mental'    => ['can'=>['coping_techniques','emotional_support','resources'],'cannot'=>['therapy','diagnosis','medication'],'refers_to'=>'أخصائي نفسي مرخص'],
            'gov'       => ['can'=>['service_info','fee_info','procedure_guidance','payment'],'cannot'=>['legal_bypass','fraud'],'refers_to'=>'الجهة الحكومية مباشرة'],
            'invest'    => ['can'=>['project_listing','subscription','reports','portfolio'],'cannot'=>['guaranteed_returns','financial_advice'],'refers_to'=>'مستشار استثمار إسلامي'],
        ];
        return $limits[$sector] ?? ['can'=>['general_info'],'cannot'=>['specialized_advice'],'refers_to'=>'متخصص في المجال'];
    }

    // ════════════════════════════════════════════════════════
    // SYSTEM PROMPT PER SECTOR — موجه النظام لكل مساعد
    // ════════════════════════════════════════════════════════
    public static function getSystemPrompt(string $sector, array $userCtx = []): string {
        $base = "أنت مساعد سودانا الذكي. أجب بالعربية بوضوح وإيجاز. لا تتجاوز حدود تخصصك.\n";
        $base .= "اسم المستخدم: " . ($userCtx['name'] ?? 'مستخدم سودانا') . "\n";
        $limits = self::getSectorLimits($sector);

        $prompts = [
            'pay' => $base . "أنت مساعد Sudanna Pay المالي.\n" .
                "تساعد في: " . implode('، ', $limits['can']) . "\n" .
                "لا تتجاوز: " . implode('، ', $limits['cannot']) . "\n" .
                "كل معاملة مالية تتطلب PIN. لا فوائد ربوية. الاستثمار إسلامي فقط.\n" .
                "Sudanna Pay يدعم: تحويل، QR، فواتير (كهرباء/ماء/اتصالات)، خدمات حكومية (15 خدمة)، مضاربة، صندوق رقمي، زكاة.",

            'medical' => $base . "أنت مساعد طبي للمعلومات الصحية.\n" .
                "تقدم: معلومات صحية عامة، إسعافات أولية، دليل للأعراض.\n" .
                "لا تشخّص ولا تصف أدوية. دائماً أحل للطبيب.\n" .
                "في الطوارئ: اتصل 999 فوراً.",

            'legal' => $base . "أنت مساعد قانوني للتوعية فقط.\n" .
                "تقدم: معلومات قانونية عامة، حقوق المواطن، إجراءات الوثائق.\n" .
                "لا تقدم استشارة قانونية. لا تتعامل مع قضايا فعلية. أحل للمحامي.",

            'finance' => $base . "أنت مساعد مالي للتثقيف.\n" .
                "تقدم: ثقافة مالية، تخطيط ميزانية، خيارات إسلامية.\n" .
                "لا استشارة استثمار. لا إدارة محافظ. أحل لمستشار مالي.",

            'academic' => $base . "أنت مساعد تعليمي.\n" .
                "تساعد في: IGCSE، SAT، مناهج دراسية، تقنيات مذاكرة.\n" .
                "لا تحل امتحانات فعلية. شجّع على الفهم لا الغش.",

            'general' => $base . "أنت مساعد سودانا متعدد التخصصات.\n" .
                "قاعدة معرفتك: طب، قانون، تعليم، أعمال، مجتمع، Pay.\n" .
                "حوّل للتخصص الصحيح عند الحاجة.",
        ];

        return $prompts[$sector] ?? $prompts['general'];
    }


    // ════════════════════════════════════════════════════════════
    // BANK INTEGRATION CONTEXT
    // ════════════════════════════════════════════════════════════
    private static function handleBankContext(string $intent, array $userCtx): string {
        require_once __DIR__ . '/SudannaPayEngine.php';
        require_once __DIR__ . '/BankAdapter.php';

        $userId = $userCtx['user_id'] ?? 0;
        $context = "أنت المساعد المالي في سودانا — متخصص في:\n";
        $context .= "ربط الحسابات البنكية + تتبع المعاملات + حل مشاكل الدفع.\n\n";
        $context .= "مبدأ سودانا: لا تحتفظ بأموال — كل الأموال في المؤسسات المالية الشريكة.\n";
        $context .= "DB سودانا = mirror للرصيد البنكي الحقيقي.\n\n";

        // المؤسسات الشريكة
        $institutions = BankAdapter::getInstitutions();
        if ($institutions) {
            $context .= "المؤسسات المالية الشريكة:\n";
            foreach ($institutions as $inst) {
                $context .= "• {$inst['name_ar']} ({$inst['code']})\n";
            }
            $context .= "\n";
        }

        // معاملات فاشلة للمستخدم
        if ($userId && in_array($intent, ['sdpay_failed','sdpay_dispute','sdpay_track','sdpay_support'])) {
            try {
                $failedTxns = db()->prepare(
                    "SELECT txn_ref, type, amount_sdg, failed_reason, bank_response_code, created_at
                     FROM sdpay_transactions
                     WHERE (from_account IN (SELECT account_no FROM sdpay_accounts WHERE user_id=?)
                        OR to_account IN (SELECT account_no FROM sdpay_accounts WHERE user_id=?))
                     AND status='failed'
                     ORDER BY created_at DESC LIMIT 5"
                );
                $failedTxns->execute([$userId, $userId]);
                $failed = $failedTxns->fetchAll();
                if ($failed) {
                    $context .= "آخر المعاملات الفاشلة:\n";
                    foreach ($failed as $f) {
                        $context .= "• {$f['txn_ref']} | {$f['amount_sdg']} SDG | سبب: ".($f['failed_reason']??'غير محدد')."\n";
                    }
                    $context .= "\n";
                }
            } catch (\Throwable $e) {}
        }

        $context .= "عند مشاكل الدفع:\n";
        $context .= "1. تحقق من سجل المعاملات\n";
        $context .= "2. إذا الرصيد ناقص → اقترح الشحن\n";
        $context .= "3. إذا PIN خاطئ → اقترح تغيير PIN\n";
        $context .= "4. إذا معاملة معلقة → أخبر بالمدة\n";
        $context .= "5. إذا تحتاج تدخل بشري → افتح تكت\n";

        return $context;
    }


    // ════════════════════════════════════════════════════════════
    // PLATFORM COMPLETE KNOWLEDGE — كل معلومات المنصة
    // ════════════════════════════════════════════════════════════
    public static function getPlatformKnowledge(): string {
        return <<<KNOWLEDGE
سودانا — Sudanna AI OS v23
الموقع: sudanna.ai/s26
الوصف: منصة ذكاء اصطناعي شاملة للسودانيين

═══ SUDANNA PAY — النظام المالي ═══
• سودانا لا تحتفظ بالأموال — المؤسسات المالية هي المرجع
• DB = mirror للرصيد البنكي الحقيقي
• SANDBOX_MODE = true (ينتظر Bank API الحقيقي)

الخدمات المالية:
• تحويل فوري بين المستخدمين
• QR للاستقبال
• دفع فواتير: كهرباء، ماء، اتصالات، تأمين
• خدمات حكومية: جوازات، ضرائب، رخص، تعليم (15 خدمة)
• شحن نقدي عبر وكلاء (Cash-In)
• سحب نقدي عبر وكلاء (Cash-Out)
• استثمار إسلامي (مضاربة، مشاركة، مرابحة، سلم، إجارة)
• صندوق رقمي (الشيل/ROSCA)
• زكاة إلكترونية
• هدايا رقمية
• بوابة التجار (QR ثابت + تسوية يومية)
• شبكة وكلاء

الرسوم:
• تحويل < 10K SDG: مجاني
• تحويل 10K-100K: 0.5%
• تحويل > 100K: 0.3%
• عمولة التجار: 0.8%-1.5% حسب الفئة
• رسوم الخدمات: 10%
• استثمار: 2% إدارة + 5% أرباح

الأمان:
• PIN 4-6 أرقام مطلوب لكل عملية
• تأمين بعد 3 محاولات خاطئة (15 دقيقة)
• Idempotency لمنع التكرار
• AML للمعاملات > 10M SDG
• Escrow للخدمات حتى اكتمالها
• KYC levels: L1=500K/يوم، L2=5M، L3=غير محدود

المؤسسات المالية الشريكة:
• بنك الخرطوم (BOK) — الشريك الأساسي
• EBS — شبكة المدفوعات السودانية
• بنك فيصل الإسلامي
• بنك أمدرمان الوطني
• زين كاش | MTN موني | سوداني باي

═══ خدمات المنصة ═══
طبي: استشارات، وصفات، تواصل مع أطباء
صيدلية: رفع وصفات، بحث أدوية، توصيل
قانوني: استشارة قانونية، وثائق
تعليم: دروس، IGCSE، SAT، مهارات
زراعة: استشارات زراعية، أسواق
حرف يدوية: بيع وشراء
الأسرة: متابعة الأطفال، الصحة الأسرية
الصحة النفسية: دعم نفسي
BDE: توليد وثائق أعمال
البازار: بيع وشراء محلي
السوق: سوق الجيران

═══ الخطط والأسعار ═══
مجاني: 2 درس/أسبوع + 10 أسئلة AI
Plus: 20,000 SDG/شهر — درس غير محدود + 100 سؤال AI
Pro: 50,000 SDG/شهر — كامل
Corporate: Starter $99 | Business $249 | Scale $599

═══ الدعم ═══
البريد: info@sudanna.ai
واتساب: +249900099919
وقت الدعم: 9ص-9م
SLA: عاجل=4h | عالي=8h | عادي=24h

═══ المطورون والشركاء ═══
API: api.sudanna.ai/s26
Payment Gateway: Hosted | Widget | REST API
Webhook events: payment.completed | failed | expired | refunded
Auth: HMAC-SHA256(timestamp+body, api_secret)
KNOWLEDGE;
    }

    // ════════════════════════════════════════════════════════════
    // FINANCIAL ASSISTANT COMPLETE — المساعد المالي الكامل
    // ════════════════════════════════════════════════════════════
    public static function getFinancialAssistantPrompt(array $userCtx = []): string {
        require_once __DIR__ . "/SudannaPayEngine.php";
        $userId = $userCtx['user_id'] ?? 0;
        $prompt = "أنت المساعد المالي الذكي في سودانا.\n";
        $prompt .= "دورك: مساعدة المستخدم في كل ما يتعلق بـ Sudanna Pay والخدمات المالية.\n\n";
        $prompt .= "المبادئ:\n";
        $prompt .= "• سودانا لا تحتفظ بالأموال — المال في البنك الشريك\n";
        $prompt .= "• كل عملية تحتاج PIN\n";
        $prompt .= "• لا فوائد ربوية — استثمار إسلامي فقط\n\n";

        if ($userId) {
            try {
                $dash = SudannaPayEngine::getDashboard($userId);
                if ($dash && $dash['balance'] > 0) {
                    $prompt .= "بيانات المستخدم الحالية:\n";
                    $prompt .= "• الرصيد المتاح: " . number_format($dash['available'],0,'.',',') . " SDG\n";
                    $prompt .= "• واردات الشهر: " . number_format($dash['month_in'],0,'.',',') . " SDG\n";
                    $prompt .= "• صادرات الشهر: " . number_format($dash['month_out'],0,'.',',') . " SDG\n\n";
                }
                // المعاملات الفاشلة
                $acc = SudannaPayEngine::getAccount($userId);
                if ($acc) {
                    $failed = db()->prepare(
                        "SELECT txn_ref, type, amount_sdg, failed_reason, created_at
                         FROM sdpay_transactions
                         WHERE (from_account=? OR to_account=?) AND status='failed'
                         ORDER BY created_at DESC LIMIT 3"
                    );
                    $failed->execute([$acc['account_no'], $acc['account_no']]);
                    $failedTxns = $failed->fetchAll();
                    if ($failedTxns) {
                        $prompt .= "آخر معاملات فاشلة:\n";
                        foreach ($failedTxns as $f) {
                            $prompt .= "• {$f['txn_ref']} | {$f['amount_sdg']} SDG | سبب: " . ($f['failed_reason'] ?? 'غير محدد') . "\n";
                        }
                        $prompt .= "\n";
                    }
                }
            } catch (\Throwable $e) {}
        }

        $prompt .= "إذا لم تستطع حل المشكلة → اقترح فتح تكت: /app/support.php\n";
        return $prompt;
    }

}
