<?php
/**
 * functions.php - دوال عامة إضافية محسنة
 * يعتمد على core_functions.php للدوال الأساسية
 * 
 * @package MaxRestaurant
 * @version 2.0.0
 */

// منع الوصول المباشر
if (!defined('SECURE_ACCESS')) {
    die('الوصول المباشر غير مسموح');
}

// =============================================
// دوال السلة - مكملة لـ cart_functions.php
// =============================================

/**
 * تحديث سعر المنتج في السلة
 * 
 * @param int $item_index فهرس العنصر
 * @param float $price السعر الجديد
 * @return bool نجاح العملية
 */
function updateCartItemPrice($item_index, $price) {
    if (!isset($_SESSION['cart']) || !is_array($_SESSION['cart']) || !isset($_SESSION['cart'][$item_index])) {
        return false;
    }
    
    $price = max(0, (float)$price);
    $_SESSION['cart'][$item_index]['final_price'] = $price;
    $_SESSION['cart'][$item_index]['portion_price'] = $price;
    
    return true;
}

/**
 * الحصول على إجمالي عدد العناصر في السلة
 * 
 * @return int عدد العناصر الكلي
 */
function getTotalCartItems() {
    $count = 0;
    
    if (isset($_SESSION['cart']) && is_array($_SESSION['cart'])) {
        foreach ($_SESSION['cart'] as $item) {
            if (isset($item['quantity'])) {
                $count += (int)$item['quantity'];
            }
        }
    }
    
    return $count;
}

/**
 * التحقق من وجود منتج في السلة
 * 
 * @param int $meal_id معرف الوجبة
 * @param int|null $portion_id معرف القسم (اختياري)
 * @return bool|array false إذا لم يكن موجوداً، أو بيانات العنصر إذا كان موجوداً
 */
function isItemInCart($meal_id, $portion_id = null) {
    if (!isset($_SESSION['cart']) || !is_array($_SESSION['cart'])) {
        return false;
    }
    
    foreach ($_SESSION['cart'] as $index => $item) {
        if ($item['meal_id'] == $meal_id) {
            if ($portion_id === null || $item['portion_id'] == $portion_id) {
                return ['index' => $index, 'item' => $item];
            }
        }
    }
    
    return false;
}

// =============================================
// دوال تنسيق وعرض البيانات
// =============================================

/**
 * تنسيق رقم الهاتف للعرض
 * 
 * @param string $phone رقم الهاتف
 * @return string رقم الهاتف المنسق
 */
function formatPhoneNumber($phone) {
    $phone = preg_replace('/[^0-9]/', '', $phone);
    
    if (strlen($phone) == 9) {
        return substr($phone, 0, 2) . ' ' . substr($phone, 2, 3) . ' ' . substr($phone, 5, 4);
    } elseif (strlen($phone) == 10) {
        return substr($phone, 0, 3) . ' ' . substr($phone, 3, 3) . ' ' . substr($phone, 6, 4);
    }
    
    return $phone;
}

/**
 * تنسيق التاريخ بشكل مفهوم
 * 
 * @param string $date التاريخ
 * @param bool $show_time عرض الوقت
 * @return string التاريخ المنسق
 */
function formatDate($date, $show_time = true) {
    if (empty($date)) {
        return '-';
    }
    
    $timestamp = strtotime($date);
    
    // التحقق مما إذا كان التاريخ اليوم
    if (date('Y-m-d', $timestamp) == date('Y-m-d')) {
        $formatted = 'اليوم';
    } 
    // التحقق مما إذا كان التاريخ أمس
    elseif (date('Y-m-d', $timestamp) == date('Y-m-d', strtotime('-1 day'))) {
        $formatted = 'أمس';
    } 
    // تاريخ آخر
    else {
        $formatted = date('d/m/Y', $timestamp);
    }
    
    // إضافة الوقت
    if ($show_time) {
        $formatted .= ' ' . date('h:i A', $timestamp);
    }
    
    return $formatted;
}

/**
 * اقتطاع النص بطريقة ذكية
 * 
 * @param string $text النص
 * @param int $length الطول المطلوب
 * @param string $suffix النهاية
 * @return string النص المقتطع
 */
