<?php
/**
 * سودانا — CorporateAgent v1
 * محرك تحليل حلول الشركات
 * يُحلِّل إجابات الـ 5 مراحل → يُولِّد عرض سعر + ROI
 */
class CorporateAgent {

    // ── SERVICES MAP ──────────────────────────────────────────────
    const SERVICES = [
        'medical_corp'    => ['usd' => 150, 'per_user' => 2.00,  'label' => 'رعاية صحية'],
        'legal_monthly'   => ['usd' => 200, 'per_user' => 0,     'label' => 'استشارات قانونية'],
        'bde_package'     => ['usd' => 100, 'per_user' => 0,     'label' => 'توثيق تجاري'],
        'training_corp'   => ['usd' => 120, 'per_user' => 1.50,  'label' => 'تدريب الموظفين'],
        'supply_mgmt'     => ['usd' => 150, 'per_user' => 0,     'label' => 'إدارة التوريد'],
        'api_integration' => ['usd' => 200, 'setup' => 500,      'label' => 'تكامل API',    'per_user' => 0],
        'white_label'     => ['usd' => 400, 'setup' => 1000,     'label' => 'هوية مخصصة',  'per_user' => 0],
        'sla_professional'=> ['usd' => 150, 'per_user' => 0,     'label' => 'SLA احترافي'],
        'sla_enterprise'  => ['usd' => 400, 'per_user' => 0,     'label' => 'SLA مؤسسي'],
    ];

    const SLA_MULTIPLIER = [
        'standard'     => 1.0,
        'professional' => 1.3,
        'enterprise'   => 1.8,
    ];

    // ── analyze(): التحليل الكامل ─────────────────────────────────
    public static function analyze(array $data): array {
        $users          = self::parseUsers($data['expected_users'] ?? '50');
        $servicesRaw    = $data['services_selected'] ?? [];
        $slaLevel       = $data['sla_level'] ?? 'standard';
        $tech           = $data['tech_requirements'] ?? [];
        $budgetMax      = (int)($data['budget_max_usd'] ?? 0);
        $employees      = self::parseUsers($data['employees_count'] ?? '50');

        // Map selected services to catalog
        $selectedServices = self::matchServices($servicesRaw, $tech);

        // Calculate base cost
        $baseCostUSD  = 0;
        $setupCostUSD = 0;
        $breakdown    = [];

        foreach ($selectedServices as $svcKey) {
            if (!isset(self::SERVICES[$svcKey])) continue;
            $svc = self::SERVICES[$svcKey];
            $monthly = $svc['usd'] + ($svc['per_user'] ?? 0) * $users;
            $setup   = $svc['setup'] ?? 0;
            $baseCostUSD  += $monthly;
            $setupCostUSD += $setup;
            $breakdown[] = [
                'key'     => $svcKey,
                'label'   => $svc['label'],
                'monthly' => $monthly,
                'setup'   => $setup,
                'users'   => $users,
            ];
        }

        // Apply SLA multiplier
        $multiplier   = self::SLA_MULTIPLIER[$slaLevel] ?? 1.0;
        $totalUSD     = round($baseCostUSD * $multiplier, 2);

        // Get current rate
        $rate = defined('PricingEngine::getRate()') ? PricingEngine::getRate() : 4100;
        try {
            $rateRow = db()->query("SELECT rate_usd_sdg FROM exchange_rates WHERE is_active=1 LIMIT 1")->fetchColumn();
            if ($rateRow) $rate = (float)$rateRow;
        } catch (Throwable $e) {}

        $totalSDG    = (int)round($totalUSD * $rate);
        $year1SDG    = (int)round(($totalSDG * 12) + ($setupCostUSD * $rate));
        $year2SDG    = (int)round($totalSDG * 12 * 0.95); // 5% discount year 2

        // ROI calculation
        $roi = self::estimateROI($employees, $selectedServices, $totalUSD);

        // Package recommendation
        $pkg = self::recommendPackage($users, $totalUSD);

        return [
            'users'              => $users,
            'services_selected'  => $selectedServices,
            'breakdown'          => $breakdown,
            'monthly_usd'        => $totalUSD,
            'monthly_sdg'        => $totalSDG,
            'setup_usd'          => $setupCostUSD,
            'setup_sdg'          => (int)round($setupCostUSD * $rate),
            'year1_sdg'          => $year1SDG,
            'year2_sdg'          => $year2SDG,
            'sla_level'          => $slaLevel,
            'sla_multiplier'     => $multiplier,
            'roi_percent'        => $roi['percent'],
            'breakeven_months'   => $roi['breakeven'],
            'hours_saved_monthly'=> $roi['hours_saved'],
            'recommended_package'=> $pkg,
            'rate_used'          => $rate,
            'budget_aligned'     => $budgetMax === 0 || $totalUSD <= $budgetMax,
        ];
    }

