<?php
// File: /quanlybanhang/ajax/pos_ajax.php
// PHIÊN BẢN: FIX LỖI SỬA ĐƠN GỘP & CẬP NHẬT GIÁ VỐN TỨC THỜI
ini_set('display_errors', 0);
error_reporting(E_ALL);

require_once __DIR__ . '/../core/init.php';
header('Content-Type: application/json; charset=utf-8');

if (session_status() === PHP_SESSION_NONE) {
    session_start();
}

$user_id = $_SESSION['user_id'] ?? 0;
$action = $_REQUEST['action'] ?? '';

// --- 1. TÌM KIẾM SẢN PHẨM ---
function handle_search_products($conn) {
    $term = "%" . ($_GET['term'] ?? '') . "%";
    
    // Sử dụng COALESCE để xử lý trường hợp giá trị null
    // Logic: Nếu có giá vốn bình quân > 0 thì lấy, nếu không thì lấy giá gốc nhập vào
    $sql = "SELECT p.ID, p.prd_name, p.prd_code, p.prd_sell_price, p.prd_sls, 
                   IF(p.prd_average_cost > 0, p.prd_average_cost, p.prd_origin_price) as cost_price, 
                   u.prd_unit_name,
                   p.prd_quycach,        
                   p.prd_tenquycach      
            FROM cms_products p
            LEFT JOIN cms_products_unit u ON p.prd_unit_id = u.id
            WHERE (p.prd_name LIKE ? OR p.prd_code LIKE ?) 
            AND p.deleted = 0 AND p.prd_status = 1 LIMIT 30";
            
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("ss", $term, $term);
    $stmt->execute();
    
    $stmt->bind_result($id, $name, $code, $price, $inventory, $cost, $unit_name, $quycach_sl, $quycach_ten);
    
    $products = [];
    while ($stmt->fetch()) {
        $products[] = [
            'id' => $id,
            'name' => $name,
            'code' => $code,
            'price' => $price,
            'inventory' => $inventory,
            'origin_price' => $cost,
            'unit' => $unit_name,        
            'quycach_sl' => $quycach_sl, 
            'quycach_ten' => $quycach_ten,
            'label' => $name . ' - ' . $code . ' (Tồn: ' . $inventory . ')'
        ];
    }
    $stmt->close();
    echo json_encode($products);
}

// --- 2. TÌM KIẾM KHÁCH HÀNG ---
function handle_search_customers($conn) {
    $term = "%" . ($_GET['term'] ?? '') . "%";
    $sql = "SELECT ID, customer_name, customer_phone, customer_addr FROM cms_customers WHERE (customer_name LIKE ? OR customer_phone LIKE ?) LIMIT 20";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("ss", $term, $term);
    $stmt->execute();
    $stmt->bind_result($id, $name, $phone, $addr);
    $customers = [];
    while ($stmt->fetch()) {
        $customers[] = [
            'id' => $id,
            'label' => $name . ($phone ? ' - ' . $phone : ''), 
            'name' => $name,
            'phone' => $phone,
            'addr' => $addr
        ];
    }
    $stmt->close();
    echo json_encode($customers);
}