function truncateText($text, $length = 100, $suffix = '...') {
    if (mb_strlen($text, 'UTF-8') <= $length) {
        return $text;
    }
    
    return mb_substr($text, 0, $length, 'UTF-8') . $suffix;
}

// =============================================
// دوال التحقق والصحة
// =============================================

/**
 * التحقق من صحة رقم الهاتف اليمني
 * 
 * @param string $phone رقم الهاتف
 * @return bool صحة الرقم
 */
function validateYemeniPhone($phone) {
    $phone = preg_replace('/[^0-9]/', '', $phone);
    
    // التحقق من الأرقام اليمنية (77x, 71x, 73x, 70x)
    return (bool)preg_match('/^7[0-9]{8}$/', $phone);
}

/**
 * توليد كلمة مرور عشوائية قوية
 * 
 * @param int $length الطول المطلوب
 * @return string كلمة المرور
 */
function generateStrongPassword($length = 8) {
    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_-=+';
    $password = '';
    
    for ($i = 0; $i < $length; $i++) {
        $password .= $chars[random_int(0, strlen($chars) - 1)];
    }
    
    return $password;
}

/**
 * التحقق من قوة كلمة المرور
 * 
 * @param string $password كلمة المرور
 * @return array نتيجة التحقق
 */
function checkPasswordStrength($password) {
    $strength = 0;
    $messages = [];
    
    // الطول
    if (strlen($password) >= 8) {
        $strength += 25;
    } else {
        $messages[] = 'يجب أن تكون 8 أحرف على الأقل';
    }
    
    // أحرف كبيرة وصغيرة
    if (preg_match('/[a-z]/', $password) && preg_match('/[A-Z]/', $password)) {
        $strength += 25;
    } else {
        $messages[] = 'يجب أن تحتوي على أحرف كبيرة وصغيرة';
    }
    
    // أرقام
    if (preg_match('/[0-9]/', $password)) {
        $strength += 25;
    } else {
        $messages[] = 'يجب أن تحتوي على أرقام';
    }
    
    // رموز خاصة
    if (preg_match('/[^a-zA-Z0-9]/', $password)) {
        $strength += 25;
    } else {
        $messages[] = 'يُفضل إضافة رموز خاصة (!@#$%^&*)';
    }
    
    return [
        'strength' => $strength,
        'level' => $strength >= 75 ? 'قوية' : ($strength >= 50 ? 'متوسطة' : 'ضعيفة'),
        'messages' => $messages
    ];
}

// =============================================
// دوال مساعدة للطلبات
// =============================================

/**
 * الحصول على نص حالة الطلب
 * 
 * @param string $status كود الحالة
 * @return string نص الحالة
 */
function getOrderStatusText($status) {
    $statuses = [
        'pending' => '⏳ قيد الانتظار',
        'accepted' => '✅ تم القبول',
        'preparing' => '👨‍🍳 قيد التحضير',
        'ready' => '📦 جاهز للتوصيل',
        'on_the_way' => '🚚 في الطريق',
        'delivered' => '🎉 تم التوصيل',
        'cancelled' => '❌ ملغي',
        'rejected' => '⚠️ مرفوض'
    ];
    
    return $statuses[$status] ?? $status;
}

/**
 * الحصول على لون حالة الطلب (Bootstrap)
 * 
 * @param string $status كود الحالة
 * @return string كلاس اللون
 */
function getOrderStatusColor($status) {
    $colors = [
        'pending' => 'warning',
        'accepted' => 'info',
        'preparing' => 'primary',
        'ready' => 'secondary',
        'on_the_way' => 'primary',
        'delivered' => 'success',
        'cancelled' => 'danger',
        'rejected' => 'danger'
    ];
    
    return $colors[$status] ?? 'secondary';
}

/**
 * الحصول على أيقونة حالة الطلب
 * 
 * @param string $status كود الحالة
 * @return string اسم الأيقونة
 */
function getOrderStatusIcon($status) {
    $icons = [
        'pending' => 'bi-clock-history',
        'accepted' => 'bi-check-circle',
        'preparing' => 'bi-egg-fried',
        'ready' => 'bi-box',
        'on_the_way' => 'bi-truck',
        'delivered' => 'bi-check2-circle',
        'cancelled' => 'bi-x-circle',
        'rejected' => 'bi-exclamation-triangle'
    ];
    
    return $icons[$status] ?? 'bi-question-circle';
}