    // ── matchServices(): ربط الإجابات بالخدمات ───────────────────
    private static function matchServices(array $selected, array $tech): array {
        $services = [];
        $mapping = [
            'medical'          => 'medical_corp',
            'legal'            => 'legal_monthly',
            'documentation'    => 'bde_package',
            'bde'              => 'bde_package',
            'training'         => 'training_corp',
            'education'        => 'training_corp',
            'supply'           => 'supply_mgmt',
            'marketplace'      => 'supply_mgmt',
            'api'              => 'api_integration',
            'integration'      => 'api_integration',
            'white_label'      => 'white_label',
            'custom_domain'    => 'white_label',
        ];

        foreach ($selected as $item) {
            $item = strtolower($item);
            foreach ($mapping as $key => $svcKey) {
                if (str_contains($item, $key) && !in_array($svcKey, $services)) {
                    $services[] = $svcKey;
                }
            }
        }

        // Add from tech requirements
        if (in_array('api', $tech ?? []) && !in_array('api_integration', $services)) {
            $services[] = 'api_integration';
        }
        if (in_array('white_label', $tech ?? []) && !in_array('white_label', $services)) {
            $services[] = 'white_label';
        }

        return $services ?: ['medical_corp', 'bde_package']; // default
    }

    // ── estimateROI() ─────────────────────────────────────────────
    private static function estimateROI(int $employees, array $services, float $monthlyCostUSD): array {
        // Conservative: 2 hours/employee/month saved per service
        $hoursSaved = count($services) * $employees * 2;
        $valuePerHour = 8; // USD/hour (conservative Sudan estimate)
        $monthlyValue = $hoursSaved * $valuePerHour;

        $roiPct = $monthlyCostUSD > 0
            ? (int)round((($monthlyValue - $monthlyCostUSD) / $monthlyCostUSD) * 100)
            : 0;

        $breakeven = $monthlyCostUSD > 0 && $monthlyValue > $monthlyCostUSD
            ? (int)ceil($monthlyCostUSD / ($monthlyValue - $monthlyCostUSD))
            : 12;

        return [
            'percent'    => max(0, min($roiPct, 999)),
            'breakeven'  => min($breakeven, 24),
            'hours_saved'=> $hoursSaved,
        ];
    }

    // ── recommendPackage() ────────────────────────────────────────
    private static function recommendPackage(int $users, float $monthlyCostUSD): string {
        if ($users <= 50 && $monthlyCostUSD <= 300) return 'starter';
        if ($users <= 200 && $monthlyCostUSD <= 800) return 'business';
        if ($users <= 1000) return 'scale';
        return 'custom';
    }

    // ── parseUsers(): '50-200' → 125 ─────────────────────────────
    private static function parseUsers(string $val): int {
        if (is_numeric($val)) return (int)$val;
        if (str_contains($val, '-')) {
            [$min, $max] = explode('-', $val);
            return (int)(((int)$min + (int)$max) / 2);
        }
        if (str_contains($val, '+')) return (int)str_replace('+', '', $val) + 50;
        return 50;
    }

    // ── generateProposalPrompt(): بناء prompt للـ AI ──────────────
    public static function generateProposalPrompt(array $inq, array $analysis): string {
        $services = implode('، ', array_column($analysis['breakdown'] ?? [], 'label'));
        $monthlySdg = number_format($analysis['monthly_sdg'] ?? 0);
        $roi = $analysis['roi_percent'] ?? 0;
        $breakeven = $analysis['breakeven_months'] ?? 12;

        return "أنت مستشار مؤسسي متخصص في حلول التحول الرقمي للسودان.
أعد عرضاً احترافياً كاملاً لشركة {$inq['org_name']} في قطاع {$inq['org_sector']}.

معلومات الشركة:
- النوع: {$inq['org_type']} | الحجم: {$inq['employees_count']} موظف
- الولايات: " . implode(', ', json_decode($inq['operating_states']??'[]', true) ?: []) . "
- التحديات: {$inq['challenges_text']}

الحل المقترح:
- الخدمات: {$services}
- التكلفة: {$monthlySdg} SDG/شهر
- العائد المتوقع: {$roi}% ROI في 12 شهراً
- نقطة التعادل: {$breakeven} شهر

اكتب العرض باللغة العربية بصيغة احترافية مؤسسية يشمل:
1. الملخص التنفيذي (فقرة)
2. تحليل التحديات الحالية
3. الحل المقترح مع تفاصيل كل خدمة
4. جدول التكاليف التفصيلي (بالجنيه السوداني)
5. العائد على الاستثمار والجدول الزمني للتعادل
6. خطة التنفيذ (4 مراحل)
7. شروط الاتفاقية وضمانات الأداء (SLA)
8. الخطوات التالية

اكتب بأسلوب مؤسسي رسمي ومقنع.";
    }

    // ── generateRef(): يُولِّد رقم مرجعي ─────────────────────────
    public static function generateRef(): string {
        return 'CSP-' . strtoupper(substr(md5(uniqid()), 0, 8));
    }
}
