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

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

/**
 * إنشاء طلب جديد
 */
function createOrder($pdo, $data) {
    $required_fields = ['customer_id', 'total'];
    foreach ($required_fields as $field) {
        if (!isset($data[$field])) {
            throw new Exception("الحقل المطلوب {$field} غير موجود");
        }
    }
    
    // التحقق من وجود أعمدة الخصم
    $columns = getTableColumns($pdo, 'orders');
    
    $fields = [];
    $values = [];
    $placeholders = [];
    
    // إضافة الحقول الأساسية
    $fields[] = 'customer_id';
    $fields[] = 'total';
    $fields[] = 'status';
    $fields[] = 'created_at';
    
    $values[':customer_id'] = (int)$data['customer_id'];
    $values[':total'] = (float)$data['total'];
    $values[':status'] = $data['status'] ?? 'pending';
    $values[':created_at'] = date('Y-m-d H:i:s');
    
    // إضافة الحقول الاختيارية
    if (isset($data['subtotal']) && in_array('subtotal', $columns)) {
        $fields[] = 'subtotal';
        $values[':subtotal'] = (float)$data['subtotal'];
    }
    
    if (isset($data['delivery_fee']) && in_array('delivery_fee', $columns)) {
        $fields[] = 'delivery_fee';
        $values[':delivery_fee'] = (float)$data['delivery_fee'];
    }
    
    if (isset($data['discount_id']) && !empty($data['discount_id']) && in_array('discount_id', $columns)) {
        $fields[] = 'discount_id';
        $values[':discount_id'] = (int)$data['discount_id'];
    }
    
    if (isset($data['discount_amount']) && $data['discount_amount'] > 0 && in_array('discount_amount', $columns)) {
        $fields[] = 'discount_amount';
        $values[':discount_amount'] = (float)$data['discount_amount'];
    }
    
    if (isset($data['notes']) && !empty($data['notes']) && in_array('notes', $columns)) {
        $fields[] = 'notes';
        $values[':notes'] = htmlspecialchars($data['notes'], ENT_QUOTES, 'UTF-8');
    }
    
    if (isset($data['payment_method']) && in_array('payment_method', $columns)) {
        $fields[] = 'payment_method';
        $values[':payment_method'] = $data['payment_method'];
    }
    
    // بناء الاستعلام
    $placeholders = array_map(function($field) {
        return ':' . $field;
    }, $fields);
    
    $sql = "INSERT INTO orders (" . implode(', ', $fields) . ") 
            VALUES (" . implode(', ', $placeholders) . ")";
    
    $stmt = $pdo->prepare($sql);
    $stmt->execute($values);
    
    $order_id = $pdo->lastInsertId();
    
    // مسح كاش الطلبات
    clearCache('customer_orders_' . $data['customer_id']);
    
    return $order_id;
}

/**
 * إضافة عنصر إلى الطلب
 */
function addOrderItem($pdo, $data) {
    if (!isset($data['order_id']) || !isset($data['meal_id']) || !isset($data['quantity']) || !isset($data['price'])) {
        throw new Exception("بيانات العنصر غير مكتملة");
    }
    
    $columns = getTableColumns($pdo, 'order_items');
    
    $fields = ['order_id', 'meal_id', 'quantity', 'price'];
    $values = [
        ':order_id' => (int)$data['order_id'],
        ':meal_id' => (int)$data['meal_id'],
        ':quantity' => (int)$data['quantity'],
        ':price' => (float)$data['price']
    ];
    
    // إضافة معلومات القسم إن وجدت
    if (isset($data['portion_id']) && !empty($data['portion_id']) && in_array('portion_id', $columns)) {
        $fields[] = 'portion_id';
        $values[':portion_id'] = (int)$data['portion_id'];
    }
    
    if (isset($data['portion_name']) && !empty($data['portion_name']) && in_array('portion_name', $columns)) {
        $fields[] = 'portion_name';
        $values[':portion_name'] = htmlspecialchars($data['portion_name'], ENT_QUOTES, 'UTF-8');
    }
    
    $sql = "INSERT INTO order_items (" . implode(', ', $fields) . ") 
            VALUES (" . implode(', ', array_keys($values)) . ")";
    
    $stmt = $pdo->prepare($sql);
    $stmt->execute($values);
    
    return $pdo->lastInsertId();
}

/**
 * جلب طلبات العميل مع Caching
 */