// =============================================
// دوال مساعدة للعناوين URL
// =============================================

/**
 * إعادة توجيه آمنة
 * 
 * @param string $url الرابط
 * @param int $status_code كود الحالة
 * @return void
 */
function safeRedirect($url, $status_code = 302) {
    // منع هجمات open redirect
    $allowed_domains = [$_SERVER['HTTP_HOST'] ?? ''];
    $parsed_url = parse_url($url);
    
    if (isset($parsed_url['host']) && !in_array($parsed_url['host'], $allowed_domains)) {
        $url = 'home.php';
    }
    
    // التأكد من عدم إرسال headers بعد
    if (!headers_sent()) {
        header("Location: " . $url, true, $status_code);
        exit();
    }
    
    // Fallback إذا تم إرسال headers بالفعل
    echo "<script>window.location.href = '" . h($url) . "';</script>";
    exit();
}

/**
 * الحصول على الرابط الحالي
 * 
 * @param bool $with_query تضمين query string
 * @return string الرابط الكامل
 */
function getCurrentUrl($with_query = true) {
    $protocol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https://' : 'http://';
    $url = $protocol . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
    
    if ($with_query && !empty($_SERVER['QUERY_STRING'])) {
        $url .= '?' . $_SERVER['QUERY_STRING'];
    }
    
    return $url;
}

/**
 * إضافة معلمات إلى الرابط
 * 
 * @param string $url الرابط الأصلي
 * @param array $params المعلمات المراد إضافتها
 * @return string الرابط بعد الإضافة
 */
function addUrlParams($url, $params) {
    $parsed = parse_url($url);
    $existing_params = [];
    
    if (isset($parsed['query'])) {
        parse_str($parsed['query'], $existing_params);
    }
    
    $merged_params = array_merge($existing_params, $params);
    $query_string = http_build_query($merged_params);
    
    $new_url = $parsed['path'] ?? '';
    if (!empty($query_string)) {
        $new_url .= '?' . $query_string;
    }
    
    return $new_url;
}

// =============================================
// دوال مساعدة للـ JSON
// =============================================

/**
 * إرسال استجابة JSON موحدة
 * 
 * @param bool $success حالة النجاح
 * @param string $message الرسالة
 * @param array $data البيانات الإضافية
 * @param int $status_code كود الحالة
 * @return void
 */
function jsonResponse($success, $message = '', $data = [], $status_code = 200) {
    http_response_code($status_code);
    header('Content-Type: application/json; charset=utf-8');
    
    $response = [
        'success' => $success,
        'message' => $message,
        'data' => $data,
        'timestamp' => time()
    ];
    
    echo json_encode($response, JSON_UNESCAPED_UNICODE);
    exit();
}

/**
 * إرسال استجابة نجاح JSON
 * 
 * @param string $message الرسالة
 * @param array $data البيانات
 * @param int $status_code كود الحالة
 */
function jsonSuccess($message = 'تم بنجاح', $data = [], $status_code = 200) {
    jsonResponse(true, $message, $data, $status_code);
}

/**
 * إرسال استجابة خطأ JSON
 * 
 * @param string $message رسالة الخطأ
 * @param array $errors تفاصيل الأخطاء
 * @param int $status_code كود الحالة
 */
function jsonError($message = 'حدث خطأ', $errors = [], $status_code = 400) {
    jsonResponse(false, $message, ['errors' => $errors], $status_code);
}

// =============================================
// دوال تخزين مؤقت إضافية
// =============================================

/**
 * تخزين بيانات في الجلسة مؤقتاً
 * 
 * @param string $key المفتاح
 * @param mixed $value القيمة
 * @param int $ttl مدة الصلاحية بالثواني
 * @return bool
 */
