<?php
/**
 * سودانا — Output Builder v21 (MEDICAL SAFETY HARDENED)
 * كل رد يمر هنا — لا raw AI output
 * GLOBAL MEDICAL SAFETY: enforced regardless of service classification
 */
class OutputBuilder {

    // ── Global medical symptom detector (service-independent) ────
    // MANDATORY: fires even if detectService returned 'general'
    private static function isSymptomQuery(string $text): bool {
        $symptomPatterns = [
            // Symptoms — Arabic
            '/ألم|آلام|وجع|أوجاع/ui',
            '/حرارة|سخونة|حمى/ui',
            '/تورم|انتفاخ|ورم/ui',
            '/نزيف|دم في|يسيل دم/ui',
            '/إسهال|قيء|غثيان/ui',
            '/صداع|دوار|دوخة/ui',
            '/ضيق تنفس|صعوبة التنفس|اختناق/ui',
            '/تعب شديد|إرهاق مستمر|خمول/ui',
            '/طفح|بثور|حكة|احمرار جلد/ui',
            '/فقدان شهية|عدم الأكل/ui',
            '/سعال|كحة|بلغم/ui',
            '/ضغط مرتفع|ضغط منخفض/ui',
            '/سكر مرتفع|سكر منخفض/ui',
            '/تشنج|رعشة|رجفة/ui',
            '/إغماء|فقدان وعي/ui',
            // Body parts + complaint
            '/قلبي|صدري|بطني|رأسي|ظهري|ساقي|كليتي/ui',
            // Medical queries (even without "doctor")
            '/أعاني من|أشعر بألم|عندي مرض|أصبت بـ/ui',
            '/كيف أعالج|ما علاج|ما دواء/ui',
            '/هل هذا خطير|هل أحتاج طبيب|هل أذهب للطوارئ/ui',
            // Children symptoms
            '/طفلي يعاني|ابني يشكو|بنتي عندها/ui',
            // Body functions
            '/بوله|برازه|حمله|إفرازات|نبضه/ui',
        ];
        foreach ($symptomPatterns as $p) {
            if (@preg_match($p, $text)) return true;
        }
        return false;
    }

    // ── Detect diagnosis attempt in AI output ────────────────────
    private static function containsDiagnosis(string $text): bool {
        $diagnosisPatterns = [
            '/أنت مصاب بـ|تشخيصك هو|عندك مرض|مرضك هو/ui',
            '/بالتأكيد هذا|حتماً هذا مرض|هذا يعني أنك/ui',
            '/السبب هو (مرض|التهاب|فيروس|بكتيريا)/ui',
        ];
        foreach ($diagnosisPatterns as $p) {
            if (@preg_match($p, $text)) return true;
        }
        return false;
    }

    public static function build(
        $answer,  // string|null — null handled by sanitize guard
        string $service,
        string $source,
        array  $dbData       = [],
        array  $extraActions = [],
        string $originalQuery = ''  // NEW: pass original question for global safety
    ): array {
        $answer = self::sanitize($answer);

        // ══ GLOBAL MEDICAL SAFETY (NON-NEGOTIABLE) ══════════════
        // Runs regardless of $service classification
        $isMedicalContext = in_array($service, ['medical','pharmacy','family'])
                         || self::isSymptomQuery($originalQuery)
                         || self::isSymptomQuery($answer);

        $answer = self::applySafety($answer, $service, $isMedicalContext);
        // ════════════════════════════════════════════════════════

        // If medical context detected but service was misclassified, upgrade it
        if ($isMedicalContext && !in_array($service, ['medical','pharmacy','family','emergency'])) {
            $service = 'medical'; // reclassify for correct actions/links
        }

        $response = [
            'success'          => true,
            'answer'           => $answer,
            'source'           => $source,
            'service'          => $service,
            'medical_context'  => $isMedicalContext,
            'actions'          => array_merge(self::buildActions($service, $dbData), $extraActions),
            'cross_links'      => self::buildCrossLinks($service),
        ];

        if (!empty($dbData)) $response['data'] = $dbData;

        return $response;
    }

