<?php
// api_so.php
require_once 'auth_check.php';
require_once 'db.php';

header('Content-Type: application/json');
$action = $_GET['action'] ?? '';

try {
    // 1. Ambil data dropdown customer & product
    if ($action === 'get_initial_data') {
        $stmtCust = $pdo->query("SELECT id, customer_code, customer_name FROM customers ORDER BY customer_name ASC");
        $stmtProd = $pdo->query("SELECT id, product_code, product_name, unit, selling_price FROM products WHERE is_active = 1 ORDER BY product_name ASC");
        
        echo json_encode([
            'status' => 'success',
            'customers' => $stmtCust->fetchAll(),
            'products' => $stmtProd->fetchAll()
        ]);
    }
    
    // 2. Simpan Sales Order Baru
    elseif ($action === 'save_so') {
        $customer_id = $_POST['customer_id'] ?? '';
        $order_date  = $_POST['order_date'] ?? date('Y-m-d');
        $items       = json_decode($_POST['items'] ?? '[]', true);

        if (empty($customer_id) || empty($items)) {
            echo json_encode(['status' => 'error', 'message' => 'Pelanggan dan minimal 1 item produk wajib diisi!']);
            exit;
        }

        // Generate Nomor SO Otomatis (Format: SO-YYYYMM-XXXX)
        $prefix = "SO-" . date('Ym') . "-";
        $stmtSeq = $pdo->query("SELECT COUNT(*) AS total FROM sales_orders WHERE so_number LIKE '$prefix%'");
        $seq = $stmtSeq->fetch()['total'] + 1;
        $so_number = $prefix . str_pad($seq, 4, '0', STR_PAD_LEFT);

        // Mulai Transaksi Database
        $pdo->beginTransaction();

        $total_amount = 0;
        foreach ($items as $item) {
            $total_amount += ($item['qty'] * $item['price']);
        }

        // Simpan Header SO
        $stmtHeader = $pdo->prepare("INSERT INTO sales_orders (so_number, customer_id, order_date, status, total_amount) VALUES (?, ?, ?, 'Approved', ?)");
        $stmtHeader->execute([$so_number, $customer_id, $order_date, $total_amount]);
        $so_id = $pdo->lastInsertId();

        // Simpan Detail Item SO
        $stmtDetail = $pdo->prepare("INSERT INTO sales_order_details (so_id, product_id, qty_ordered, unit_price, subtotal) VALUES (?, ?, ?, ?, ?)");
        foreach ($items as $item) {
            $subtotal = $item['qty'] * $item['price'];
            $stmtDetail->execute([$so_id, $item['product_id'], $item['qty'], $item['price'], $subtotal]);
        }

        // Commit Transaksi jika semua sukses
        $pdo->commit();

        echo json_encode([
            'status' => 'success', 
            'message' => "Sales Order $so_number berhasil dibuat!",
            'so_number' => $so_number
        ]);
    }

    // 3. Ambil Daftar Sales Orders (List View) - LENGKAP DENGAN CEK DO
    elseif ($action === 'get_so_list') {
        $sql = "SELECT so.*, c.customer_name, 
                       (SELECT COUNT(*) FROM delivery_orders do WHERE do.so_id = so.id) AS has_do 
                FROM sales_orders so 
                JOIN customers c ON so.customer_id = c.id 
                ORDER BY so.id DESC";
        $stmt = $pdo->query($sql);
        echo json_encode(['status' => 'success', 'data' => $stmt->fetchAll()]);
    }
	
	// 4. Hapus Sales Order dengan Validasi DO
    elseif ($action === 'delete_so') {
        $id = $_POST['id'] ?? '';
        
        if (empty($id)) {
            echo json_encode(['status' => 'error', 'message' => 'ID Sales Order tidak valid!']);
            exit;
        }

        // Cek apakah SO sudah memiliki DO
        $stmtCheckDO = $pdo->prepare("SELECT COUNT(*) AS total FROM delivery_orders WHERE so_id = ?");
        $stmtCheckDO->execute([$id]);
        if ($stmtCheckDO->fetch()['total'] > 0) {
            echo json_encode(['status' => 'error', 'message' => 'Sales Order ini sudah memiliki Delivery Order (DO) dan tidak dapat dihapus!']);
            exit;
        }

        try {
            $pdo->beginTransaction();

            $stmtDelDetail = $pdo->prepare("DELETE FROM sales_order_details WHERE so_id = ?");
            $stmtDelDetail->execute([$id]);

            $stmtDelHeader = $pdo->prepare("DELETE FROM sales_orders WHERE id = ?");
            $stmtDelHeader->execute([$id]);

            $pdo->commit();
            echo json_encode(['status' => 'success', 'message' => 'Sales Order berhasil dihapus!']);
        } catch (Exception $e) {
            $pdo->rollBack();
            echo json_encode(['status' => 'error', 'message' => 'Gagal menghapus SO: ' . $e->getMessage()]);
        }
    }
	
	// 5. Ambil Detail SO untuk diedit
    elseif ($action === 'get_so_detail') {
        $id = $_GET['id'] ?? 0;
        
        $stmtHeader = $pdo->prepare("SELECT * FROM sales_orders WHERE id = ?");
        $stmtHeader->execute([$id]);
        $header = $stmtHeader->fetch();

        $stmtDetails = $pdo->prepare("SELECT * FROM sales_order_details WHERE so_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 SO tidak ditemukan']);
        }
    }

    // 6. Update Sales Order dengan Validasi DO
    elseif ($action === 'update_so') {
        $id          = $_POST['id'] ?? '';
        $customer_id = $_POST['customer_id'] ?? '';
        $order_date  = $_POST['order_date'] ?? date('Y-m-d');
        $items       = json_decode($_POST['items'] ?? '[]', true);

        if (empty($id) || empty($customer_id) || empty($items)) {
            echo json_encode(['status' => 'error', 'message' => 'Data tidak lengkap!']);
            exit;
        }

        // Cek apakah SO sudah memiliki DO
        $stmtCheckDO = $pdo->prepare("SELECT COUNT(*) AS total FROM delivery_orders WHERE so_id = ?");
        $stmtCheckDO->execute([$id]);
        if ($stmtCheckDO->fetch()['total'] > 0) {
            echo json_encode(['status' => 'error', 'message' => 'Sales Order ini sudah memiliki Delivery Order (DO) dan tidak dapat diedit!']);
            exit;
        }

        $pdo->beginTransaction();

        $total_amount = 0;
        foreach ($items as $item) {
            $total_amount += ($item['qty'] * $item['price']);
        }

        $stmtHeader = $pdo->prepare("UPDATE sales_orders SET customer_id = ?, order_date = ?, total_amount = ? WHERE id = ?");
        $stmtHeader->execute([$customer_id, $order_date, $total_amount, $id]);

        $stmtDel = $pdo->prepare("DELETE FROM sales_order_details WHERE so_id = ?");
        $stmtDel->execute([$id]);

        $stmtDetail = $pdo->prepare("INSERT INTO sales_order_details (so_id, product_id, qty_ordered, unit_price, subtotal) VALUES (?, ?, ?, ?, ?)");
        foreach ($items as $item) {
            $subtotal = $item['qty'] * $item['price'];
            $stmtDetail->execute([$id, $item['product_id'], $item['qty'], $item['price'], $subtotal]);
        }

        $pdo->commit();
        echo json_encode(['status' => 'success', 'message' => 'Sales Order berhasil diperbarui!']);
    }

} catch (Exception $e) {
    if ($pdo->inTransaction()) {
        $pdo->rollBack();
    }
    echo json_encode(['status' => 'error', 'message' => 'Terjadi kesalahan: ' . $e->getMessage()]);
}
?>