<?php
namespace Core\Services;

class LabAnalysisService {

    /**
     * Analyzes a single lab test result, generating severity, action levels, and confidence.
     */
    public function analyzeSingleTest($name, $value, $range, $isAbnormal, $needsReview = false) {
        $status = 'طبيعي';
        $interpretation = 'النتيجة تقع ضمن النطاق الموصى به طبياً.';
        $recommendation = 'الاستمرار على نمط الحياة الصحي.';
        
        $confidenceLevel = 'high';
        $severityLevel = 'none';
        $actionLevel = 'monitor';

        // Confidence calculation
        if ($needsReview) {
            $confidenceLevel = 'low';
        } else if (empty(trim($range))) {
            $confidenceLevel = 'medium';
        }

        if (!$isAbnormal) {
            return [
                'status' => $status,
                'interpretation' => $interpretation,
                'recommendation' => $recommendation,
                'severity_level' => $severityLevel,
                'action_level' => $actionLevel,
                'confidence_level' => $confidenceLevel
            ];
        }

        // Determine if high or low & compute mathematical severity
        $isHigh = false;
        $isLow = false;
        $distancePercent = 0;
        
        $cleanVal = (float) preg_replace('/[^0-9\.-]/', '', $value);
        if (!empty(trim($range)) && preg_match('/^(\d+(\.\d+)?)\s*-\s*(\d+(\.\d+)?)$/', trim($range), $match)) {
            $min = (float) $match[1];
            $max = (float) $match[3];
            
            if ($cleanVal > $max) {
                $isHigh = true;
                $distancePercent = (($cleanVal - $max) / ($max ?: 1)) * 100;
            }
            if ($cleanVal < $min) {
                $isLow = true;
                $distancePercent = (($min - $cleanVal) / ($min ?: 1)) * 100;
            }
        } else {
            $status = 'غير طبيعي';
            $distancePercent = 15; // default moderate distance if uncalculatable
        }

        if ($isHigh) $status = 'مرتفع';
        if ($isLow) $status = 'منخفض';

        // Set Severity Level Mathematically
        if ($distancePercent > 0) {
            if ($distancePercent < 10) $severityLevel = 'mild';
            elseif ($distancePercent < 30) $severityLevel = 'moderate';
            else $severityLevel = 'critical';
        }

        $lowerName = strtolower(trim($name));

        // Define exact medical rules with contextual action levels
        if ($this->matchTest($lowerName, ['glucose', 'sugar', 'سكر'])) {
            if ($isHigh) {
                $interpretation = 'ارتفاع في مستويات الجلوكوز، استمراره قد يشير إلى خطر السكري.';
                $recommendation = 'تقليل السكريات وطلب تقييم طبي.';
                $actionLevel = ($severityLevel === 'critical') ? 'urgent' : 'doctor_visit';
            } else if ($isLow) {
                $interpretation = 'انخفاض سكر الدم، مسبب رئيسي للشعور بالهبوط والدوخة.';
                $recommendation = 'عدم تخطي الوجبات الرئيسية.';
                $actionLevel = 'lifestyle_change';
            }
        } 
        elseif ($this->matchTest($lowerName, ['hemoglobin', 'hgb', 'hb', 'هيموجلوبين'])) {
            if ($isHigh) {
                $interpretation = 'ارتفاع في كثافة الهيموجلوبين بالدم.';
                $recommendation = 'الإكثار من شرب الماء والابتعاد عن التدخين والحذر المطلق.';
                $actionLevel = 'doctor_visit';
            } else if ($isLow) {
                $interpretation = 'نقص الهيموجلوبين يشير بقوة إلى فقر الدم (الأنيميا).';
                $recommendation = 'إجراء فحص مخزون لحديد والتركيز على التغذية العلاجية.';
                $actionLevel = ($severityLevel === 'critical') ? 'urgent' : 'doctor_visit';
            }
        }
        elseif ($this->matchTest($lowerName, ['wbc', 'leukocyte', 'white blood'])) {
            if ($isHigh) {
                $interpretation = 'ارتفاع كريات الدم البيضاء يعكس غالباً مقاومة الجسم لعدوى أو التهاب نشط.';
                $recommendation = 'يجب مراجعة الطبيب لتحديد مصدر العدوى وبدء العلاج.';
                $actionLevel = 'doctor_visit';
            } else if ($isLow) {
                $interpretation = 'نقص في كريات الدم البيضاء؛ مما يضعف المناعة بشكل مؤقت.';
                $recommendation = 'تجنب المخالطة واستشارة طبيب لتقييم المناعة.';
                $actionLevel = 'doctor_visit';
            }
        }
        elseif ($this->matchTest($lowerName, ['cholesterol', 'choles'])) {
            if ($isHigh) {
                $interpretation = 'ارتفاع الكوليسترول يشكل ضغطاً على الجهاز الدوري.';
                $recommendation = 'الحد من الدهون المشبعة وممارسة الكارديو بانتظام.';
                $actionLevel = ($severityLevel === 'critical') ? 'doctor_visit' : 'lifestyle_change';
            } else if ($isLow) {
                $interpretation = 'مستوى الكوليسترول منخفض بشدة.';
                $recommendation = 'مراقبة الحالة مع الطبيب المختص.';
                $actionLevel = 'monitor';
            }
        }
        elseif ($this->matchTest($lowerName, ['iron', 'ferritin', 'حديد'])) {
            if ($isHigh) {
                $interpretation = 'زيادة كبيرة في مستويات الحديد (تسمم محتمل أو التهاب مستتر).';
                $recommendation = 'إيقاف الفيتامينات والتوجه لطبيب باطني فورا.';
                $actionLevel = 'urgent';
            } else if ($isLow) {
                $interpretation = 'استنفاذ مخزون الحديد يسبب التعب المزمن وسقوط الشعر.';
                $recommendation = 'مدعمات الحديد تحت الإشراف الطبي ضرورية.';
                $actionLevel = 'doctor_visit';
            }
        }
        elseif ($this->matchTest($lowerName, ['vit d', 'vitamin d', 'فيتامين د'])) {
            if ($isHigh) {
                $interpretation = 'تسمم أو فرط فيتامين د.';
                $recommendation = 'إيقاف المكملات فوراً وشرب سوائل وفيرة واختبار الكالسيوم.';
                $actionLevel = 'urgent';
            } else if ($isLow) {
                $interpretation = 'نقص في فيتامين د القابل لإضعاف العظام والمناعة.';
                $recommendation = 'استخدام جرعة تعويضية (مثل 50,000 وحدة) باستشارة الطبيب.';
                $actionLevel = 'lifestyle_change';
            }
        }
        else {
            if ($isHigh) {
                $interpretation = "قيمة ({$value}) تتجاوز النطاق الطبيعي بأكثر من المعتاد.";
                $recommendation = "يرجى مقارنة هذه القيمة المرتفعة مع حالتك السريرية مع طبيبك الخاص.";
            } else if ($isLow) {
                $interpretation = "قيمة ({$value}) تتراجع تحت النطاق الطبيعي المقبول.";
                $recommendation = "يرجى مقارنة هذه القيمة المنخفضة مع حالتك السريرية مع طبيبك الخاص.";
            } else {
                $interpretation = "قيمة نتيجة الاختبار خارج النطاق الطبيعي.";
                $recommendation = "ينصح بالمتابعة لمعرفة دلالتها السريرية.";
            }
            $actionLevel = ($severityLevel === 'critical') ? 'doctor_visit' : 'monitor';
        }

        // Generic safeguard for action levels based on math severity if unclassified
        if ($severityLevel === 'critical' && $actionLevel === 'monitor') {
            $actionLevel = 'doctor_visit';
        }

        return [
            'status' => $status,
            'interpretation' => $interpretation,
            'recommendation' => $recommendation,
            'severity_level' => $severityLevel,
            'action_level' => $actionLevel,
            'confidence_level' => $confidenceLevel
        ];
    }