    public static function limitReached(string $tier): array {
        $msg = $tier === 'paid'
            ? 'وصلت لحد اليوم (100 سؤال). تجدّد الحد غداً.'
            : "وصلت لحد اليوم المجاني (10 أسئلة).\n\n✨ رقّ للمدفوع للحصول على 100 سؤال/يوم!";
        return ['success'=>true,'answer'=>$msg,'source'=>'system','limit_reached'=>true,
                'actions'=>[['label'=>'ترقّ الآن','url'=>'#pricing']]];
    }

    public static function blocked(string $reason = 'injection'): array {
        return ['success'=>true,'answer'=>'لا أستطيع تنفيذ هذا الطلب.','source'=>'system','blocked'=>true];
    }

    public static function noAnswer(string $service): array {
        $fallbacks = [
            'pharmacy'  => 'يمكنك رفع وصفتك لاحقاً عند عودة الخدمة. ⚕️',
            'medical'   => '⚕️ للحالات الطارئة اتصل 999 فوراً.',
            'academy'   => 'الدروس متاحة للتصفح في تبويب الأكاديمية.',
            'market'    => 'تصفح الإعلانات المتاحة في السوق.',
            'community' => 'اقرأ آخر منشورات الحي في نبض الحي.',
            'default'   => 'خدمتنا مؤقتاً مشغولة — حاول بعد دقيقة. 🙏',
        ];
        return ['success'=>true,'answer'=>$fallbacks[$service]??$fallbacks['default'],'source'=>'fallback'];
    }

    private static function sanitize($text): string {
        if (!is_string($text)) return ''; // null/non-string guard (P0 fix)
        $text = strip_tags($text);
        $text = preg_replace('/ignore.*previous.*instruction/i', '', $text);
        return trim($text);
    }

    /**
     * GLOBAL SAFETY — $isMedical is true regardless of service classification
     * when symptom patterns detected in query or answer
     */
    private static function applySafety(string $text, string $service, bool $isMedical = false): string {
        // ── EMERGENCY OVERRIDE (highest priority) ─────────────────
        if (@preg_match('/فقدان.*وعي|تشنج|ضيق.*تنفس.*ح[اآ]د|نزيف.*شديد|جرعة.*زائدة|نوبة.*قلبية/ui', $text . ' ' . $text)) {
            if (!str_starts_with(trim($text), '🚨')) {
                $text = "🚨 حالة طارئة — اتصل 999 فوراً.\n\n" . $text;
            }
        }

        // ── GLOBAL MEDICAL DISCLAIMER ──────────────────────────────
        // Fires when: service is medical/pharmacy/family  OR  symptom detected in query
        if ($isMedical || in_array($service, ['medical','pharmacy','family'])) {

            // 1. Strip specific dosages — NEVER allow AI to prescribe amounts
            $text = preg_replace(
                '/\b(\d+)\s*(mg|ملغ|ملجم|مل|ml|gram|جرام|g)\b/ui',
                'الجرعة المناسبة (يحددها طبيبك أو صيدلانيك)',
                $text
            );

            // 2. Remove/replace diagnosis statements
            if (self::containsDiagnosis($text)) {
                $text = preg_replace(
                    '/أنت مصاب بـ\s*\S+|تشخيصك هو\s*\S+|عندك مرض\s*\S+/ui',
                    'قد تكون هذه الأعراض لها أسباب متعددة',
                    $text
                );
            }

            // 3. Inject ⚕️ disclaimer if not already present
            if (!str_contains($text, '⚕️')) {
                $text .= "\n\n⚕️ هذه معلومات إرشادية عامة — لا تُغني عن تشخيص الطبيب. استشر طبيبك للتشخيص الدقيق والعلاج المناسب.";
            }

            // 4. Add "see a doctor" guidance if not present
            if (!@preg_match('/طبيب|طوارئ|999|عيادة|مستشفى/ui', $text)) {
                $text .= "\n\n👨‍⚕️ إذا استمرت الأعراض أو اشتدّت — راجع الطبيب فوراً.";
            }
        }

        return $text;
    }

