<?php
// api_do.php
require_once 'auth_check.php';
require_once 'db.php';

header('Content-Type: application/json');
$action = $_GET['action'] ?? '';

try {
    // 1. Ambil daftar SO yang statusnya Approved / Processed
    if ($action === 'get_approved_sos') {
        $stmt = $pdo->query("
            SELECT so.id, so.so_number, so.order_date, c.customer_name 
            FROM sales_orders so 
            JOIN customers c ON so.customer_id = c.id 
            WHERE so.status IN ('Approved', 'Processed') 
            ORDER BY so.id DESC
        ");
        echo json_encode(['status' => 'success', 'data' => $stmt->fetchAll()]);
    }

    // 2. Ambil detail item SO beserta sisa qty yang belum dikirim (Parsial Check)
    elseif ($action === 'get_so_items_for_do') {
        $so_id = $_GET['so_id'] ?? 0;

        // Ambil item yang dipesan di SO
        $stmtItems = $pdo->prepare("
            SELECT sod.product_id, p.product_code, p.product_name, p.unit, sod.qty_ordered 
            FROM sales_order_details sod 
            JOIN products p ON sod.product_id = p.id 
            WHERE sod.so_id = ?
        ");
        $stmtItems->execute([$so_id]);
        $so_items = $stmtItems->fetchAll();

        // Hitung total qty yang sudah pernah dikirim sebelumnya untuk SO ini
        $stmtShipped = $pdo->prepare("
            SELECT dod.product_id, SUM(dod.qty_shipped) as total_shipped
            FROM delivery_order_details dod
            JOIN delivery_orders do ON dod.do_id = do.id
            WHERE do.so_id = ?
            GROUP BY dod.product_id
        ");
        $stmtShipped->execute([$so_id]);
        $shipped_data = [];
        foreach ($stmtShipped->fetchAll() as $row) {
            $shipped_data[$row['product_id']] = $row['total_shipped'];
        }

        // Gabungkan untuk mendapatkan sisa qty yang bisa dikirim
        $result_items = [];
        foreach ($so_items as $item) {
            $prod_id = $item['product_id'];
            $already_shipped = $shipped_data[$prod_id] ?? 0;
            $remaining_qty = $item['qty_ordered'] - $already_shipped;

            if ($remaining_qty > 0) {
                $item['already_shipped'] = $already_shipped;
                $item['remaining_qty'] = $remaining_qty;
                $result_items[] = $item;
            }
        }

        echo json_encode(['status' => 'success', 'items' => $result_items]);
    }

    // 3. Simpan Delivery Order (DO) Baru
    elseif ($action === 'save_do') {
        $so_id        = $_POST['so_id'] ?? '';
        $delivery_date = $_POST['delivery_date'] ?? date('Y-m-d');
        $driver_name   = $_POST['driver_name'] ?? '';
        $items         = json_decode($_POST['items'] ?? '[]', true);

        if (empty($so_id) || empty($items)) {
            echo json_encode(['status' => 'error', 'message' => 'Sales Order dan item pengiriman wajib diisi!']);
            exit;
        }

        // Generate Nomor DO Otomatis (Format: DO-YYYYMM-XXXX)
        $prefix = "DO-" . date('Ym') . "-";
        $stmtSeq = $pdo->query("SELECT COUNT(*) AS total FROM delivery_orders WHERE do_number LIKE '$prefix%'");
        $seq = $stmtSeq->fetch()['total'] + 1;
        $do_number = $prefix . str_pad($seq, 4, '0', STR_PAD_LEFT);

        $pdo->beginTransaction();

        // Simpan Header DO
        $stmtHeader = $pdo->prepare("INSERT INTO delivery_orders (do_number, so_id, delivery_date, driver_name, status) VALUES (?, ?, ?, ?, 'Shipped')");
        $stmtHeader->execute([$do_number, $so_id, $delivery_date, $driver_name]);
        $do_id = $pdo->lastInsertId();

        // Simpan Detail Item DO
        $stmtDetail = $pdo->prepare("INSERT INTO delivery_order_details (do_id, product_id, qty_shipped) VALUES (?, ?, ?)");
        foreach ($items as $item) {
            if ($item['qty_shipped'] > 0) {
                $stmtDetail->execute([$do_id, $item['product_id'], $item['qty_shipped']]);
            }
        }

        // Cek apakah semua item SO sudah terpenuhi atau masih parsial, lalu update status SO
        // (Opsional: Update status SO menjadi 'Processed' jika parsial, atau 'Completed' jika semua lunas)
        $stmtUpdateSO = $pdo->prepare("UPDATE sales_orders SET status = 'Processed' WHERE id = ?");
        $stmtUpdateSO->execute([$so_id]);

        $pdo->commit();
        echo json_encode(['status' => 'success', 'message' => "Surat Jalan (DO) $do_number berhasil dibuat!"]);
    }

    // 4. Ambil Daftar DO (List View)
    elseif ($action === 'get_do_list') {
        $stmt = $pdo->query("
            SELECT do.*, so.so_number, c.customer_name 
            FROM delivery_orders do 
            JOIN sales_orders so ON do.so_id = so.id 
            JOIN customers c ON so.customer_id = c.id 
            ORDER BY do.id DESC
        ");
        echo json_encode(['status' => 'success', 'data' => $stmt->fetchAll()]);
    }
	
	// 5. Ambil Detail DO untuk diedit
    elseif ($action === 'get_do_detail') {
        $id = $_GET['id'] ?? 0;
        
        $stmtHeader = $pdo->prepare("SELECT * FROM delivery_orders WHERE id = ?");
        $stmtHeader->execute([$id]);
        $header = $stmtHeader->fetch();

        $stmtDetails = $pdo->prepare("SELECT * FROM delivery_order_details WHERE do_id = ?");
        $stmtDetails->execute([$id]);
        $details = $stmtDetails->fetchAll();

        if ($header) {
            echo json_encode(['status' => 'success', 'header' => $header, 'details' => $details]);
        } else {
            echo json_encode(['status' => 'error', 'message' => 'Data Delivery Order tidak ditemukan']);
        }
    }

    // 6. Update Delivery Order
    elseif ($action === 'update_do') {
        $id            = $_POST['id'] ?? '';
        $delivery_date = $_POST['delivery_date'] ?? date('Y-m-d');
        $driver_name   = $_POST['driver_name'] ?? '';
        $items         = json_decode($_POST['items'] ?? '[]', true);

        if (empty($id) || empty($items)) {
            echo json_encode(['status' => 'error', 'message' => 'Data tidak lengkap!']);
            exit;
        }

        try {
            $pdo->beginTransaction();

            // Update Header DO
            $stmtHeader = $pdo->prepare("UPDATE delivery_orders SET delivery_date = ?, driver_name = ? WHERE id = ?");
            $stmtHeader->execute([$delivery_date, $driver_name, $id]);

            // Hapus detail item DO yang lama, lalu masukkan yang baru
            $stmtDel = $pdo->prepare("DELETE FROM delivery_order_details WHERE do_id = ?");
            $stmtDel->execute([$id]);

            $stmtDetail = $pdo->prepare("INSERT INTO delivery_order_details (do_id, product_id, qty_shipped) VALUES (?, ?, ?)");
            foreach ($items as $item) {
                if ($item['qty_shipped'] > 0) {
                    $stmtDetail->execute([$id, $item['product_id'], $item['qty_shipped']]);
                }
            }

            $pdo->commit();
            echo json_encode(['status' => 'success', 'message' => 'Delivery Order berhasil diperbarui!']);
        } catch (Exception $e) {
            $pdo->rollBack();
            echo json_encode(['status' => 'error', 'message' => 'Gagal memperbarui DO: ' . $e->getMessage()]);
        }
    }
	
	// Hapus Delivery Order
    elseif ($action === 'delete_do') {
        $id = $_POST['id'] ?? '';
        
        if (empty($id)) {
            echo json_encode(['status' => 'error', 'message' => 'ID Delivery Order tidak valid!']);
            exit;
        }

        try {
            $pdo->beginTransaction();

            // Hapus detail item DO terlebih dahulu
            $stmtDelDetail = $pdo->prepare("DELETE FROM delivery_order_details WHERE do_id = ?");
            $stmtDelDetail->execute([$id]);

            // Hapus header DO
            $stmtDelHeader = $pdo->prepare("DELETE FROM delivery_orders WHERE id = ?");
            $stmtDelHeader->execute([$id]);

            $pdo->commit();
            echo json_encode(['status' => 'success', 'message' => 'Delivery Order berhasil dihapus!']);
        } catch (Exception $e) {
            $pdo->rollBack();
            echo json_encode(['status' => 'error', 'message' => 'Gagal menghapus DO: ' . $e->getMessage()]);
        }
    }

} catch (Exception $e) {
    if ($pdo->inTransaction()) {
        $pdo->rollBack();
    }
    echo json_encode(['status' => 'error', 'message' => 'Error: ' . $e->getMessage()]);
}
?>