function sessionCache($key, $value = null, $ttl = 3600) {
    if ($value === null) {
        // استرجاع
        if (isset($_SESSION['cache'][$key]) && $_SESSION['cache'][$key]['expires'] > time()) {
            return $_SESSION['cache'][$key]['data'];
        }
        return null;
    }
    
    // تخزين
    $_SESSION['cache'][$key] = [
        'data' => $value,
        'expires' => time() + $ttl,
        'created' => time()
    ];
    
    return true;
}

/**
 * تنظيف الكاش المنتهي
 * 
 * @return int عدد العناصر المحذوفة
 */
function cleanExpiredCache() {
    $count = 0;
    
    if (isset($_SESSION['cache']) && is_array($_SESSION['cache'])) {
        foreach ($_SESSION['cache'] as $key => $item) {
            if (isset($item['expires']) && $item['expires'] < time()) {
                unset($_SESSION['cache'][$key]);
                $count++;
            }
        }
    }
    
    return $count;
}

// =============================================
// دوال تحميل الصفحات (Page Loading)
// =============================================

/**
 * تسجيل وقت تحميل الصفحة
 * 
 * @return string وقت التحميل المنسق
 */
function getPageLoadTime() {
    if (isset($GLOBALS['start_time'])) {
        $load_time = microtime(true) - $GLOBALS['start_time'];
        return number_format($load_time, 3) . ' ثانية';
    }
    
    return 'غير متاح';
}

/**
 * التحقق من أن الطلب عبر AJAX
 * 
 * @return bool
 */
function isAjaxRequest() {
    return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && 
           strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest';
}

/**
 * التحقق من أن الطلب عبر POST
 * 
 * @return bool
 */
function isPostRequest() {
    return $_SERVER['REQUEST_METHOD'] === 'POST';
}

/**
 * التحقق من أن الطلب عبر GET
 * 
 * @return bool
 */
function isGetRequest() {
    return $_SERVER['REQUEST_METHOD'] === 'GET';
}

// =============================================
// دوال تنسيق العملة
// =============================================

/**
 * تنسيق المبلغ بالريال اليمني
 * 
 * @param float $amount المبلغ
 * @param bool $with_currency عرض رمز العملة
 * @return string المبلغ المنسق
 */
function formatCurrency($amount, $with_currency = true) {
    $formatted = number_format((float)$amount, 0, '.', ',');
    
    if ($with_currency) {
        $formatted .= ' ريال';
    }
    
    return $formatted;
}

/**
 * تحويل المبلغ من الحروف إلى أرقام
 * 
 * @param string $amount المبلغ نصياً
 * @return float المبلغ رقماً
 */
function parseCurrency($amount) {
    return (float)preg_replace('/[^0-9.]/', '', $amount);
}

// =============================================
// دوال النظام والتشخيص
// =============================================

/**
 * الحصول على معلومات النظام للتصحيح
 * 
 * @return array معلومات النظام
 */
function getSystemInfo() {
    return [
        'php_version' => PHP_VERSION,
        'server_software' => $_SERVER['SERVER_SOFTWARE'] ?? 'غير معروف',
        'memory_limit' => ini_get('memory_limit'),
        'upload_max_filesize' => ini_get('upload_max_filesize'),
        'post_max_size' => ini_get('post_max_size'),
        'max_execution_time' => ini_get('max_execution_time') . ' ثانية',
        'session_save_path' => session_save_path() ?: 'غير معروف',
        'timezone' => date_default_timezone_get(),
        'date' => date('Y-m-d H:i:s')
    ];
}

/**
 * تنظيف النصوص من الأحرف الخاصة
 * 
 * @param string $str النص المراد تنظيفه
 * @return string النص بعد التنظيف
 */
function cleanString($str) {
    // إزالة الأحرف غير المرئية
    $str = preg_replace('/[\x00-\x1F\x7F]/u', '', $str);
    
    // تطبيع المسافات البيضاء
    $str = preg_replace('/\s+/u', ' ', $str);
    
    return trim($str);
}

/**
 * توليد معرف فريد
 * 
 * @param int $length الطول المطلوب
 * @return string المعرف الفريد
 */
function generateUniqueId($length = 16) {
    return bin2hex(random_bytes($length / 2));
}

// ✅ تنظيف الكاش المنتهي بشكل تلقائي
register_shutdown_function('cleanExpiredCache');

?>