    private static function buildActions(string $service, array $dbData): array {
        $actions = [];
        switch ($service) {
            case 'bde':
                $actions[] = ['label'=>'إنشاء وثيقة احترافية الآن','url'=>'#bde','icon'=>'🗂️'];
                $actions[] = ['label'=>'طلب مراجعة خبير','url'=>'#consultation','icon'=>'⚖️'];
                break;
            case 'pharmacy':
                $actions[] = ['label'=>'ارفع وصفتك الآن','url'=>'#family','icon'=>'💊'];
                $actions[] = ['label'=>'تحدث مع صيدلاني','url'=>'#consultation','icon'=>'👨‍⚕️'];
                break;
            case 'medical': case 'family':
                if (!empty($dbData['providers'])) {
                    $actions[] = ['label'=>'تحدث مع طبيب','url'=>'#consultation','icon'=>'👨‍⚕️'];
                } else {
                    $actions[] = ['label'=>'ابحث عن طبيب','url'=>'#consultation','icon'=>'👨‍⚕️'];
                    $actions[] = ['label'=>'انضم كطبيب موثّق','url'=>'#providers','icon'=>'🌟'];
                }
                $actions[] = ['label'=>'اتصل بالطوارئ 999','url'=>'tel:999','icon'=>'🚨'];
                break;
            case 'academy':
                $actions[] = ['label'=>'تصفح الدروس','url'=>'#academy','icon'=>'📚'];
                break;
            case 'market':
                $actions[] = ['label'=>'أضف إعلاناً','url'=>'#market','icon'=>'🛒'];
                break;
            case 'legal':
                if (!empty($dbData['providers'])) {
                    $actions[] = ['label'=>'تحدث مع محامٍ','url'=>'#consultation','icon'=>'⚖️'];
                } else {
                    $actions[] = ['label'=>'انضم كمستشار قانوني','url'=>'#providers','icon'=>'🌟'];
                }
                break;
            case 'community':
                $actions[] = ['label'=>'انشر في الحي','url'=>'#pulse','icon'=>'📡'];
                break;
            case 'business': case 'productivity':
                $actions[] = ['label'=>'استشر خبير أعمال','url'=>'#consultation','icon'=>'💼'];
                break;
        }
        return $actions;
    }

    private static function buildCrossLinks(string $service): array {
        $links = [];
        switch ($service) {
            case 'pharmacy':
                $links[] = ['service'=>'family','label'=>'هل الوصفة لأحد أفراد أسرتك؟','url'=>'#family'];
                $links[] = ['service'=>'medical','label'=>'تحدث مع طبيب','url'=>'#consultation'];
                break;
            case 'medical': case 'family':
                $links[] = ['service'=>'pharmacy','label'=>'ارفع وصفة الطبيب هنا','url'=>'#pharmacy'];
                $links[] = ['service'=>'consultation','label'=>'استشر طبيباً متخصصاً','url'=>'#consultation'];
                break;
            case 'academy':
                $links[] = ['service'=>'consultation','label'=>'تريد معلماً متخصصاً؟','url'=>'#consultation'];
                break;
            case 'market':
                $links[] = ['service'=>'directory','label'=>'تريد تقنياً لفحص المنتج؟','url'=>'#directory'];
                break;
            case 'business': case 'productivity':
                $links[] = ['service'=>'market','label'=>'اعرض منتجاتك في السوق','url'=>'#market'];
                $links[] = ['service'=>'academy','label'=>'دروس في ريادة الأعمال','url'=>'#academy'];
                break;
            case 'community':
                $links[] = ['service'=>'events','label'=>'نظّم فعالية لمبادرتك','url'=>'#events'];
                break;
        }
        return $links;
    }
}
