<?php
/**
 * سودانا — SafetyEngine v1
 * حارس المحتوى — يمنع الردود الضارة قبل إرسالها
 * يُستدعى من Gateway بعد كل رد AI
 */
class SafetyEngine {

    const BLOCK  = 'BLOCK';
    const ALLOW  = 'ALLOW';
    const WARN   = 'WARN';

    // كلمات محظورة في الردود
    const BLOCKED_PATTERNS = [
        // معلومات خطرة — Arabic
        '/كيف.*تصنع.*(?:قنبلة|متفجر|سلاح|سم)/ui',
        '/طريقة.*(?:إيذاء|انتحار|قتل)/ui',
        // معلومات خطرة — English (added per FINAL ACCEPTANCE)
        '/(?:how to|instructions? for).{0,20}(?:bomb|explosive|weapon|poison)/i',
        '/(?:suicide|self[\s-]?harm|kill myself)/i',
        // محتوى جنسي صريح
        '/(?:جنس|إباحي).*صريح/ui',
        // تحيز ديني/سياسي حاد
        '/(?:الإسلام|المسيحية|اليهودية).*(?:كاذبة|باطلة|شر)/ui',
    ];

    // أنماط الطوارئ — تُحوَّل لمسار الطوارئ
    const EMERGENCY_PATTERNS = [
        '/(?:أريد|أبغى|عاوز|بدي).*(?:أموت|أنهي حياتي|أقتل نفسي)/ui',
        '/(?:ألم شديد|نزيف|فقدان وعي|صعوبة تنفس)/ui',
        '/(?:حادث|حريق|كارثة).*(?:الآن|الحين|الأن)/ui',
    ];

    // ── evaluate(): فحص السؤال قبل المعالجة ─────────────────
    public static function evaluateInput(string $question, array $context = []): array {
        // فحص الطوارئ أولاً
        foreach (self::EMERGENCY_PATTERNS as $pattern) {
            if (preg_match($pattern, $question)) {
                return [
                    'action'   => self::WARN,
                    'reason'   => 'emergency_detected',
                    'response' => self::emergencyResponse(),
                    'log'      => true,
                ];
            }
        }

        // فحص المحتوى المحظور
        foreach (self::BLOCKED_PATTERNS as $pattern) {
            if (preg_match($pattern, $question)) {
                return [
                    'action' => self::BLOCK,
                    'reason' => 'harmful_content',
                    'log'    => true,
                ];
            }
        }

        return ['action' => self::ALLOW, 'reason' => 'clean'];
    }

    // ── evaluateOutput(): فحص الرد قبل إرساله ───────────────
    public static function evaluateOutput(string $answer, string $sector): array {
        if (empty($answer)) {
            return ['action' => self::ALLOW];
        }

        // لا تشخيص طبي مباشر
        if ($sector === 'medical') {
            $diag_patterns = [
                '/أنت مصاب بـ/ui',
                '/التشخيص هو/ui',
                '/عندك مرض/ui',
            ];
            foreach ($diag_patterns as $p) {
                if (preg_match($p, $answer)) {
                    return [
                        'action'  => self::WARN,
                        'reason'  => 'medical_diagnosis_attempt',
                        'replace' => self::safetyReplaceTag($answer),
                    ];
                }
            }
        }

        // لا رأي قانوني ملزم
        if ($sector === 'legal') {
            if (preg_match('/أنت محق قانونياً|أنصحك بـ.*قانون|يحق لك قانوناً/ui', $answer)) {
                return [
                    'action'  => self::WARN,
                    'reason'  => 'legal_advice_direct',
                    'replace' => $answer . "

⚠️ هذه معلومات عامة — استشر محامياً مختصاً.",
                ];
            }
        }

        return ['action' => self::ALLOW];
    }

    // ── safetyReplaceTag() ────────────────────────────────────
    private static function safetyReplaceTag(string $text): string {
        return $text . "

⚠️ هذه معلومات عامة — لا تُغني عن استشارة طبيب متخصص.";
    }

    // ── emergencyResponse() ──────────────────────────────────
    public static function emergencyResponse(): string {
        return "⚠️ يبدو أنك تمر بموقف صعب.

"
             . "إذا كنت في حالة طوارئ طبية:
"
             . "• اتصل بـ 999 فوراً

"
             . "إذا كنت تحتاج دعماً نفسياً:
"
             . "• تحدث لشخص تثق فيه الآن
"
             . "• نحن هنا معك 🤝

"
             . "شنو يمكنني أساعدك فيه الآن؟";
    }

    // ── logViolation() ───────────────────────────────────────
    public static function logViolation(int $userId, string $question, string $reason): void {
        try {
            db()->prepare(
                "INSERT INTO fraud_flags (user_id, flag_type, details, severity)
                 VALUES (?, 'safety_violation', ?, 'medium')"
            )->execute([
                $userId ?: null,
                json_encode(['question' => mb_substr($question, 0, 200), 'reason' => $reason]),
            ]);
        } catch (Throwable $e) {
            error_log("[SafetyEngine::logViolation] " . $e->getMessage());
        }
    }
}