// --- 3. XỬ LÝ GIAO DỊCH (CORE LOGIC) ---
function process_transaction($conn, $user_id) {
    $order_id = intval($_POST['order_id'] ?? 0);
    
    // Safety check: Không cho phép sửa nếu không có ID hợp lệ
    $request_action = $_POST['action'] ?? ''; 
    if ($request_action === 'edit_order' && $order_id <= 0) {
        echo json_encode(['status' => 'error', 'message' => 'Lỗi hệ thống: Không tìm thấy ID đơn hàng. Vui lòng F5 lại trang.']);
        return;
    }

    $customer_id = intval($_POST['customer_id'] ?? 1);
    $notes = trim($_POST['notes'] ?? '');
    $customer_pay = floatval($_POST['customer_pay'] ?? 0);
    $items_json = $_POST['items'] ?? '[]';
    $items = json_decode($items_json, true);
    $discount_value = floatval($_POST['discount_value'] ?? 0);
    $discount_type = $_POST['discount_type'] ?? 'fixed';
    $vat_percent = floatval($_POST['vat'] ?? 0);
    $payment_method = $_POST['payment_method'] ?? 'cash';
    
    $order_action_from_js = $_POST['order_action'] ?? 'save_complete'; 
    
    // Giữ nguyên ngày bán cũ nếu là sửa đơn
    $sell_date = date('Y-m-d H:i:s');
    if ($order_id > 0) {
        $date_check = $conn->query("SELECT sell_date FROM cms_orders WHERE ID = $order_id");
        if ($row = $date_check->fetch_assoc()) {
            $sell_date = $row['sell_date'];
        }
    }

    $target_status = ($order_action_from_js === 'save_temp') ? 5 : 1; // 1: Hoàn thành, 5: Đơn tạm

    if (empty($items) || !is_array($items)) {
        echo json_encode(['status' => 'error', 'message' => 'Đơn hàng phải có ít nhất một sản phẩm.']);
        return;
    }

    // BẮT ĐẦU TRANSACTION (Đảm bảo toàn vẹn dữ liệu)
    $conn->begin_transaction();
    try {
        // =================================================================================
        // A. QUY TRÌNH HOÀN KHO (REVERT) & CẬP NHẬT GIÁ VỐN TỨC THỜI
        // =================================================================================
        if ($order_id > 0) {
            // Lock dòng đơn hàng để tránh xung đột
            $stmt_old = $conn->prepare("SELECT detail_order, order_status, output_code FROM cms_orders WHERE ID = ? FOR UPDATE");
            $stmt_old->bind_param("i", $order_id);
            $stmt_old->execute();
            $res_old = $stmt_old->get_result()->fetch_assoc();
            $stmt_old->close();

            if (!$res_old) {
                throw new Exception("Không tìm thấy đơn hàng cũ (ID: $order_id).");
            }

            $old_status = intval($res_old['order_status']);
            $old_items_decoded = json_decode($res_old['detail_order'], true);

            // [ĐIỂM QUAN TRỌNG NHẤT]: Xử lý cả Status 1 (Hoàn thành) và Status 3 (Đã gộp/Vận chuyển)
            if ($old_status === 1 || $old_status === 3) {
                
                if (!empty($old_items_decoded) && is_array($old_items_decoded)) {
                    // Chuẩn bị câu lệnh cộng lại kho
                    $stmt_revert = $conn->prepare("UPDATE cms_products SET prd_sls = COALESCE(prd_sls, 0) + ?, prd_total_value = COALESCE(prd_total_value, 0) + ? WHERE ID = ?");
                    $recalc_ids = [];

                    foreach ($old_items_decoded as $old_item) {
                        $p_id = intval($old_item['id']);
                        $p_qty = floatval($old_item['quantity']);
                        
                        // Lấy giá vốn LÚC BÁN trong quá khứ để hoàn lại đúng giá trị tiền
                        $p_cost = floatval($old_item['origin_price'] ?? 0);
                        
                        // Tính tổng giá trị cần cộng lại
                        $p_val = $p_qty * $p_cost;
                        
                        $stmt_revert->bind_param("ddi", $p_qty, $p_val, $p_id);
                        if (!$stmt_revert->execute()) {
                            throw new Exception("Lỗi khi hoàn kho sản phẩm ID: $p_id");
                        }
                        $recalc_ids[] = $p_id;
                    }
                    $stmt_revert->close();

                    // [CỰC KỲ QUAN TRỌNG]: Tính lại giá bình quân NGAY LẬP TỨC sau khi hoàn kho
                    // Để bước B bên dưới lấy được giá vốn chính xác
                    if (!empty($recalc_ids)) {
                        $stmt_fix_avg = $conn->prepare("UPDATE cms_products SET prd_average_cost = IF(prd_sls > 0, prd_total_value / prd_sls, prd_origin_price) WHERE ID = ?");
                        $unique_ids = array_unique($recalc_ids);
                        foreach ($unique_ids as $u_id) {
                            $stmt_fix_avg->bind_param("i", $u_id);
                            $stmt_fix_avg->execute();
                        }
                        $stmt_fix_avg->close();
                    }
                }
            }
        }

        // =================================================================================
        // B. LẤY DỮ LIỆU MỚI NHẤT (SAU KHI ĐÃ HOÀN KHO)
        // =================================================================================
        $sub_total = 0;
        $total_origin_price = 0;
        $total_quantity = 0;
        $items_to_save = [];
        $affected_ids = [];

        $stmt_prod = $conn->prepare("SELECT prd_name, prd_code, prd_sls, prd_origin_price, prd_average_cost FROM cms_products WHERE ID = ?");

        foreach ($items as $item) {
            $p_id = intval($item['id']);
            $p_qty = floatval($item['quantity']);
            $p_price = floatval($item['price']);
            
            // Query này sẽ lấy dữ liệu ĐÃ ĐƯỢC CẬP NHẬT ở Bước A
            $stmt_prod->bind_param("i", $p_id);
            $stmt_prod->execute();
            $stmt_prod->bind_result($p_name, $p_code, $p_sls, $p_origin, $p_avg);
            
            if (!$stmt_prod->fetch()) {
                $stmt_prod->close();
                throw new Exception("Sản phẩm ID $p_id không tồn tại.");
            }
            
            // Giá vốn cho đơn mới là giá bình quân hiện tại
            $p_cost_price = ($p_avg > 0) ? $p_avg : $p_origin;

            // --- KIỂM TRA TỒN KHO ---
            if ($target_status === 1) {
                // Vì đã hoàn kho ở Bước A, $p_sls hiện tại là TỔNG TỒN THỰC TẾ
                if ($p_qty > $p_sls) {
                     $stmt_prod->free_result(); 
                     $stmt_prod->close();
                     throw new Exception("Sản phẩm '$p_name' chỉ còn $p_sls (không đủ để xuất $p_qty).");
                }
            }

            $sub_total += ($p_qty * $p_price);
            $total_origin_price += ($p_qty * $p_cost_price);
            $total_quantity += $p_qty;
            $affected_ids[] = $p_id;

            $items_to_save[] = [
                'id' => $p_id,
                'code' => $p_code,
                'name' => $p_name,
                'quantity' => $p_qty,
                'price' => $p_price,
                'origin_price' => $p_cost_price // Lưu giá vốn tại thời điểm này
            ];
        }
        $stmt_prod->close();

        // Tính toán tiền nong
        $discount_item = ($discount_type === 'fixed') ? $discount_value : ($sub_total * ($discount_value / 100));
        $discount_percent = ($discount_type === 'percent') ? $discount_value : 0;
        if ($discount_item < 0) $discount_item = 0;
        
        $final_total_money = $sub_total - $discount_item;
        $vat_money = $final_total_money * ($vat_percent / 100);
        $final_total_money += $vat_money;
        
        $lack = $final_total_money - $customer_pay;
        if ($lack < 0) $lack = 0;

        $detail_order_json = json_encode($items_to_save, JSON_UNESCAPED_UNICODE);

        // =================================================================================
        // C. LƯU / UPDATE ĐƠN HÀNG
        // =================================================================================
        if ($order_id > 0) {
            // UPDATE: Luôn reset trạng thái về 1 (hoặc 5). 
            // Nếu đơn cũ là 3 (Gộp), sau khi sửa xong nó sẽ là 1 (Hoàn thành bình thường)
            $sql_update = "UPDATE cms_orders SET customer_id=?, notes=?, total_price=?, total_origin_price=?, total_quantity=?, total_money=?, discount_item=?, discount_percent=?, vat=?, customer_pay=?, lack=?, detail_order=?, user_upd=?, payment_method=?, order_status=?, updated=NOW() WHERE ID=?";
            $stmt = $conn->prepare($sql_update);
            $stmt->bind_param("isdddddddddsisii", $customer_id, $notes, $sub_total, $total_origin_price, $total_quantity, $final_total_money, $discount_item, $discount_percent, $vat_percent, $customer_pay, $lack, $detail_order_json, $user_id, $payment_method, $target_status, $order_id);
            
            // Lấy output_code để hiển thị
            $sql_code = $conn->query("SELECT output_code FROM cms_orders WHERE ID = $order_id");
            $row_code = $sql_code->fetch_assoc();
            $output_code = $row_code['output_code'];
        } else {
            // INSERT
            $res_code = $conn->query("SELECT MAX(ID) FROM cms_orders");
            $max_id = $res_code->fetch_row()[0];
            $next_id = ($max_id ?? 0) + 1;
            $output_code = 'HD' . str_pad($next_id, 6, '0', STR_PAD_LEFT);

            $sql_insert = "INSERT INTO cms_orders (output_code, customer_id, sell_date, notes, total_price, total_origin_price, total_quantity, total_money, discount_item, discount_percent, vat, customer_pay, lack, detail_order, user_init, created, order_status, payment_method) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NOW(), ?, ?)";
            $stmt = $conn->prepare($sql_insert);
            $stmt->bind_param("sissdddddddddsiis", $output_code, $customer_id, $sell_date, $notes, $sub_total, $total_origin_price, $total_quantity, $final_total_money, $discount_item, $discount_percent, $vat_percent, $customer_pay, $lack, $detail_order_json, $user_id, $target_status, $payment_method);
        }

        if (!$stmt->execute()) {
            throw new Exception("Lỗi database khi lưu đơn: " . $stmt->error);
        }

        if ($order_id == 0) {
            $order_id = $conn->insert_id;
        }
        $stmt->close();

        // =================================================================================
        // D. TRỪ KHO & CẬP NHẬT LẠI GIÁ VỐN LẦN CUỐI
        // =================================================================================
        if ($target_status === 1) {
            $stmt_deduct = $conn->prepare("UPDATE cms_products SET prd_sls = COALESCE(prd_sls, 0) - ?, prd_total_value = COALESCE(prd_total_value, 0) - ? WHERE ID = ?");
            
            foreach ($items_to_save as $item) {
                $val_deduct = floatval($item['quantity']) * floatval($item['origin_price']);
                $item_id_deduct = $item['id'];
                $item_qty_deduct = $item['quantity'];
                
                $stmt_deduct->bind_param("ddi", $item_qty_deduct, $val_deduct, $item_id_deduct);
                
                if (!$stmt_deduct->execute()) {
                     throw new Exception("Lỗi khi trừ kho sản phẩm ID: " . $item['id']);
                }
            }
            $stmt_deduct->close();

            // Cập nhật lại giá bình quân sau khi xuất kho (để đảm bảo tính nhất quán)
            if (!empty($affected_ids)) {
                $stmt_avg = $conn->prepare("UPDATE cms_products SET prd_average_cost = IF(prd_sls > 0, prd_total_value / prd_sls, prd_origin_price) WHERE ID = ?");
                foreach (array_unique($affected_ids) as $pid) {
                    $stmt_avg->bind_param("i", $pid);
                    $stmt_avg->execute();
                }
                $stmt_avg->close();
            }
        }

        $conn->commit(); // XÁC NHẬN GIAO DỊCH THÀNH CÔNG
        
        $msg = ($target_status === 1) ? 'Lưu và hoàn thành đơn hàng thành công!' : 'Lưu đơn khởi tạo thành công!';
        echo json_encode([
            'status' => 'success', 
            'message' => $msg, 
            'order_id' => $order_id, 
            'code' => $output_code, 
            'redirect' => ($target_status === 1)
        ]);

    } catch (Exception $e) {
        $conn->rollback(); // GẶP LỖI -> QUAY VỀ TRẠNG THÁI BAN ĐẦU
        echo json_encode(['status' => 'error', 'message' => 'Lỗi xử lý: ' . $e->getMessage()]);
    }
}

// ROUTER
switch ($action) {
    case 'save_order':
    case 'edit_order':
    case 'create_temp_order':
        process_transaction($conn, $user_id);
        break;
    case 'search_products':
        handle_search_products($conn);
        break;
    case 'search_customers':
        handle_search_customers($conn);
        break;
    default:
        echo json_encode(['status' => 'error', 'message' => 'Hành động không hợp lệ.']);
        break;
}
?>