<?php
session_start();

if (!isset($_SESSION['user_id']) || $_SESSION['role'] !== 'admin') {
    header('Location: ../login.php');
    exit;
}

require_once '../../config/database.php';

try {
    $database = new Database();
    $db = $database->getConnection();
    
    // Create manifests table
    $create_table = "CREATE TABLE IF NOT EXISTS shipping_manifests (
        id INT AUTO_INCREMENT PRIMARY KEY,
        shipping_company_id INT NOT NULL,
        delegate_name VARCHAR(255),
        total_orders INT DEFAULT 0,
        total_cod DECIMAL(10, 2) DEFAULT 0,
        total_shipping DECIMAL(10, 2) DEFAULT 0,
        net_amount DECIMAL(10, 2) DEFAULT 0,
        notes TEXT,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        FOREIGN KEY (shipping_company_id) REFERENCES shipping_companies(id) ON DELETE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci";
    $db->exec($create_table);
    
    // Create manifest_orders junction table
    $create_junction = "CREATE TABLE IF NOT EXISTS manifest_orders (
        id INT AUTO_INCREMENT PRIMARY KEY,
        manifest_id INT NOT NULL,
        order_id INT NOT NULL,
        FOREIGN KEY (manifest_id) REFERENCES shipping_manifests(id) ON DELETE CASCADE,
        FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci";
    $db->exec($create_junction);
    
    // Get all manifests
    $query = "SELECT sm.*, sc.name as company_name,
              (SELECT COUNT(*) FROM manifest_orders WHERE manifest_id = sm.id) as orders_count
              FROM shipping_manifests sm
              JOIN shipping_companies sc ON sm.shipping_company_id = sc.id
              ORDER BY sm.created_at DESC";
    $stmt = $db->prepare($query);
    $stmt->execute();
    $manifests = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    // Get orders ready for shipping
    $query = "SELECT o.*, 
              (SELECT COUNT(*) FROM order_items WHERE order_id = o.id) as items_count
              FROM orders o
              WHERE o.status = 'processing' 
              AND o.shipping_company_id IS NULL
              ORDER BY o.created_at DESC";
    $stmt = $db->prepare($query);
    $stmt->execute();
    $ready_orders = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    // Get shipping companies
    $query = "SELECT * FROM shipping_companies WHERE is_active = 1 ORDER BY name";
    $stmt = $db->prepare($query);
    $stmt->execute();
    $companies = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
} catch (Exception $e) {
    $error = "خطأ: " . $e->getMessage();
    $manifests = [];
    $ready_orders = [];
    $companies = [];
}

$message = '';

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['create_manifest'])) {
    try {
        $company_id = $_POST['shipping_company_id'];
        $delegate_name = $_POST['delegate_name'];
        $notes = $_POST['notes'] ?? '';
        $selected_orders = $_POST['selected_orders'] ?? [];
        
        if (empty($selected_orders)) {
            $message = 'الرجاء اختيار طلبات على الأقل';
        } else {
            // Calculate totals
            $total_cod = 0;
            $total_orders = count($selected_orders);
            
            foreach ($selected_orders as $order_id) {
                $query = "SELECT total_amount FROM orders WHERE id = ?";
                $stmt = $db->prepare($query);
                $stmt->execute([$order_id]);
                $order = $stmt->fetch(PDO::FETCH_ASSOC);
                $total_cod += $order['total_amount'];
            }
            
            // Get shipping rate
            $query = "SELECT default_rate_internal FROM shipping_companies WHERE id = ?";
            $stmt = $db->prepare($query);
            $stmt->execute([$company_id]);
            $company = $stmt->fetch(PDO::FETCH_ASSOC);
            $total_shipping = $company['default_rate_internal'] * $total_orders;
            $net_amount = $total_cod - $total_shipping;
            
            // Create manifest
            $query = "INSERT INTO shipping_manifests (shipping_company_id, delegate_name, total_orders, total_cod, total_shipping, net_amount, notes) 
                      VALUES (?, ?, ?, ?, ?, ?, ?)";
            $stmt = $db->prepare($query);
            $stmt->execute([$company_id, $delegate_name, $total_orders, $total_cod, $total_shipping, $net_amount, $notes]);
            $manifest_id = $db->lastInsertId();
            
            // Add orders to manifest
            foreach ($selected_orders as $order_id) {
                $query = "INSERT INTO manifest_orders (manifest_id, order_id) VALUES (?, ?)";
                $stmt = $db->prepare($query);
                $stmt->execute([$manifest_id, $order_id]);
                
                // Update order
                $query = "UPDATE orders SET shipping_company_id = ?, status = 'shipped', shipped_at = NOW() WHERE id = ?";
                $stmt = $db->prepare($query);
                $stmt->execute([$company_id, $order_id]);
            }
            
            header("Location: manifests.php?created=" . $manifest_id);
            exit;
  