    <?php
    // update_producto.php
    // Recibe AJAX para actualizar campos de tb_productos, calcula los derivados y devuelve JSON.

    header('Content-Type: application/json');
    include '../db/db.php'; // $conn = conexión mysqli

    // 1) Campos permitidos y sus tipos para bind_param
    // 1) Campos permitidos y sus tipos para bind_param
    $allowed = [
        'largoCmCaja'                   => 'd',
        'anchoCmCaja'                   => 'd',
        'altoCmCaja'                    => 'd',
        'undsCaja'                      => 'i',
        'pesoKgCaja'                    => 'd',
        'pesoKgProducto'                => 'd',
        'volumenCm3Caja'                => 'd',

        'largoProductoEnvioAjustado'    => 'd',
        'anchoProductoEnvioAjustado'    => 'd',
        'altoProductoEnvioAjustado'     => 'd',
        'volumenCm3ProductoAjustado'    => 'd',
        'pesoVolumetricoProducto'       => 'd',
        'pesoEnvioUnidadKG'             => 'd',
        'txtMedidas'                    => 's',
        'txtEmpaque'                    => 's',

        // ---------------------------------------------------
        // Agrega estas tres líneas:
        'largoProductoEnvio'            => 'd',
        'anchoProductoEnvio'            => 'd',
        'altoProductoEnvio'             => 'd',
        // ---------------------------------------------------
    ];


    // 2) Obtener y validar ID
    if (!isset($_POST['id']) || !($id = intval($_POST['id']))) {
        echo json_encode(['ok' => false, 'error' => 'ID inválido']);
        exit;
    }

    // 3) Cálculos derivados

    // 3a) volumenCm3Caja si llegan las 3 dimensiones
    if (
        isset($_POST['largoCmCaja'], $_POST['anchoCmCaja'], $_POST['altoCmCaja'])
    ) {
        $_POST['volumenCm3Caja'] =
            floatval($_POST['largoCmCaja'])
            * floatval($_POST['anchoCmCaja'])
            * floatval($_POST['altoCmCaja']);
        $allowed['volumenCm3Caja'] = 'd';
    }

    // 3b) pesoKgProducto **siempre** que cambie pesoKgCaja o undsCaja
    if (isset($_POST['pesoKgCaja'], $_POST['undsCaja'])) {
        $pkc = floatval($_POST['pesoKgCaja']);
        $u   = max(1, intval($_POST['undsCaja']));
        $_POST['pesoKgProducto'] = $pkc / $u;
        $allowed['pesoKgProducto'] = 'd';
    }

    // 3c) volumenCm3ProductoAjustado, pesoVolumetricoProducto y pesoEnvioUnidadKG
    //     cuando llegan las 3 dims ajustadas + undsCaja
    if (
        isset(
            $_POST['largoProductoEnvioAjustado'],
            $_POST['anchoProductoEnvioAjustado'],
            $_POST['altoProductoEnvioAjustado'],
            $_POST['undsCaja']
        )
    ) {
        $L = floatval($_POST['largoProductoEnvioAjustado']);
        $A = floatval($_POST['anchoProductoEnvioAjustado']);
        $H = floatval($_POST['altoProductoEnvioAjustado']);
        $U = max(1, intval($_POST['undsCaja']));

        // volumen total ajustado
        $volA = $L * $A * $H * $U;
        $_POST['volumenCm3ProductoAjustado'] = $volA;
        $allowed['volumenCm3ProductoAjustado'] = 'd';

        // peso volumétrico
        $_POST['pesoVolumetricoProducto'] = $volA / 5000.0;
        $allowed['pesoVolumetricoProducto'] = 'd';

        // pesoEnvioUnidadKG = max(peso unitario, peso volumétrico)
        $pu = isset($_POST['pesoKgProducto'])
            ? floatval($_POST['pesoKgProducto'])
            : ($pkc / $U);
        $_POST['pesoEnvioUnidadKG'] = max($pu, $_POST['pesoVolumetricoProducto']);
        $allowed['pesoEnvioUnidadKG'] = 'd';
    }

    // 4) Filtrar $_POST por $allowed y armar SET dinámico
    $fields = [];
    $types  = '';
    $values = [];

    foreach ($allowed as $col => $tp) {
        if (isset($_POST[$col])) {
            $fields[] = "`$col` = ?";
            $types   .= $tp;
            switch ($tp) {
                case 'i':
                    $values[] = intval($_POST[$col]);
                    break;
                case 'd':
                    $values[] = floatval($_POST[$col]);
                    break;
                case 's':
                    $values[] = strval($_POST[$col]);
                    break;
            }
        }
    }

    if (empty($fields)) {
        echo json_encode(['ok' => false, 'error' => 'No hay campos para actualizar']);
        exit;
    }

    // 5) Preparar y ejecutar el UPDATE
    $set = implode(', ', $fields);
    $sql = "UPDATE tb_productos SET $set WHERE id = ?";
    $stmt = $conn->prepare($sql);
    if (!$stmt) {
        echo json_encode(['ok' => false, 'error' => 'Prepare failed: ' . $conn->error]);
        exit;
    }

    // bind_param: tipos + id al final
    $types .= 'i';
    $values[] = $id;

    // parametros por referencia
    $params = [];
    $params[] = &$types;
    for ($i = 0; $i < count($values); $i++) {
        $params[] = &$values[$i];
    }
    call_user_func_array([$stmt, 'bind_param'], $params);

    if (!$stmt->execute()) {
        echo json_encode(['ok' => false, 'error' => 'Execute failed: ' . $stmt->error]);
        exit;
    }

    $stmt->close();
    echo json_encode(['ok' => true]);
