<?php
/**
 * user_functions.php
 * دوال المستخدمين المحسنة - أداء عالي، أمان، Caching
 */

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

/**
 * جلب بيانات العميل مع Caching
 */
function getCustomerData($pdo, $customer_id, $force_refresh = false) {
    $cache_key = 'customer_data_' . $customer_id;
    
    if ($force_refresh) {
        clearCache($cache_key);
    }
    
    return getCachedData($cache_key, function() use ($pdo, $customer_id) {
        $stmt = $pdo->prepare("
            SELECT id, name, email, phone, address, created_at 
            FROM customers 
            WHERE id = ? AND is_active = 1
        ");
        $stmt->execute([$customer_id]);
        return $stmt->fetch();
    }, 3600); // Cache ساعة
}

/**
 * تحديث بيانات العميل
 */
function updateCustomerProfile($pdo, $customer_id, $data) {
    $response = ['success' => false, 'message' => '', 'data' => []];
    
    try {
        // تنظيف البيانات
        $name = trim(htmlspecialchars($data['name'] ?? '', ENT_QUOTES, 'UTF-8'));
        $phone = trim(preg_replace('/[^0-9]/', '', $data['phone'] ?? ''));
        $address = trim(htmlspecialchars($data['address'] ?? '', ENT_QUOTES, 'UTF-8'));
        $email = filter_var($data['email'] ?? '', FILTER_SANITIZE_EMAIL);
        
        // التحقق من صحة البيانات
        if (strlen($name) < 3) {
            $response['message'] = 'الاسم يجب أن يكون 3 أحرف على الأقل';
            return $response;
        }
        
        if (strlen($phone) < 9 || strlen($phone) > 10) {
            $response['message'] = 'رقم الهاتف غير صحيح';
            return $response;
        }
        
        if (strlen($address) < 5) {
            $response['message'] = 'العنوان قصير جداً';
            return $response;
        }
        
        if (!empty($email) && !filter_var($email, FILTER_VALIDATE_EMAIL)) {
            $response['message'] = 'البريد الإلكتروني غير صحيح';
            return $response;
        }
        
        // التحقق من عدم تكرار الهاتف
        $stmt = $pdo->prepare("SELECT id FROM customers WHERE phone = ? AND id != ?");
        $stmt->execute([$phone, $customer_id]);
        
        if ($stmt->fetch()) {
            $response['message'] = 'رقم الهاتف مسجل مسبقاً';
            return $response;
        }
        
        // تحديث البيانات
        $sql = "UPDATE customers SET name = ?, phone = ?, address = ?";
        $params = [$name, $phone, $address];
        
        if (!empty($email)) {
            $sql .= ", email = ?";
            $params[] = $email;
        }
        
        $sql .= " WHERE id = ?";
        $params[] = $customer_id;
        
        $stmt = $pdo->prepare($sql);
        $stmt->execute($params);
        
        if ($stmt->rowCount() > 0) {
            $response['success'] = true;
            $response['message'] = 'تم تحديث الملف الشخصي بنجاح';
            $response['data'] = [
                'name' => $name,
                'phone' => $phone,
                'address' => $address,
                'email' => $email
            ];
            
            // مسح الكاش
            clearCache('customer_data_' . $customer_id);
        } else {
            $response['message'] = 'لم يتم إجراء أي تغييرات';
        }
        
    } catch (PDOException $e) {
        logError("Profile update error: " . $e->getMessage());
        $response['message'] = 'حدث خطأ في تحديث البيانات';
    }
    
    return $response;
}

/**
 * تغيير كلمة المرور
 */
function changeCustomerPassword($pdo, $customer_id, $data) {
    $response = ['success' => false, 'message' => ''];
    
    try {
        $current = $data['current_password'] ?? '';
        $new = $data['new_password'] ?? '';
        $confirm = $data['confirm_password'] ?? '';
        
        // التحقق من صحة البيانات
        if (strlen($new) < 6) {
            $response['message'] = 'كلمة المرور الجديدة يجب أن تكون 6 أحرف على الأقل';
            return $response;
        }
        
        if ($new !== $confirm) {
            $response['message'] = 'كلمات المرور غير متطابقة';
            return $response;
        }
        
        // جلب كلمة المرور الحالية
        $stmt = $pdo->prepare("SELECT password FROM customers WHERE id = ?");
        $stmt->execute([$customer_id]);
        $user = $stmt->fetch();
        
        if (!$user) {
            $response['message'] = 'المستخدم غير موجود';
            return $response;
        }
        
        // التحقق من كلمة المرور الحالية
        if (!password_verify($current, $user['password'])) {
            $response['message'] = 'كلمة المرور الحالية غير صحيحة';
            return $response;
        }
        
        // تحديث كلمة المرور
        $hashed = password_hash($new, PASSWORD_DEFAULT);
        
        $stmt = $pdo->prepare("UPDATE customers SET password = ? WHERE id = ?");
        $stmt->execute([$hashed, $customer_id]);
        
        $response['success'] = true;
        $response['message'] = 'تم تغيير كلمة المرور بنجاح';
        
        // تسجيل الحدث
        logError("Password changed for user: $customer_id");
        
    } catch (PDOException $e) {
        logError("Password change error: " . $e->getMessage());
        $response['message'] = 'حدث خطأ في تغيير كلمة المرور';
    }
    
    return $response;
}

/**
 * جلب إحصائيات العميل مع Caching
 */
function getCustomerStats($pdo, $customer_id) {
    $cache_key = 'customer_stats_' . $customer_id;
    
    return getCachedData($cache_key, function() use ($pdo, $customer_id) {
        $stmt = $pdo->prepare("
            SELECT 
                COUNT(*) as total_orders,
                COALESCE(SUM(total), 0) as total_spent,
                COUNT(CASE WHEN status = 'delivered' THEN 1 END) as completed_orders,
                MAX(created_at) as last_order_date
            FROM orders 
            WHERE customer_id = ?
        ");
        $stmt->execute([$customer_id]);
        $stats = $stmt->fetch();
        
        return [
            'total_orders' => (int)($stats['total_orders'] ?? 0),
            'total_spent' => (float)($stats['total_spent'] ?? 0),
            'completed_orders' => (int)($stats['completed_orders'] ?? 0),
            'last_order_date' => $stats['last_order_date'] ?? null
        ];
    }, 1800); // Cache 30 دقيقة
}

/**
 * جلب عدد الشكاوي غير المقروءة
 */
function getUnreadTicketsCount($pdo, $customer_id) {
    $cache_key = 'unread_tickets_' . $customer_id;
    
    return getCachedData($cache_key, function() use ($pdo, $customer_id) {
        $stmt = $pdo->prepare("
            SELECT COUNT(*) as count
            FROM ticket_messages m
            JOIN customer_tickets t ON m.ticket_id = t.id
            WHERE t.customer_id = ? 
            AND m.sender_type = 'admin' 
            AND m.is_read = FALSE
        ");
        $stmt->execute([$customer_id]);
        $result = $stmt->fetch();
        
        return (int)($result['count'] ?? 0);
    }, 300); // Cache 5 دقائق
}

/**
 * تسجيل دخول العميل
 */
function customerLogin($pdo, $phone, $password) {
    $response = ['success' => false, 'message' => '', 'data' => null];
    
    try {
        $stmt = $pdo->prepare("
            SELECT * FROM customers 
            WHERE phone = ? AND is_active = 1
        ");
        $stmt->execute([$phone]);
        $user = $stmt->fetch();
        
        if ($user && password_verify($password, $user['password'])) {
            $_SESSION['customer_id'] = $user['id'];
            $_SESSION['customer_name'] = $user['name'];
            $_SESSION['customer_phone'] = $user['phone'];
            $_SESSION['customer_email'] = $user['email'] ?? '';
            $_SESSION['customer_address'] = $user['address'] ?? '';
            $_SESSION['last_activity'] = time();
            
            $response['success'] = true;
            $response['message'] = 'مرحباً ' . $user['name'];
            $response['data'] = $user;
            
            // تحديث آخر دخول
            $update = $pdo->prepare("UPDATE customers SET last_login = NOW() WHERE id = ?");
            $update->execute([$user['id']]);
        } else {
            $response['message'] = 'رقم الهاتف أو كلمة المرور غير صحيحة';
        }
        
    } catch (PDOException $e) {
        logError("Login error: " . $e->getMessage());
        $response['message'] = 'حدث خطأ في تسجيل الدخول';
    }
    
    return $response;
}