function getCustomerOrders($pdo, $customer_id, $limit = 20) {
    $cache_key = 'customer_orders_' . $customer_id . '_' . $limit;
    
    return getCachedData($cache_key, function() use ($pdo, $customer_id, $limit) {
        $sql = "
            SELECT o.*, 
                   d.discount_name,
                   o.discount_amount as applied_discount_amount,
                   (SELECT COUNT(*) FROM order_items WHERE order_id = o.id) as items_count
            FROM orders o 
            LEFT JOIN direct_discounts d ON o.discount_id = d.id 
            WHERE o.customer_id = :customer_id 
            ORDER BY o.created_at DESC
            LIMIT :limit
        ";
        
        $stmt = $pdo->prepare($sql);
        $stmt->bindValue(':customer_id', $customer_id, PDO::PARAM_INT);
        $stmt->bindValue(':limit', $limit, PDO::PARAM_INT);
        $stmt->execute();
        
        return $stmt->fetchAll();
    }, 300); // Cache 5 دقائق
}

/**
 * جلب تفاصيل طلب محدد
 */
function getOrderDetails($pdo, $order_id, $customer_id = null) {
    $cache_key = 'order_details_' . $order_id . '_' . ($customer_id ?? '0');
    
    return getCachedData($cache_key, function() use ($pdo, $order_id, $customer_id) {
        // جلب معلومات الطلب
        $sql = "
            SELECT o.*, 
                   d.discount_name,
                   d.discount_type,
                   d.discount_value
            FROM orders o 
            LEFT JOIN direct_discounts d ON o.discount_id = d.id 
            WHERE o.id = :order_id
        ";
        
        if ($customer_id) {
            $sql .= " AND o.customer_id = :customer_id";
        }
        
        $stmt = $pdo->prepare($sql);
        $stmt->bindValue(':order_id', $order_id, PDO::PARAM_INT);
        
        if ($customer_id) {
            $stmt->bindValue(':customer_id', $customer_id, PDO::PARAM_INT);
        }
        
        $stmt->execute();
        $order = $stmt->fetch();
        
        if (!$order) {
            return null;
        }
        
        // جلب عناصر الطلب
        $sql = "
            SELECT oi.*, m.name as meal_name, m.image
            FROM order_items oi
            LEFT JOIN meals m ON oi.meal_id = m.id
            WHERE oi.order_id = :order_id
        ";
        
        $stmt = $pdo->prepare($sql);
        $stmt->bindValue(':order_id', $order_id, PDO::PARAM_INT);
        $stmt->execute();
        $order['items'] = $stmt->fetchAll();
        
        return $order;
    }, 600); // Cache 10 دقائق
}

/**
 * تحديث حالة الطلب
 */
function updateOrderStatus($pdo, $order_id, $status, $customer_id = null) {
    $sql = "UPDATE orders SET status = :status WHERE id = :order_id";
    
    if ($customer_id) {
        $sql .= " AND customer_id = :customer_id";
    }
    
    $stmt = $pdo->prepare($sql);
    $stmt->bindValue(':status', $status);
    $stmt->bindValue(':order_id', $order_id, PDO::PARAM_INT);
    
    if ($customer_id) {
        $stmt->bindValue(':customer_id', $customer_id, PDO::PARAM_INT);
    }
    
    $result = $stmt->execute();
    
    if ($result) {
        // مسح الكاش
        clearCache('order_details_' . $order_id);
        
        if ($customer_id) {
            clearCache('customer_orders_' . $customer_id);
        }
    }
    
    return $result;
}

/**
 * إرسال إشعارات الطلب
 */
function sendOrderNotifications($pdo, $order_id, $customer_id, $total) {
    try {
        // إشعار للإدارة
        $admin_sql = "
            INSERT INTO notifications (user_type, user_id, title, message, type, reference_id, created_at) 
            VALUES ('admin', 1, :title, :message, 'order', :order_id, NOW())
        ";
        
        $stmt = $pdo->prepare($admin_sql);
        $stmt->execute([
            ':title' => 'طلب جديد #' . $order_id,
            ':message' => 'تم استلام طلب جديد بقيمة ' . number_format($total, 0) . ' ريال',
            ':order_id' => $order_id
        ]);
        
        // إشعار للعميل (سيكون في التطبيق)
        // يتم التعامل معه عبر WebSockets/Push
        
    } catch (Exception $e) {
        logError("Notification error: " . $e->getMessage());
    }
}