    /**
     * Determines trend based on historical values array [oldest ..., newest]
     */
    public function calculateTrend($currentValue, $historicalValues) {
        if (empty($historicalValues) || count($historicalValues) < 1) return 'stable';
        
        $current = (float) preg_replace('/[^0-9\.-]/', '', $currentValue);
        // Average past records
        $pastSum = 0;
        $pastCount = 0;
        foreach($historicalValues as $v) {
            $val = (float) preg_replace('/[^0-9\.-]/', '', $v);
            if ($val > 0) {
                $pastSum += $val;
                $pastCount++;
            }
        }
        
        if ($pastCount === 0) return 'stable';
        
        $avgPast = $pastSum / $pastCount;
        $diff = $current - $avgPast;
        $percentChange = abs($diff) / ($avgPast ?: 1) * 100;

        if ($percentChange < 5) return 'stable';
        return ($diff > 0) ? 'increasing' : 'decreasing';
    }

    /**
     * Generates a Priority Ranked, Multi-Correlated Group Insight.
     */
    public function generateGroupInsight($abnormalLabs, $activeSymptoms, $historyMap = []) {
        if (empty($abnormalLabs)) return null;

        $insightParts = [];
        $priorityIssue = null;
        $criticalTests = [];
        
        // Multi-Lab Correlation checks
        $hasLowHB = false;
        $hasLowIron = false;
        $hasHighGlucose = false;
        
        foreach ($abnormalLabs as $l) {
            $name = strtolower(trim($l->test_name ?? $l['test_name']));
            $status = $l->analysis_status ?? $l['analysis_status'] ?? '';
            $sev = $l->severity_level ?? $l['severity_level'] ?? 'moderate';
            
            if ($sev === 'critical') $criticalTests[] = $l->test_name ?? $l['test_name'];
            if (!$priorityIssue && in_array($sev, ['critical', 'moderate'])) {
                $priorityIssue = $l->test_name ?? $l['test_name'];
            }
            
            if ($status === 'منخفض' && $this->matchTest($name, ['hemoglobin', 'hgb', 'hb'])) $hasLowHB = true;
            if ($status === 'منخفض' && $this->matchTest($name, ['iron', 'ferritin'])) $hasLowIron = true;
            if ($status === 'مرتفع' && $this->matchTest($name, ['glucose', 'sugar'])) $hasHighGlucose = true;
        }

        // Multi-Lab Correlation: Anemia Rule
        if ($hasLowHB && $hasLowIron) {
            $insightParts[] = "<div class='mb-2 text-danger fw-bold'><i class='fa-solid fa-triangle-exclamation'></i> ارتباط طبي חמור: انخفاض متزامن في الهيموجلوبين والحديد يؤكد بقوة وجود (فقر دم / أنيميا) يتطلب تدخلاً علاجياً فورياً.</div>";
        }
        
        $symptomNames = array_map(function($s) { return is_object($s) ? trim($s->symptom_name) : trim($s['symptom_name']); }, $activeSymptoms);
        
        // Multi-Lab Correlation: Symptoms Rule
        if ($hasHighGlucose && count($symptomNames) > 0) {
            $insightParts[] = "<div class='mb-2 text-danger fw-bold'><i class='fa-solid fa-triangle-exclamation'></i> تحذير: استمرار شكواك الطبية مع ارتفاع سكر الدم يزيد من احتمالية وجود سكري غير مسيطر عليه.</div>";
        }
        
        // Repeat Detection Engine
        $repeatedIssues = [];
        foreach($abnormalLabs as $l) {
            $name = $l->test_name ?? $l['test_name'];
            if (isset($historyMap[$name]) && count($historyMap[$name]) > 1) {
                // Check if the previous ones were also abnormal
                $repeatedIssues[] = "<strong>{$name}</strong>";
            }
        }
        if (count($repeatedIssues) > 0) {
            $rstr = implode('، و', array_unique($repeatedIssues));
            $insightParts[] = "<span class='text-warning fw-bold'>هذه المشكلة متكررة:</span> استمرار اضطراب المؤشرات التالية ({$rstr}) خلال التحاليل الماضية يوجب استشارة مختص وعدم إهمالها.";
        }

        // Base Summary
        if (count($criticalTests) > 0) {
            $cStr = implode(' و ', $criticalTests);
            $insightParts[] = "يجب إعطاء الأولوية القصوى لتصحيح التفاوت الحرج في: <strong>{$cStr}</strong>.";
        } else {
            $abnormalCount = count(array_values($abnormalLabs));
            $insightParts[] = "يوجد <strong>{$abnormalCount}</strong> " . ($abnormalCount == 1 ? "مؤشر خارج النطاق السليم" : "مؤشرات خارج النطاق السليم") . "، يفضل متابعتها لتصحيح المسار المعيشي.";
        }

        return [
            'text' => implode('<br>', $insightParts),
            'priority_issue' => $priorityIssue ?: ($abnormalLabs[0]->test_name ?? $abnormalLabs[0]['test_name'])
        ];
    }
    
    private function matchTest($testName, $keywords) {
        foreach ($keywords as $kw) {
            if (strpos($testName, $kw) !== false) {
                return true;
            }
        }
        return false;
    }
}
