<?php
declare(strict_types=1);

if (session_status() !== PHP_SESSION_ACTIVE) {
    session_start();
}

require_once __DIR__ . '/../inc/auth.php';

ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);

header('Content-Type: application/json; charset=utf-8');

/* =========================
   BASIC JSON FAIL
========================= */
if (!function_exists('ai_boot_fail')) {
    function ai_boot_fail(string $message, int $sessionId = 0): void
    {
        http_response_code(500);
        echo json_encode([
            'ok'         => false,
            'reply'      => $message,
            'session_id' => $sessionId,
        ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
        exit;
    }
}

/* =========================
   ERROR HANDLERS
========================= */
set_error_handler(function ($severity, $message, $file, $line) {
    ai_boot_fail(
        'PHP ERROR: ' . $message . ' | File: ' . basename((string)$file) . ' | Line: ' . (int)$line
    );
});

set_exception_handler(function ($e) {
    ai_boot_fail(
        'EXCEPTION: ' . $e->getMessage() . ' | File: ' . basename((string)$e->getFile()) . ' | Line: ' . (int)$e->getLine()
    );
});

/* =========================
   REQUIRED FILES
========================= */
$dbFile = __DIR__ . '/../db.php';
if (!is_file($dbFile)) {
    ai_boot_fail('ملف db.php غير موجود: ' . $dbFile);
}
require_once $dbFile;

/* ملفات إضافية اختيارية */
$optionalFiles = [
    __DIR__ . '/ai_config.php',
    __DIR__ . '/ai_intents.php',
    __DIR__ . '/ai_modules.php',
];

foreach ($optionalFiles as $optFile) {
    if (is_file($optFile)) {
        require_once $optFile;
    }
}

/* =========================
   HELPERS
========================= */
if (!function_exists('ai_json_response')) {
    function ai_json_response(bool $ok, string $reply, int $sessionId = 0, array $extra = []): void
    {
        $payload = array_merge([
            'ok'         => $ok,
            'reply'      => $reply,
            'session_id' => $sessionId,
        ], $extra);

        echo json_encode($payload, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
        exit;
    }
}

if (!function_exists('ai_table_exists')) {
    function ai_table_exists(PDO $pdo, string $table): bool
    {
        try {
            $st = $pdo->prepare("
                SELECT COUNT(*)
                FROM information_schema.tables
                WHERE table_schema = DATABASE()
                  AND table_name = ?
            ");
            $st->execute([$table]);
            return (int)$st->fetchColumn() > 0;
        } catch (Throwable $e) {
            error_log('AI TABLE EXISTS ERROR: ' . $e->getMessage());
            return false;
        }
    }
}

if (!function_exists('ai_column_exists')) {
    function ai_column_exists(PDO $pdo, string $table, string $column): bool
    {
        try {
            $st = $pdo->prepare("
                SELECT COUNT(*)
                FROM information_schema.columns
                WHERE table_schema = DATABASE()
                  AND table_name = ?
                  AND column_name = ?
            ");
            $st->execute([$table, $column]);
            return (int)$st->fetchColumn() > 0;
        } catch (Throwable $e) {
            error_log('AI COLUMN EXISTS ERROR: ' . $e->getMessage());
            return false;
        }
    }
}

if (!function_exists('ai_normalize_terms')) {
    function ai_normalize_terms(array $parts, array $stopWords): array
    {
        $filtered = [];

        foreach ($parts as $part) {
            $part = trim((string)$part);
            if ($part === '') {
                continue;
            }

            $low = mb_strtolower($part, 'UTF-8');
            if (in_array($low, $stopWords, true)) {
                continue;
            }

            if (mb_strlen($part, 'UTF-8') < 2) {
                continue;
            }

            $filtered[] = $part;
        }

        return array_values(array_unique($filtered));
    }
}

if (!function_exists('ai_is_allowed')) {
    function ai_is_allowed(string $intent, string $role): bool
    {
        $map = [
            'employees'  => ['OWNER', 'ADMIN', 'HR', 'LAWYER', 'STAFF'],
            'clients'    => ['OWNER', 'ADMIN', 'LAWYER', 'STAFF'],
            'cases'      => ['OWNER', 'ADMIN', 'LAWYER', 'STAFF'],
            'sessions'   => ['OWNER', 'ADMIN', 'LAWYER', 'STAFF'],
            'laws'       => ['OWNER', 'ADMIN', 'LAWYER', 'STAFF'],
            'payroll'    => ['OWNER', 'ADMIN', 'HR', 'FINANCE'],
            'finance'    => ['OWNER', 'ADMIN', 'FINANCE'],
            'attendance' => ['OWNER', 'ADMIN', 'HR'],
            'general'    => ['OWNER', 'ADMIN', 'LAWYER', 'STAFF', 'HR', 'FINANCE'],
        ];

        return isset($map[$intent]) && in_array($role, $map[$intent], true);
    }
}

if (!function_exists('ai_save_chat')) {
    function ai_save_chat(PDO $pdo, int $sessionId, int $userId, string $message, string $reply): int
    {
        try {
            if (!ai_table_exists($pdo, 'ai_chat_sessions') || !ai_table_exists($pdo, 'ai_chat_messages')) {
                return $sessionId;
            }

            if ($sessionId <= 0) {
                $title = mb_substr(trim($message), 0, 120, 'UTF-8');
                if ($title === '') {
                    $title = 'جلسة جديدة';
                }

                $st = $pdo->prepare("
                    INSERT INTO ai_chat_sessions (user_id, title, created_at)
                    VALUES (?, ?, NOW())
                ");
                $st->execute([$userId, $title]);
                $sessionId = (int)$pdo->lastInsertId();
            }

            $stUser = $pdo->prepare("
                INSERT INTO ai_chat_messages (session_id, sender, message, created_at)
                VALUES (?, 'user', ?, NOW())
            ");
            $stUser->execute([$sessionId, $message]);

            $stAssistant = $pdo->prepare("
                INSERT INTO ai_chat_messages (session_id, sender, message, created_at)
                VALUES (?, 'assistant', ?, NOW())
            ");
            $stAssistant->execute([$sessionId, $reply]);

            return $sessionId;
        } catch (Throwable $e) {
            error_log('AI SAVE CHAT ERROR: ' . $e->getMessage());
            return $sessionId;
        }
    }
}

if (!function_exists('ai_branch_label')) {
    function ai_branch_label(int $id): string
    {
        return match ($id) {
            1 => 'أبوظبي',
            2 => 'دبي',
            3 => 'الشارقة',
            4 => 'العين',
            default => 'فرع ' . $id,
        };
    }
}

if (!function_exists('ai_detect_branch_from_text')) {
    function ai_detect_branch_from_text(string $message): ?int
    {
        $msg = mb_strtolower($message, 'UTF-8');

        if (mb_strpos($msg, 'أبوظبي') !== false || mb_strpos($msg, 'ابوظبي') !== false) {
            return 1;
        }
        if (mb_strpos($msg, 'دبي') !== false) {
            return 2;
        }
        if (mb_strpos($msg, 'الشارقة') !== false || mb_strpos($msg, 'شارقة') !== false) {
            return 3;
        }
        if (mb_strpos($msg, 'العين') !== false) {
            return 4;
        }

        return null;
    }
}

if (!function_exists('ai_is_all_branches_request')) {
    function ai_is_all_branches_request(string $message): bool
    {
        $msg = mb_strtolower($message, 'UTF-8');

        return (
            mb_strpos($msg, 'كل الفروع') !== false ||
            mb_strpos($msg, 'جميع الفروع') !== false ||
            mb_strpos($msg, 'كل الأفرع') !== false ||
            mb_strpos($msg, 'جميع الأفرع') !== false ||
            mb_strpos($msg, 'all branches') !== false
        );
    }
}

if (!function_exists('ai_branch_scope_for_role')) {
    function ai_branch_scope_for_role(string $role, string $message): array
    {
        $sessionBranchId   = (int)($_SESSION['branch_id'] ?? 0);
        $requestedBranchId = ai_detect_branch_from_text($message);
        $allBranchesAsked  = ai_is_all_branches_request($message);

        $isOwner = ($role === 'OWNER');
        $isAdmin = ($role === 'ADMIN');

        if ($isOwner) {
            if ($allBranchesAsked) {
                $effectiveBranchId = null;
                $allowAllBranches  = true;
            } elseif ($requestedBranchId !== null) {
                $effectiveBranchId = $requestedBranchId;
                $allowAllBranches  = false;
            } else {
                $effectiveBranchId = null;
                $allowAllBranches  = true;
            }
        } else {
            $effectiveBranchId = $sessionBranchId > 0 ? $sessionBranchId : null;
            $allowAllBranches  = false;
        }

        return [
            'session_branch_id'   => $sessionBranchId,
            'requested_branch_id' => $requestedBranchId,
            'effective_branch_id' => $effectiveBranchId,
            'allow_all_branches'  => $allowAllBranches,
            'is_owner'            => $isOwner,
            'is_admin'            => $isAdmin,
        ];
    }
}

if (!function_exists('ai_scope_label')) {
    function ai_scope_label(array $scope): string
    {
        if (!empty($scope['allow_all_branches'])) {
            return ' في كل الفروع';
        }

        if (!empty($scope['effective_branch_id'])) {
            return ' في فرع ' . ai_branch_label((int)$scope['effective_branch_id']);
        }

        return '';
    }
}

if (!function_exists('ai_apply_branch_filter')) {
    function ai_apply_branch_filter(array &$where, array &$params, array $scope, string $column = 'branch_id'): void
    {
        if (!empty($scope['allow_all_branches'])) {
            return;
        }

        if (!empty($scope['effective_branch_id'])) {
            $where[]  = $column . ' = ?';
            $params[] = (int)$scope['effective_branch_id'];
        }
    }
}

if (!function_exists('ai_cases_status_label')) {
    function ai_cases_status_label(?string $status): string
    {
        $status = strtoupper(trim((string)$status));

        return match ($status) {
            'NEW'    => 'جديدة',
            'WORK'   => 'قيد العمل',
            'COURT'  => 'في المحكمة',
            'CLOSED' => 'مغلقة',
            default  => ($status !== '' ? $status : 'غير محددة'),
        };
    }
}

if (!function_exists('ai_extract_case_no')) {
    function ai_extract_case_no(string $message): ?string
    {
        if (preg_match('/\b\d{1,8}\/\d{4}\b/u', $message, $m)) {
            return trim((string)$m[0]);
        }
        return null;
    }
}

if (!function_exists('ai_detect_case_status_from_text')) {
    function ai_detect_case_status_from_text(string $message): ?string
    {
        $msg = mb_strtolower($message, 'UTF-8');

        if (
            mb_strpos($msg, 'جديدة') !== false ||
            mb_strpos($msg, 'جديده') !== false ||
            mb_strpos($msg, 'new') !== false
        ) {
            return 'NEW';
        }

        if (
            mb_strpos($msg, 'قيد العمل') !== false ||
            mb_strpos($msg, 'عمل') !== false ||
            mb_strpos($msg, 'work') !== false
        ) {
            return 'WORK';
        }

        if (
            mb_strpos($msg, 'المحكمة') !== false ||
            mb_strpos($msg, 'محكمة') !== false ||
            mb_strpos($msg, 'court') !== false
        ) {
            return 'COURT';
        }

        if (
            mb_strpos($msg, 'مغلقة') !== false ||
            mb_strpos($msg, 'مغلقه') !== false ||
            mb_strpos($msg, 'closed') !== false
        ) {
            return 'CLOSED';
        }

        return null;
    }
}

if (!function_exists('ai_clients_missing_field_condition')) {
    function ai_clients_missing_field_condition(string $field): string
    {
        return match ($field) {
            'id_number' => "(id_number IS NULL OR TRIM(id_number) = '')",
            'phone'     => "(phone IS NULL OR TRIM(phone) = '')",
            'email'     => "(email IS NULL OR TRIM(email) = '')",
            default     => '(1=0)',
        };
    }
}

if (!function_exists('ai_clients_missing_field_label')) {
    function ai_clients_missing_field_label(string $field): string
    {
        return match ($field) {
            'id_number' => 'هوية مسجلة',
            'phone'     => 'هاتف',
            'email'     => 'بريد إلكتروني',
            default     => 'بيانات',
        };
    }
}

if (!function_exists('ai_detect_missing_client_field')) {
    function ai_detect_missing_client_field(string $message): ?string
    {
        $msg = mb_strtolower($message, 'UTF-8');

        if (
            mb_strpos($msg, 'بدون هوية') !== false ||
            mb_strpos($msg, 'بلا هوية') !== false ||
            mb_strpos($msg, 'لا يوجد هوية') !== false ||
            mb_strpos($msg, 'ليس لديهم هوية') !== false ||
            mb_strpos($msg, 'بدون رقم هوية') !== false ||
            mb_strpos($msg, 'لا يوجد رقم هوية') !== false ||
            mb_strpos($msg, 'بدون هوية مسجلة') !== false
        ) {
            return 'id_number';
        }

        if (
            mb_strpos($msg, 'بدون هاتف') !== false ||
            mb_strpos($msg, 'بلا هاتف') !== false ||
            mb_strpos($msg, 'لا يوجد هاتف') !== false ||
            mb_strpos($msg, 'بدون رقم هاتف') !== false ||
            mb_strpos($msg, 'بدون جوال') !== false ||
            mb_strpos($msg, 'بلا جوال') !== false ||
            mb_strpos($msg, 'لا يوجد جوال') !== false ||
            mb_strpos($msg, 'بدون هاتف مسجل') !== false
        ) {
            return 'phone';
        }

        if (
            mb_strpos($msg, 'بدون بريد') !== false ||
            mb_strpos($msg, 'بلا بريد') !== false ||
            mb_strpos($msg, 'لا يوجد بريد') !== false ||
            mb_strpos($msg, 'بدون بريد إلكتروني') !== false ||
            mb_strpos($msg, 'بدون بريد الكتروني') !== false ||
            mb_strpos($msg, 'بدون ايميل') !== false ||
            mb_strpos($msg, 'بلا ايميل') !== false ||
            mb_strpos($msg, 'لا يوجد ايميل') !== false ||
            mb_strpos($msg, 'بدون إيميل') !== false ||
            mb_strpos($msg, 'بلا إيميل') !== false ||
            mb_strpos($msg, 'لا يوجد إيميل') !== false ||
            mb_strpos($msg, 'بدون بريد مسجل') !== false
        ) {
            return 'email';
        }

        return null;
    }
}

/* =========================
   INTENT DETECTION
========================= */
if (!function_exists('ai_detect_intent')) {
    function ai_detect_intent(string $message): array
    {
        $message = trim($message);
        $msg = mb_strtolower($message, 'UTF-8');

        $intents = [];

        $map = [
            'cases' => [
                'قضية', 'القضية', 'القضايا', 'قضايا',
                'رقم القضية', 'حالة القضية', 'جلسة', 'الجلسة',
                'المحامي', 'case', 'cases'
            ],
            'clients' => [
                'عميل', 'العميل', 'العملاء', 'عملاء',
                'عميله', 'العميله', 'موكل', 'موكله', 'موكلة',
                'بيانات العميل', 'رقم العميل', 'هاتف العميل',
                'ايميل العميل', 'البريد الالكتروني',
                'رقم الهوية', 'الهوية', 'client', 'clients'
            ],
            'employees' => [
                'موظف', 'الموظف', 'الموظفين', 'موظفين',
                'موظفة', 'موظفه', 'الموظفة', 'الموظفه',
                'الموظفات', 'موظفات',
                'انجاز', 'إنجاز', 'انجازات', 'إنجازات',
                'employee', 'employees'
            ],
            'laws' => [
                'مادة', 'المادة', 'مواد', 'قانون', 'القانون',
                'قوانين', 'تشريع', 'لائحة', 'laws', 'law'
            ],
        ];

        foreach ($map as $intent => $words) {
            foreach ($words as $word) {
                if (mb_strpos($msg, mb_strtolower($word, 'UTF-8')) !== false) {
                    $intents[] = $intent;
                    break;
                }
            }
        }

        if (preg_match('/\b\d{1,8}\/\d{4}\b/u', $message)) {
            $intents[] = 'cases';
        }

        if (preg_match('/05\d{8}/', $message)) {
            $intents[] = 'clients';
        }

        if (preg_match('/\b\d{10,18}\b/u', $message)) {
            $intents[] = 'clients';
        }

        if (empty($intents)) {
            $intents[] = 'general';
        }

        return array_values(array_unique($intents));
    }
}

/* =========================
   CASES
========================= */
if (!function_exists('ai_reply_cases')) {
    function ai_reply_cases(PDO $pdo, string $message): ?string
    {
        try {
            $message = trim($message);
            if ($message === '') {
                return null;
            }

            if (!ai_table_exists($pdo, 'cases')) {
                return 'جدول القضايا غير موجود في قاعدة البيانات.';
            }

            $requiredColumns = [
                'id', 'client_id', 'branch_id', 'created_by', 'case_no', 'title',
                'category', 'client_name', 'client_phone', 'client_email', 'lawyer_name',
                'status', 'next_hearing_date', 'notes', 'client_notes', 'created_at',
                'client_access_code', 'is_secret',
            ];

            foreach ($requiredColumns as $col) {
                if (!ai_column_exists($pdo, 'cases', $col)) {
                    return 'يوجد نقص في هيكل جدول القضايا: العمود ' . $col . ' غير موجود.';
                }
            }

            $role   = strtoupper((string)($_SESSION['role'] ?? 'STAFF'));
            $scope  = ai_branch_scope_for_role($role, $message);
            $msg    = mb_strtolower($message, 'UTF-8');
            $caseNo = ai_extract_case_no($message);
            $statusWanted = ai_detect_case_status_from_text($message);

            $baseWhere  = [];
            $baseParams = [];

            if (!$scope['is_owner']) {
                $baseWhere[] = "COALESCE(c.is_secret, 0) = 0";
            }

            ai_apply_branch_filter($baseWhere, $baseParams, $scope, 'c.branch_id');

            $select = "
                SELECT
                    c.id,
                    c.client_id,
                    c.branch_id,
                    c.created_by,
                    c.case_no,
                    c.title,
                    c.category,
                    c.client_name,
                    c.client_phone,
                    c.client_email,
                    c.lawyer_name,
                    c.status,
                    c.next_hearing_date,
                    c.notes,
                    c.client_notes,
                    c.created_at,
                    c.client_access_code,
                    c.is_secret
                FROM cases c
            ";

            $asksCasesCount = (
                mb_strpos($msg, 'كم عدد القضايا') !== false ||
                mb_strpos($msg, 'عدد القضايا') !== false ||
                mb_strpos($msg, 'كم قضية') !== false
            );

            $asksLatestCases = (
                mb_strpos($msg, 'آخر القضايا') !== false ||
                mb_strpos($msg, 'اخر القضايا') !== false ||
                mb_strpos($msg, 'أحدث القضايا') !== false ||
                mb_strpos($msg, 'احدث القضايا') !== false
            );

            $asksLatestCase = (
                mb_strpos($msg, 'آخر قضية') !== false ||
                mb_strpos($msg, 'اخر قضية') !== false ||
                mb_strpos($msg, 'أحدث قضية') !== false ||
                mb_strpos($msg, 'احدث قضية') !== false
            );

            if ($asksCasesCount) {
                $sql = "SELECT COUNT(*) FROM cases c";
                $where = $baseWhere;
                $params = $baseParams;

                if ($statusWanted !== null) {
                    $where[] = "c.status = ?";
                    $params[] = $statusWanted;
                }

                if ($where) {
                    $sql .= " WHERE " . implode(' AND ', $where);
                }

                $st = $pdo->prepare($sql);
                $st->execute($params);
                $count = (int)$st->fetchColumn();

                return $statusWanted !== null
                    ? 'عدد القضايا بحالة ' . ai_cases_status_label($statusWanted) . ai_scope_label($scope) . ': ' . $count
                    : 'عدد القضايا المسجلة في النظام' . ai_scope_label($scope) . ': ' . $count;
            }

            if ($asksLatestCases) {
                $sql = $select;
                $where = $baseWhere;
                $params = $baseParams;

                if ($statusWanted !== null) {
                    $where[] = "c.status = ?";
                    $params[] = $statusWanted;
                }

                if ($where) {
                    $sql .= " WHERE " . implode(' AND ', $where);
                }

                $sql .= " ORDER BY c.id DESC LIMIT 5";

                $st = $pdo->prepare($sql);
                $st->execute($params);
                $rows = $st->fetchAll(PDO::FETCH_ASSOC);

                if (!$rows) {
                    return 'لا توجد قضايا مسجلة حالياً' . ai_scope_label($scope) . '.';
                }

                $title = 'آخر 5 قضايا' . ai_scope_label($scope) . ':';
                $out = [$title];
                foreach ($rows as $row) {
                    $out[] =
                        '- رقم القضية: ' . ((string)($row['case_no'] ?? '—')) .
                        ' | النوع: ' . ((string)($row['title'] ?? '—')) .
                        ' | العميل: ' . ((string)($row['client_name'] ?? '—')) .
                        ' | الحالة: ' . ai_cases_status_label((string)($row['status'] ?? '')) .
                        ' | الفرع: ' . ai_branch_label((int)($row['branch_id'] ?? 0));
                }

                return implode("\n", $out);
            }

            if ($asksLatestCase) {
                $sql = $select;
                $where = $baseWhere;
                $params = $baseParams;

                if ($statusWanted !== null) {
                    $where[] = "c.status = ?";
                    $params[] = $statusWanted;
                }

                if ($where) {
                    $sql .= " WHERE " . implode(' AND ', $where);
                }

                $sql .= " ORDER BY c.id DESC LIMIT 1";

                $st = $pdo->prepare($sql);
                $st->execute($params);
                $row = $st->fetch(PDO::FETCH_ASSOC);

                if (!$row) {
                    return 'لا توجد قضية مسجلة حالياً' . ai_scope_label($scope) . '.';
                }

                $out = [];
                $out[] = 'بيانات آخر قضية' . ai_scope_label($scope) . ':';
                $out[] = 'رقم القضية: ' . ((string)($row['case_no'] ?? '—'));
                $out[] = 'نوع القضية: ' . ((string)($row['title'] ?? '—'));
                $out[] = 'التصنيف: ' . ((string)($row['category'] ?? '—'));
                $out[] = 'العميل: ' . ((string)($row['client_name'] ?? '—'));
                $out[] = 'هاتف العميل: ' . ((string)($row['client_phone'] ?? '—'));
                $out[] = 'بريد العميل: ' . ((string)($row['client_email'] ?? '—'));
                $out[] = 'المحامي: ' . ((string)($row['lawyer_name'] ?? '—'));
                $out[] = 'الحالة: ' . ai_cases_status_label((string)($row['status'] ?? ''));
                $out[] = 'الجلسة القادمة: ' . ((string)($row['next_hearing_date'] ?? '—'));
                $out[] = 'الفرع: ' . ai_branch_label((int)($row['branch_id'] ?? 0));

                return implode("\n", $out);
            }

            if ($caseNo !== null) {
                $sql = $select;
                $where = $baseWhere;
                $params = $baseParams;

                $where[] = "c.case_no = ?";
                $params[] = $caseNo;

                if ($statusWanted !== null) {
                    $where[] = "c.status = ?";
                    $params[] = $statusWanted;
                }

                $sql .= " WHERE " . implode(' AND ', $where) . " ORDER BY c.id DESC LIMIT 1";

                $st = $pdo->prepare($sql);
                $st->execute($params);
                $row = $st->fetch(PDO::FETCH_ASSOC);

                if (!$row) {
                    return 'لم أجد القضية المطلوبة ضمن نطاق صلاحيتك.';
                }

                $out = [];
                $out[] = 'تفاصيل القضية:';
                $out[] = 'رقم القضية: ' . ((string)($row['case_no'] ?? '—'));
                $out[] = 'نوع القضية: ' . ((string)($row['title'] ?? '—'));
                $out[] = 'التصنيف: ' . ((string)($row['category'] ?? '—'));
                $out[] = 'العميل: ' . ((string)($row['client_name'] ?? '—'));
                $out[] = 'هاتف العميل: ' . ((string)($row['client_phone'] ?? '—'));
                $out[] = 'بريد العميل: ' . ((string)($row['client_email'] ?? '—'));
                $out[] = 'المحامي: ' . ((string)($row['lawyer_name'] ?? '—'));
                $out[] = 'الحالة: ' . ai_cases_status_label((string)($row['status'] ?? ''));
                $out[] = 'الجلسة القادمة: ' . ((string)($row['next_hearing_date'] ?? '—'));
                $out[] = 'الفرع: ' . ai_branch_label((int)($row['branch_id'] ?? 0));
                $out[] = 'أضيفت بواسطة: ' . ((string)($row['created_by'] ?? '—'));
                $out[] = 'تاريخ الإنشاء: ' . ((string)($row['created_at'] ?? '—'));

                return implode("\n", $out);
            }

            return null;
        } catch (Throwable $e) {
            error_log('AI CASES ERROR: ' . $e->getMessage());
            return 'خطأ القضايا: ' . $e->getMessage();
        }
    }
}

/* =========================
   CLIENTS
========================= */
if (!function_exists('ai_reply_clients')) {
    function ai_reply_clients(PDO $pdo, string $message, int $clientId = 0): ?string
    {
        try {
            $message = trim($message);
            if ($message === '') {
                return null;
            }

            if (!ai_table_exists($pdo, 'clients')) {
                return 'جدول العملاء غير موجود في قاعدة البيانات.';
            }

            $requiredColumns = [
                'id', 'name', 'id_number', 'phone', 'email',
                'notes', 'reminder_date', 'created_at', 'document', 'branch_id',
            ];

            foreach ($requiredColumns as $col) {
                if (!ai_column_exists($pdo, 'clients', $col)) {
                    return 'يوجد نقص في هيكل جدول العملاء: العمود ' . $col . ' غير موجود.';
                }
            }

            $role  = strtoupper((string)($_SESSION['role'] ?? 'STAFF'));
            $scope = ai_branch_scope_for_role($role, $message);
            $msg   = mb_strtolower($message, 'UTF-8');

            $asksClientsCount = (
                mb_strpos($msg, 'كم عدد العملاء') !== false ||
                mb_strpos($msg, 'عدد العملاء') !== false ||
                mb_strpos($msg, 'كم عميل') !== false ||
                mb_strpos($msg, 'عدد العميل') !== false
            );

            $asksLatestClients = (
                mb_strpos($msg, 'آخر العملاء') !== false ||
                mb_strpos($msg, 'اخر العملاء') !== false ||
                mb_strpos($msg, 'أحدث العملاء') !== false ||
                mb_strpos($msg, 'احدث العملاء') !== false
            );

            $asksLatestClient = (
                mb_strpos($msg, 'آخر عميل') !== false ||
                mb_strpos($msg, 'اخر عميل') !== false ||
                mb_strpos($msg, 'أحدث عميل') !== false ||
                mb_strpos($msg, 'احدث عميل') !== false
            );

            $asksPhone = (
                mb_strpos($msg, 'هاتف') !== false ||
                mb_strpos($msg, 'جوال') !== false
            );

            $asksEmail = (
                mb_strpos($msg, 'ايميل') !== false ||
                mb_strpos($msg, 'إيميل') !== false ||
                mb_strpos($msg, 'بريد') !== false ||
                mb_strpos($msg, 'email') !== false
            );

            $asksIdNumber = (
                mb_strpos($msg, 'هوية') !== false ||
                mb_strpos($msg, 'رقم الهوية') !== false ||
                mb_strpos($msg, 'id number') !== false
            );

            $asksNotes = (
                mb_strpos($msg, 'ملاحظات') !== false ||
                mb_strpos($msg, 'ملاحظة') !== false ||
                mb_strpos($msg, 'notes') !== false
            );

            $asksReminder = (
                mb_strpos($msg, 'تذكير') !== false ||
                mb_strpos($msg, 'موعد') !== false ||
                mb_strpos($msg, 'reminder') !== false
            );

            $missingField = ai_detect_missing_client_field($message);
            $missingLabel = $missingField !== null ? ai_clients_missing_field_label($missingField) : null;

            if ($asksClientsCount) {
                $sql = "SELECT COUNT(*) FROM clients";
                $where = [];
                $params = [];

                if ($missingField !== null) {
                    $where[] = ai_clients_missing_field_condition($missingField);
                }

                ai_apply_branch_filter($where, $params, $scope, 'branch_id');

                if ($where) {
                    $sql .= " WHERE " . implode(' AND ', $where);
                }

                $st = $pdo->prepare($sql);
                $st->execute($params);
                $count = (int)$st->fetchColumn();

                if ($missingField !== null) {
                    return 'عدد العملاء بدون ' . $missingLabel . ai_scope_label($scope) . ': ' . $count;
                }

                return 'عدد العملاء المسجلين في النظام' . ai_scope_label($scope) . ': ' . $count;
            }

            if ($asksLatestClients) {
                $sql = "
                    SELECT id, name, phone, email, branch_id
                    FROM clients
                ";
                $where = [];
                $params = [];

                if ($missingField !== null) {
                    $where[] = ai_clients_missing_field_condition($missingField);
                }

                ai_apply_branch_filter($where, $params, $scope, 'branch_id');

                if ($where) {
                    $sql .= " WHERE " . implode(' AND ', $where);
                }

                $sql .= " ORDER BY id DESC LIMIT 5";

                $stLatest = $pdo->prepare($sql);
                $stLatest->execute($params);
                $latestRows = $stLatest->fetchAll(PDO::FETCH_ASSOC);

                if (!$latestRows) {
                    return 'لا يوجد عملاء مسجلون حالياً' . ai_scope_label($scope) . '.';
                }

                $title = $missingField !== null
                    ? 'آخر 5 عملاء بدون ' . $missingLabel . ai_scope_label($scope) . ':'
                    : 'آخر 5 عملاء' . ai_scope_label($scope) . ':';

                $out = [$title];
                foreach ($latestRows as $r) {
                    $out[] =
                        '- ID: ' . (string)($r['id'] ?? '—') .
                        ' | الاسم: ' . (string)($r['name'] ?? '—') .
                        ' | الهاتف: ' . (((string)($r['phone'] ?? '')) !== '' ? (string)$r['phone'] : 'غير موجود') .
                        ' | البريد: ' . (((string)($r['email'] ?? '')) !== '' ? (string)$r['email'] : 'غير موجود') .
                        ' | الفرع: ' . ai_branch_label((int)($r['branch_id'] ?? 0));
                }

                return implode("\n", $out);
            }

            if ($asksLatestClient) {
                $sql = "
                    SELECT id, name, id_number, phone, email, notes, reminder_date, created_at, document, branch_id
                    FROM clients
                ";
                $where = [];
                $params = [];

                if ($missingField !== null) {
                    $where[] = ai_clients_missing_field_condition($missingField);
                }

                ai_apply_branch_filter($where, $params, $scope, 'branch_id');

                if ($where) {
                    $sql .= " WHERE " . implode(' AND ', $where);
                }

                $sql .= " ORDER BY id DESC LIMIT 1";

                $st = $pdo->prepare($sql);
                $st->execute($params);
                $row = $st->fetch(PDO::FETCH_ASSOC);

                if (!$row) {
                    return 'لا يوجد عميل مسجل حالياً' . ai_scope_label($scope) . '.';
                }

                if ($asksIdNumber) {
                    return 'رقم هوية آخر عميل (' . ($row['name'] ?? '—') . ')' . ai_scope_label($scope) . ': ' . (((string)($row['id_number'] ?? '')) !== '' ? (string)$row['id_number'] : 'غير موجود');
                }

                if ($asksPhone) {
                    return 'رقم هاتف آخر عميل (' . ($row['name'] ?? '—') . ')' . ai_scope_label($scope) . ': ' . (((string)($row['phone'] ?? '')) !== '' ? (string)$row['phone'] : 'غير موجود');
                }

                if ($asksEmail) {
                    return 'بريد آخر عميل (' . ($row['name'] ?? '—') . ')' . ai_scope_label($scope) . ': ' . (((string)($row['email'] ?? '')) !== '' ? (string)$row['email'] : 'غير موجود');
                }

                if ($asksReminder) {
                    return 'تاريخ تذكير آخر عميل (' . ($row['name'] ?? '—') . ')' . ai_scope_label($scope) . ': ' . (((string)($row['reminder_date'] ?? '')) !== '' ? (string)$row['reminder_date'] : 'غير محدد');
                }

                if ($asksNotes) {
                    return 'ملاحظات آخر عميل (' . ($row['name'] ?? '—') . ')' . ai_scope_label($scope) . ': ' . (((string)($row['notes'] ?? '')) !== '' ? (string)$row['notes'] : 'لا توجد ملاحظات');
                }

                $out = [];
                $out[] = 'بيانات آخر عميل' . ai_scope_label($scope) . ':';
                $out[] = 'الرقم: ' . ((string)($row['id'] ?? '—'));
                $out[] = 'الاسم: ' . ((string)($row['name'] ?? '—'));
                $out[] = 'رقم الهوية: ' . ((string)($row['id_number'] ?? '—'));
                $out[] = 'الهاتف: ' . ((string)($row['phone'] ?? '—'));
                $out[] = 'البريد: ' . ((string)($row['email'] ?? '—'));
                $out[] = 'الملاحظات: ' . ((string)($row['notes'] ?? '—'));
                $out[] = 'تاريخ التذكير: ' . ((string)($row['reminder_date'] ?? '—'));
                $out[] = 'الملف: ' . ((string)($row['document'] ?? '—'));
                $out[] = 'الفرع: ' . ai_branch_label((int)($row['branch_id'] ?? 0));
                $out[] = 'تاريخ الإنشاء: ' . ((string)($row['created_at'] ?? '—'));

                return implode("\n", $out);
            }

            $where = [];
            $params = [];

            if ($clientId > 0) {
                $where[] = 'id = ?';
                $params[] = $clientId;
            } else {
                $foundPhone = null;
                $foundIdNumber = null;

                if (preg_match('/\b05\d{8}\b/u', $message, $mPhone)) {
                    $foundPhone = trim((string)$mPhone[0]);
                }

                if (preg_match('/\b\d{10,18}\b/u', $message, $mId)) {
                    $candidate = trim((string)$mId[0]);
                    if ($foundPhone === null || $candidate !== $foundPhone) {
                        $foundIdNumber = $candidate;
                    }
                }

                if ($foundPhone !== null) {
                    $where[] = 'phone = ?';
                    $params[] = $foundPhone;
                } elseif ($foundIdNumber !== null) {
                    $where[] = 'id_number = ?';
                    $params[] = $foundIdNumber;
                } else {
                    $clean = preg_replace('/[^\p{L}\p{N}\s@.\-_]/u', ' ', $message);
                    $parts = preg_split('/\s+/u', (string)$clean, -1, PREG_SPLIT_NO_EMPTY);

                    $stopWords = [
                        'عميل', 'العميل', 'العملاء', 'عملاء', 'عميله', 'العميله',
                        'موكل', 'موكله', 'موكلة',
                        'بيانات', 'اسم', 'هاتف', 'رقم', 'جوال',
                        'ايميل', 'إيميل', 'بريد', 'هوية', 'رقم الهوية',
                        'ملاحظات', 'ملاحظة', 'تذكير', 'موعد',
                        'اعطني', 'اعرض', 'ابحث', 'عن', 'للعميل',
                        'client', 'clients',
                        'كم', 'عدد', 'آخر', 'اخر', 'أحدث', 'احدث',
                        'فرع', 'دبي', 'أبوظبي', 'ابوظبي', 'الشارقة', 'شارقة', 'العين',
                        'كل', 'الفروع', 'جميع',
                        'بدون', 'بلا', 'لا', 'يوجد', 'مسجلة', 'مسجل', 'لديهم'
                    ];

                    $parts = ai_normalize_terms($parts ?: [], $stopWords);

                    foreach ($parts as $part) {
                        $where[] = '(name LIKE ? OR phone LIKE ? OR email LIKE ? OR id_number LIKE ? OR notes LIKE ?)';
                        $like = '%' . $part . '%';
                        array_push($params, $like, $like, $like, $like, $like);
                    }
                }
            }

            if (!$where) {
                return null;
            }

            ai_apply_branch_filter($where, $params, $scope, 'branch_id');

            $sql = "
                SELECT id, name, id_number, phone, email, notes, reminder_date, created_at, document, branch_id
                FROM clients
                WHERE " . implode(' AND ', $where) . "
                ORDER BY id DESC
                LIMIT 5
            ";

            $st = $pdo->prepare($sql);
            $st->execute($params);
            $rows = $st->fetchAll(PDO::FETCH_ASSOC);

            if (!$rows) {
                return 'لم أجد عميلًا مطابقًا ضمن نطاق صلاحيتك.';
            }

            if (count($rows) === 1) {
                $row = $rows[0];

                if ($asksPhone) {
                    return 'رقم هاتف العميل ' . ($row['name'] ?? '—') . ': ' . (((string)($row['phone'] ?? '')) !== '' ? (string)$row['phone'] : 'غير موجود');
                }

                if ($asksEmail) {
                    return 'بريد العميل ' . ($row['name'] ?? '—') . ': ' . (((string)($row['email'] ?? '')) !== '' ? (string)$row['email'] : 'غير موجود');
                }

                if ($asksIdNumber) {
                    return 'رقم هوية العميل ' . ($row['name'] ?? '—') . ': ' . (((string)($row['id_number'] ?? '')) !== '' ? (string)$row['id_number'] : 'غير موجود');
                }

                if ($asksReminder) {
                    return 'تاريخ تذكير العميل ' . ($row['name'] ?? '—') . ': ' . (((string)($row['reminder_date'] ?? '')) !== '' ? (string)$row['reminder_date'] : 'غير محدد');
                }

                if ($asksNotes) {
                    return 'ملاحظات العميل ' . ($row['name'] ?? '—') . ': ' . (((string)($row['notes'] ?? '')) !== '' ? (string)$row['notes'] : 'لا توجد ملاحظات');
                }

                $out = [];
                $out[] = 'بيانات العميل:';
                $out[] = 'الرقم: ' . ((string)($row['id'] ?? '—'));
                $out[] = 'الاسم: ' . ((string)($row['name'] ?? '—'));
                $out[] = 'رقم الهوية: ' . ((string)($row['id_number'] ?? '—'));
                $out[] = 'الهاتف: ' . ((string)($row['phone'] ?? '—'));
                $out[] = 'البريد: ' . ((string)($row['email'] ?? '—'));
                $out[] = 'الملاحظات: ' . ((string)($row['notes'] ?? '—'));
                $out[] = 'تاريخ التذكير: ' . ((string)($row['reminder_date'] ?? '—'));
                $out[] = 'الملف: ' . ((string)($row['document'] ?? '—'));
                $out[] = 'الفرع: ' . ai_branch_label((int)($row['branch_id'] ?? 0));
                $out[] = 'تاريخ الإنشاء: ' . ((string)($row['created_at'] ?? '—'));

                return implode("\n", $out);
            }

            $out = ['وجدت أكثر من عميل مطابق:'];
            foreach ($rows as $row) {
                $out[] =
                    '- ID: ' . ((string)($row['id'] ?? '—')) .
                    ' | الاسم: ' . ((string)($row['name'] ?? '—')) .
                    ' | الهاتف: ' . ((string)($row['phone'] ?? '—')) .
                    ' | البريد: ' . ((string)($row['email'] ?? '—')) .
                    ' | الفرع: ' . ai_branch_label((int)($row['branch_id'] ?? 0));
            }

            return implode("\n", $out);

        } catch (Throwable $e) {
            error_log('AI CLIENTS ERROR: ' . $e->getMessage());
            return 'خطأ العملاء: ' . $e->getMessage();
        }
    }
}

/* =========================
   EMPLOYEES + ACHIEVEMENTS
========================= */
if (!function_exists('ai_reply_employees')) {
    function ai_reply_employees(PDO $pdo, string $message): ?string
    {
        try {
            $message = trim($message);
            if ($message === '') {
                return null;
            }

            if (!ai_table_exists($pdo, 'employees')) {
                return 'جدول الموظفين غير موجود في قاعدة البيانات.';
            }

            $nameCol = ai_column_exists($pdo, 'employees', 'name')
                ? 'name'
                : (ai_column_exists($pdo, 'employees', 'full_name') ? 'full_name' : null);

            $emailCol        = ai_column_exists($pdo, 'employees', 'email') ? 'email' : null;
            $phoneCol        = ai_column_exists($pdo, 'employees', 'phone') ? 'phone' : null;
            $userIdCol       = ai_column_exists($pdo, 'employees', 'user_id') ? 'user_id' : null;
            $roleCol         = ai_column_exists($pdo, 'employees', 'role') ? 'role' : null;
            $employeeTypeCol = ai_column_exists($pdo, 'employees', 'employee_type') ? 'employee_type' : null;
            $branchIdCol     = ai_column_exists($pdo, 'employees', 'branch_id') ? 'branch_id' : null;
            $createdAtCol    = ai_column_exists($pdo, 'employees', 'created_at') ? 'created_at' : null;

            if ($nameCol === null) {
                return 'يوجد نقص في هيكل جدول الموظفين: لا يوجد عمود name أو full_name.';
            }

            $role  = strtoupper((string)($_SESSION['role'] ?? 'STAFF'));
            $scope = ai_branch_scope_for_role($role, $message);

            $msg = mb_strtolower($message, 'UTF-8');

            $asksEmployeesCount = (
                mb_strpos($msg, 'كم عدد الموظفين') !== false ||
                mb_strpos($msg, 'عدد الموظفين') !== false ||
                mb_strpos($msg, 'كم موظف') !== false ||
                mb_strpos($msg, 'عدد الموظف') !== false ||
                mb_strpos($msg, 'كم موظفة') !== false ||
                mb_strpos($msg, 'عدد الموظفات') !== false ||
                mb_strpos($msg, 'كم موظفه') !== false
            );

            if ($asksEmployeesCount) {
                $sql = "SELECT COUNT(*) FROM employees";
                $where = [];
                $params = [];

                if ($branchIdCol !== null) {
                    ai_apply_branch_filter($where, $params, $scope, $branchIdCol);
                }

                if ($where) {
                    $sql .= " WHERE " . implode(' AND ', $where);
                }

                $stCount = $pdo->prepare($sql);
                $stCount->execute($params);
                $count = (int)$stCount->fetchColumn();

                return 'عدد الموظفين المسجلين في النظام' . ai_scope_label($scope) . ': ' . $count;
            }

            $asksEmail = (
                mb_strpos($msg, 'بريد') !== false ||
                mb_strpos($msg, 'ايميل') !== false ||
                mb_strpos($msg, 'إيميل') !== false ||
                mb_strpos($msg, 'email') !== false
            );

            $asksPhone = (
                mb_strpos($msg, 'هاتف') !== false ||
                mb_strpos($msg, 'جوال') !== false ||
                mb_strpos($msg, 'رقم هاتف') !== false
            );

            $asksAchievements = (
                mb_strpos($msg, 'انجاز') !== false ||
                mb_strpos($msg, 'إنجاز') !== false ||
                mb_strpos($msg, 'انجازات') !== false ||
                mb_strpos($msg, 'إنجازات') !== false
            );

            $asksAllEmployees = (
                mb_strpos($msg, 'كل الموظفين') !== false ||
                mb_strpos($msg, 'جميع الموظفين') !== false ||
                mb_strpos($msg, 'كل الموظفات') !== false ||
                mb_strpos($msg, 'جميع الموظفات') !== false ||
                mb_strpos($msg, 'انجازات الموظفين') !== false
            );

            if ($asksAchievements && $asksAllEmployees) {
                if (!ai_table_exists($pdo, 'employee_achievements')) {
                    return 'جدول إنجازات الموظفين غير موجود.';
                }

                $sql = "
                    SELECT
                        e.id,
                        {$nameCol} AS emp_name,
                        COUNT(a.id) AS total
                    FROM employees e
                    LEFT JOIN employee_achievements a
                        ON a.employee_id = e.id
                ";

                $where = [];
                $params = [];

                if ($branchIdCol !== null) {
                    ai_apply_branch_filter($where, $params, $scope, 'e.' . $branchIdCol);
                }

                if ($where) {
                    $sql .= " WHERE " . implode(' AND ', $where);
                }

                $sql .= "
                    GROUP BY e.id
                    ORDER BY total DESC, e.id DESC
                ";

                $st = $pdo->prepare($sql);
                $st->execute($params);
                $rows = $st->fetchAll(PDO::FETCH_ASSOC);

                if (!$rows) {
                    return 'لا توجد إنجازات مسجلة للموظفين' . ai_scope_label($scope) . '.';
                }

                $out = [];
                $out[] = 'إنجازات جميع الموظفين' . ai_scope_label($scope) . ':';

                foreach ($rows as $r) {
                    $name  = (string)($r['emp_name'] ?? '—');
                    $count = (int)($r['total'] ?? 0);
                    $out[] = '- ' . $name . ' : ' . $count . ' إنجاز';
                }

                return implode("\n", $out);
            }

            $period = 'all';
            if (
                mb_strpos($msg, 'لليوم') !== false ||
                mb_strpos($msg, 'اليوم') !== false
            ) {
                $period = 'today';
            } elseif (
                mb_strpos($msg, 'للاسبوع') !== false ||
                mb_strpos($msg, 'للأسبوع') !== false ||
                mb_strpos($msg, 'الاسبوع') !== false ||
                mb_strpos($msg, 'الأسبوع') !== false
            ) {
                $period = 'week';
            } elseif (
                mb_strpos($msg, 'للشهر') !== false ||
                mb_strpos($msg, 'الشهر') !== false
            ) {
                $period = 'month';
            }

            $clean = preg_replace('/[^\p{L}\p{N}\s@.\-_]/u', ' ', $message);
            $parts = preg_split('/\s+/u', (string)$clean, -1, PREG_SPLIT_NO_EMPTY);

            $stopWords = [
                'الموظف', 'موظف', 'الموظفين', 'موظفين',
                'الموظفة', 'الموظفه', 'موظفة', 'موظفه',
                'الموظفات', 'موظفات',
                'بيانات', 'معلومات', 'تفاصيل',
                'بريد', 'البريد', 'الكتروني', 'إلكتروني',
                'ايميل', 'إيميل', 'email',
                'هاتف', 'جوال', 'رقم',
                'اعطني', 'اعرض', 'ابحث', 'عن', 'لـ', 'لل',
                'كم', 'عدد',
                'انجاز', 'إنجاز', 'انجازات', 'إنجازات',
                'اليوم', 'لليوم', 'الاسبوع', 'الأسبوع', 'للاسبوع', 'للأسبوع', 'الشهر', 'للشهر',
                'فرع', 'دبي', 'أبوظبي', 'ابوظبي', 'الشارقة', 'شارقة', 'العين',
                'كل', 'الفروع', 'جميع'
            ];

            $parts = ai_normalize_terms($parts ?: [], $stopWords);

            $selectCols = [
                "id",
                "{$nameCol} AS emp_name",
                $emailCol !== null ? "{$emailCol} AS emp_email" : "NULL AS emp_email",
                $phoneCol !== null ? "{$phoneCol} AS emp_phone" : "NULL AS emp_phone",
                $userIdCol !== null ? "{$userIdCol} AS emp_user_id" : "NULL AS emp_user_id",
                $roleCol !== null ? "{$roleCol} AS emp_role" : "NULL AS emp_role",
                $employeeTypeCol !== null ? "{$employeeTypeCol} AS emp_employee_type" : "NULL AS emp_employee_type",
                $branchIdCol !== null ? "{$branchIdCol} AS emp_branch_id" : "NULL AS emp_branch_id",
                $createdAtCol !== null ? "{$createdAtCol} AS emp_created_at" : "NULL AS emp_created_at",
            ];

            $rows = [];
            $matchedExactlyBySentence = false;

            $sqlSentence = "
                SELECT " . implode(",\n", $selectCols) . "
                FROM employees
                WHERE ? LIKE CONCAT('%', {$nameCol}, '%')
            ";

            $sentenceWhere = [];
            $sentenceParams = [$message];

            if ($branchIdCol !== null) {
                ai_apply_branch_filter($sentenceWhere, $sentenceParams, $scope, $branchIdCol);
            }

            if ($sentenceWhere) {
                $sqlSentence .= " AND " . implode(' AND ', $sentenceWhere);
            }

            $sqlSentence .= " ORDER BY id DESC LIMIT 5";

            $stSentence = $pdo->prepare($sqlSentence);
            $stSentence->execute($sentenceParams);
            $rows = $stSentence->fetchAll(PDO::FETCH_ASSOC);

            if ($rows) {
                $matchedExactlyBySentence = true;
            }

            if (!$rows && $parts) {
                $searchable = [$nameCol];
                if ($emailCol !== null) {
                    $searchable[] = $emailCol;
                }
                if ($phoneCol !== null) {
                    $searchable[] = $phoneCol;
                }
                if ($roleCol !== null) {
                    $searchable[] = $roleCol;
                }
                if ($employeeTypeCol !== null) {
                    $searchable[] = $employeeTypeCol;
                }

                $where = [];
                $params = [];

                foreach ($parts as $part) {
                    $likeGroup = [];
                    foreach ($searchable as $col) {
                        $likeGroup[] = "{$col} LIKE ?";
                        $params[] = '%' . $part . '%';
                    }
                    if ($likeGroup) {
                        $where[] = '(' . implode(' OR ', $likeGroup) . ')';
                    }
                }

                if ($branchIdCol !== null) {
                    ai_apply_branch_filter($where, $params, $scope, $branchIdCol);
                }

                if ($where) {
                    $sql = "
                        SELECT " . implode(",\n", $selectCols) . "
                        FROM employees
                        WHERE " . implode(' AND ', $where) . "
                        ORDER BY id DESC
                        LIMIT 5
                    ";

                    $st = $pdo->prepare($sql);
                    $st->execute($params);
                    $rows = $st->fetchAll(PDO::FETCH_ASSOC);
                }
            }

            if (!$rows && $asksAchievements) {
                return 'لم أجد موظفًا أو موظفة مطابقة للاسم المطلوب ضمن نطاق صلاحيتك لعرض الإنجازات.';
            }

            if (!$rows) {
                return 'لم أجد موظفًا أو موظفة مطابقة في النظام ضمن نطاق صلاحيتك.';
            }

            if ($asksAchievements && count($rows) === 1) {
                $employee = $rows[0];
                $employeeId = (int)($employee['id'] ?? 0);
                $employeeName = (string)($employee['emp_name'] ?? '—');

                $periodLabel = match ($period) {
                    'today' => 'اليوم',
                    'week'  => 'الأسبوع',
                    'month' => 'الشهر',
                    default => 'كل الفترات',
                };

                if (ai_table_exists($pdo, 'employee_achievements')) {
                    $hasEmpCol   = ai_column_exists($pdo, 'employee_achievements', 'employee_id');
                    $hasTitleCol = ai_column_exists($pdo, 'employee_achievements', 'title');
                    $hasDescCol  = ai_column_exists($pdo, 'employee_achievements', 'description');
                    $hasDateCol  = ai_column_exists($pdo, 'employee_achievements', 'achievement_date');

                    if ($hasEmpCol && $hasDateCol) {
                        $rangeSql = '';
                        if ($period === 'today') {
                            $rangeSql = " AND DATE(achievement_date) = CURDATE() ";
                        } elseif ($period === 'week') {
                            $rangeSql = " AND YEARWEEK(achievement_date, 1) = YEARWEEK(CURDATE(), 1) ";
                        } elseif ($period === 'month') {
                            $rangeSql = " AND YEAR(achievement_date) = YEAR(CURDATE()) AND MONTH(achievement_date) = MONTH(CURDATE()) ";
                        }

                        $titleExpr = $hasTitleCol ? "title" : "NULL";
                        $descExpr  = $hasDescCol ? "description" : "NULL";

                        $sqlAch = "
                            SELECT
                                {$titleExpr} AS ach_title,
                                {$descExpr} AS ach_description,
                                achievement_date
                            FROM employee_achievements
                            WHERE employee_id = ?
                            {$rangeSql}
                            ORDER BY achievement_date DESC
                            LIMIT 10
                        ";

                        $stAch = $pdo->prepare($sqlAch);
                        $stAch->execute([$employeeId]);
                        $achievements = $stAch->fetchAll(PDO::FETCH_ASSOC);

                        $countSql = "
                            SELECT COUNT(*)
                            FROM employee_achievements
                            WHERE employee_id = ?
                            {$rangeSql}
                        ";
                        $stCount = $pdo->prepare($countSql);
                        $stCount->execute([$employeeId]);
                        $total = (int)$stCount->fetchColumn();

                        if ($total > 0) {
                            $out = [];
                            $out[] = 'إنجازات الموظف ' . $employeeName . ' خلال ' . $periodLabel . ': ' . $total;

                            foreach ($achievements as $ach) {
                                $title = trim((string)($ach['ach_title'] ?? ''));
                                $desc  = trim((string)($ach['ach_description'] ?? ''));
                                $date  = trim((string)($ach['achievement_date'] ?? ''));

                                $line = '- ';
                                if ($title !== '') {
                                    $line .= $title;
                                } elseif ($desc !== '') {
                                    $line .= $desc;
                                } else {
                                    $line .= 'إنجاز مسجل';
                                }

                                if ($desc !== '' && $desc !== $title) {
                                    $line .= ' | ' . $desc;
                                }

                                if ($date !== '') {
                                    $line .= ' | التاريخ: ' . $date;
                                }

                                $out[] = $line;
                            }

                            return implode("\n", $out);
                        }
                    }
                }

                return 'لا توجد إنجازات مسجلة للموظف ' . $employeeName . ' خلال ' . $periodLabel . '.';
            }

            if (count($rows) === 1) {
                $row = $rows[0];

                if ($asksEmail) {
                    return 'البريد الإلكتروني للموظف ' . ($row['emp_name'] ?? '—') . ': ' . (((string)($row['emp_email'] ?? '')) !== '' ? (string)$row['emp_email'] : 'غير موجود');
                }

                if ($asksPhone) {
                    return 'رقم هاتف الموظف ' . ($row['emp_name'] ?? '—') . ': ' . (((string)($row['emp_phone'] ?? '')) !== '' ? (string)$row['emp_phone'] : 'غير موجود');
                }

                $out = [];
                $out[] = 'بيانات الموظف:';
                $out[] = 'الرقم: ' . ((string)($row['id'] ?? '—'));
                $out[] = 'الاسم: ' . ((string)($row['emp_name'] ?? '—'));
                $out[] = 'البريد الإلكتروني: ' . ((string)($row['emp_email'] ?? '—'));
                $out[] = 'الهاتف: ' . ((string)($row['emp_phone'] ?? '—'));
                $out[] = 'الدور: ' . ((string)($row['emp_role'] ?? '—'));
                $out[] = 'نوع الموظف: ' . ((string)($row['emp_employee_type'] ?? '—'));
                $out[] = 'User ID: ' . ((string)($row['emp_user_id'] ?? '—'));

                if (isset($row['emp_branch_id']) && $row['emp_branch_id'] !== null) {
                    $out[] = 'الفرع: ' . ai_branch_label((int)$row['emp_branch_id']);
                }

                if (!empty($row['emp_created_at'])) {
                    $out[] = 'تاريخ الإضافة: ' . (string)$row['emp_created_at'];
                }

                return implode("\n", $out);
            }

            if (($asksPhone || $asksEmail) && !$matchedExactlyBySentence) {
                $out = ['وجدت أكثر من موظف/موظفة مطابق، يرجى تحديد الاسم بشكل أوضح:'];
                foreach ($rows as $row) {
                    $line = '- ' . ((string)($row['emp_name'] ?? '—'));
                    if (isset($row['emp_branch_id']) && $row['emp_branch_id'] !== null) {
                        $line .= ' | الفرع: ' . ai_branch_label((int)$row['emp_branch_id']);
                    }
                    $out[] = $line;
                }
                return implode("\n", $out);
            }

            $out = ['وجدت أكثر من موظف/موظفة مطابق:'];
            foreach ($rows as $row) {
                $line =
                    '- ID: ' . ((string)($row['id'] ?? '—')) .
                    ' | الاسم: ' . ((string)($row['emp_name'] ?? '—')) .
                    ' | البريد: ' . (((string)($row['emp_email'] ?? '')) !== '' ? (string)$row['emp_email'] : 'غير موجود') .
                    ' | الهاتف: ' . (((string)($row['emp_phone'] ?? '')) !== '' ? (string)$row['emp_phone'] : 'غير موجود') .
                    ' | الدور: ' . ((string)($row['emp_role'] ?? '—'));

                if (isset($row['emp_branch_id']) && $row['emp_branch_id'] !== null) {
                    $line .= ' | الفرع: ' . ai_branch_label((int)$row['emp_branch_id']);
                }

                $out[] = $line;
            }

            return implode("\n", $out);

        } catch (Throwable $e) {
            error_log('AI EMPLOYEES ERROR: ' . $e->getMessage());
            return 'خطأ الموظفين: ' . $e->getMessage();
        }
    }
}

/* =========================
   ROUTER
========================= */
if (!function_exists('ai_run_intent')) {
    function ai_run_intent(PDO $pdo, string $intent, string $message, int $caseId = 0, int $clientId = 0): ?string
    {
        try {
            switch ($intent) {
                case 'cases':
                    return ai_reply_cases($pdo, $message);

                case 'clients':
                    return ai_reply_clients($pdo, $message, $clientId);

                case 'employees':
                    return ai_reply_employees($pdo, $message);

                case 'sessions':
                    return function_exists('ai_reply_sessions') ? ai_reply_sessions($pdo, $message) : null;

                case 'payroll':
                    return function_exists('ai_reply_payroll') ? ai_reply_payroll($pdo, $message) : null;

                case 'finance':
                    return function_exists('ai_reply_finance') ? ai_reply_finance($pdo, $message) : null;

                case 'attendance':
                    return function_exists('ai_reply_attendance') ? ai_reply_attendance($pdo, $message) : null;

                case 'laws':
                    return function_exists('ai_reply_laws') ? ai_reply_laws($pdo, $message) : null;

                case 'general':
                default:
                    return null;
            }
        } catch (Throwable $e) {
            error_log('AI INTENT ERROR [' . $intent . ']: ' . $e->getMessage());
            return null;
        }
    }
}

/* =========================
   AUTH
========================= */
if (empty($_SESSION['user_id'])) {
    ai_json_response(false, 'انتهت الجلسة. يرجى تسجيل الدخول مرة أخرى.');
}

$userId = (int)($_SESSION['user_id'] ?? 0);
$role   = strtoupper(trim((string)($_SESSION['role'] ?? 'STAFF')));

/* =========================
   INPUT
========================= */
$rawInput = file_get_contents('php://input');
$input = json_decode($rawInput, true);

if (!is_array($input)) {
    $input = [];
}

$message   = trim((string)($input['message'] ?? ''));
$sessionId = (int)($input['session_id'] ?? 0);
$caseId    = (int)($input['case_id'] ?? 0);
$clientId  = (int)($input['client_id'] ?? 0);

if ($message === '') {
    ai_json_response(false, 'الرسالة فارغة.', $sessionId);
}

/* =========================
   DB
========================= */
try {
    $pdo = db();

    if (!$pdo instanceof PDO) {
        ai_json_response(false, 'تعذر الاتصال بقاعدة البيانات.', $sessionId);
    }

    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (Throwable $e) {
    error_log('AI DB ERROR: ' . $e->getMessage());
    ai_json_response(false, 'تعذر الاتصال بقاعدة البيانات.', $sessionId);
}

/* =========================
   DETECT INTENTS
========================= */
try {
    $intents = ai_detect_intent($message);
    if (!is_array($intents)) {
        $intents = [];
    }
} catch (Throwable $e) {
    error_log('AI DETECT INTENT ERROR: ' . $e->getMessage());
    $intents = [];
}

$ml = mb_strtolower($message, 'UTF-8');

if (
    str_contains($ml, 'موظف') ||
    str_contains($ml, 'الموظف') ||
    str_contains($ml, 'الموظفين') ||
    str_contains($ml, 'موظفين') ||
    str_contains($ml, 'موظفة') ||
    str_contains($ml, 'موظفه') ||
    str_contains($ml, 'الموظفة') ||
    str_contains($ml, 'الموظفه') ||
    str_contains($ml, 'الموظفات') ||
    str_contains($ml, 'موظفات') ||
    str_contains($ml, 'انجاز') ||
    str_contains($ml, 'إنجاز') ||
    str_contains($ml, 'انجازات') ||
    str_contains($ml, 'إنجازات')
) {
    if (!in_array('employees', $intents, true)) {
        array_unshift($intents, 'employees');
    }
}

if (
    str_contains($ml, 'عميل') ||
    str_contains($ml, 'العميل') ||
    str_contains($ml, 'العملاء') ||
    str_contains($ml, 'عملاء') ||
    str_contains($ml, 'عميله') ||
    str_contains($ml, 'العميله') ||
    str_contains($ml, 'موكل') ||
    str_contains($ml, 'موكله') ||
    str_contains($ml, 'موكلة')
) {
    if (!in_array('clients', $intents, true)) {
        array_unshift($intents, 'clients');
    }
}

if (
    ai_extract_case_no($message) !== null ||
    str_contains($ml, 'قضية') ||
    str_contains($ml, 'القضية') ||
    str_contains($ml, 'القضايا') ||
    str_contains($ml, 'قضايا')
) {
    if (!in_array('cases', $intents, true)) {
        array_unshift($intents, 'cases');
    }
}

if ($caseId > 0 && !in_array('cases', $intents, true)) {
    array_unshift($intents, 'cases');
}

if ($clientId > 0 && !in_array('clients', $intents, true)) {
    array_unshift($intents, 'clients');
}

if (empty($intents)) {
    $intents = ['general'];
}

$priority = [
    'employees' => 1,
    'clients'   => 2,
    'cases'     => 3,
    'sessions'  => 4,
    'laws'      => 5,
    'general'   => 99,
];

usort($intents, static function ($a, $b) use ($priority) {
    return ($priority[$a] ?? 999) <=> ($priority[$b] ?? 999);
});

/* =========================
   ROUTE
========================= */
$reply = null;
$matchedIntent = null;

foreach ($intents as $intent) {
    if (!is_string($intent) || $intent === '') {
        continue;
    }

    if (!ai_is_allowed($intent, $role)) {
        continue;
    }

    $result = ai_run_intent($pdo, $intent, $message, $caseId, $clientId);

    if (is_string($result) && trim($result) !== '') {
        $reply = trim($result);
        $matchedIntent = $intent;
        break;
    }
}

/* =========================
   FALLBACK
========================= */
if ($reply === null || $reply === '') {
    $reply = 'لم أجد نتيجة مطابقة في النظام ضمن نطاق صلاحيتك. اكتب السؤال بصياغة تتضمن قضية أو عميل أو موظف أو إنجاز موظف وسأحاول البحث داخل النظام.';
}

/* =========================
   SAVE CHAT
========================= */
$sessionId = ai_save_chat($pdo, $sessionId, $userId, $message, $reply);

/* =========================
   RESPONSE
========================= */
ai_json_response(true, $reply, $sessionId, [
    'intent' => $matchedIntent,
]);