<?php
// procesar_venta.php
header('Content-Type: application/json');

// Conexión a la base de datos (reemplaza con tus variables reales)
$mysqli = new mysqli("localhost", "usuario", "contraseña", "fdlabsec_stagedance");

if ($mysqli->connect_error) {
    echo json_encode(['status' => 'error', 'message' => 'Error de conexión: ' . $mysqli->connect_error]);
    exit;
}

// Asegurar codificación UTF-8
$mysqli->set_charset("utf8mb4");

// Suponiendo que recuperas el usuario y la caja activa de la sesión
// En tu volcado vi que el usu_id común es 1 y la caja abierta es la caj_codigo = 3
$usu_id = 1; 
$caj_id = 3; 

// Leer los datos JSON enviados desde el frontend (JS Fetch / Axios)
$input = json_decode(file_get_contents('php://input'), true);

if (!$input) {
    echo json_encode(['status' => 'error', 'message' => 'No se recibieron datos válidos.']);
    exit;
}

// Extraer variables del JSON de la venta
$bas_id          = isset($input['bas_id']) ? intval($input['bas_id']) : 0; // ID de la bastonera
$ven_tipo_pago   = isset($input['ven_tipo_pago']) ? strtoupper(trim($input['ven_tipo_pago'])) : 'EFECTIVO';
$ven_total       = isset($input['ven_total']) ? floatval($input['ven_total']) : 0.00;
$ven_monto_p1    = isset($input['ven_monto_p1']) ? floatval($input['ven_monto_p1']) : 0.00;
$ven_monto_p2    = isset($input['ven_monto_p2']) ? floatval($input['ven_monto_p2']) : 0.00;
$ven_entregado   = isset($input['ven_entregado']) ? floatval($input['ven_entregado']) : 0.00;
$ven_vuelto      = isset($input['ven_vuelto']) ? floatval($input['ven_vuelto']) : 0.00;
$ven_comprobante = isset($input['ven_comprobante']) ? trim($input['ven_comprobante']) : null;
$productos       = isset($input['productos']) ? $input['productos'] : []; // Array de items vendidos

if (empty($productos) || $ven_total <= 0) {
    echo json_encode(['status' => 'error', 'message' => 'El carrito está vacío o el total es incorrecto.']);
    exit;
}

// INICIAR TRANSACCIÓN SQL
$mysqli->begin_transaction();

try {
    // 1. INSERTAR LA VENTA PRINCIPAL (`bas_ventas`)
    $sql_venta = "INSERT INTO bas_ventas (
                    caj_id, bas_id, usu_id, ven_fecha, ven_tipo_pago, ven_total, 
                    ven_monto_p1, ven_monto_p2, ven_entregado, ven_vuelto, ven_comprobante, ven_estado
                  ) VALUES (?, ?, ?, NOW(), ?, ?, ?, ?, ?, ?, ?, 1)";
    
    $stmt_venta = $mysqli->prepare($sql_venta);
    $stmt_venta->bind_param("iiisdddddds", $caj_id, $bas_id, $usu_id, $ven_tipo_pago, $ven_total, $ven_monto_p1, $ven_monto_p2, $ven_entregado, $ven_vuelto, $ven_comprobante);
    
    if (!$stmt_venta->execute()) {
        throw new Exception("Error al registrar la cabecera de la venta: " . $stmt_venta->error);
    }
    
    $ven_id = $mysqli->insert_id; // Guardamos el ID de la venta generada

    // 2. PROCESAR CADA PRODUCTO EN EL DETALLE
    foreach ($productos as $item) {
        $pro_id       = intval($item['pro_id']);
        $det_cantidad = intval($item['det_cantidad']);
        $precio_unit  = floatval($item['det_precio_unitario']);
        $subtotal     = $det_cantidad * $precio_unit;

        // A. Verificar y actualizar Stock físico (`bas_productos`)
        $sql_stock = "SELECT pro_stock, pro_nombre FROM bas_productos WHERE pro_id = ? FOR UPDATE";
        $stmt_stock = $mysqli->prepare($sql_stock);
        $stmt_stock->bind_param("i", $pro_id);
        $stmt_stock->execute();
        $res_stock = $stmt_stock->get_result()->fetch_assoc();

        if (!$res_stock) {
            throw new Exception("El producto con ID $pro_id no existe.");
        }

        if ($res_stock['pro_stock'] < $det_cantidad) {
            throw new Exception("Stock insuficiente para: " . $res_stock['pro_nombre'] . ". Disponible: " . $res_stock['pro_stock']);
        }

        // Descontar del stock físico
        $sql_update_stock = "UPDATE bas_productos SET pro_stock = pro_stock - ? WHERE pro_id = ?";
        $stmt_up_stock = $mysqli->prepare($sql_update_stock);
        $stmt_up_stock->bind_param("ii", $det_cantidad, $pro_id);
        $stmt_up_stock->execute();

        // B. Inicializar la variable de cuenta por cobrar vinculada
        $cxc_id = 0;

        // C. SI ES A CRÉDITO: Generar deudas y saldos en la cuenta de la Bastonera
        if ($ven_tipo_pago === 'CREDITO') {
            if ($bas_id === 0) {
                throw new Exception("Debe seleccionar una bastonera válida para ventas a crédito.");
            }

            // Usamos el con_id = 3 que corresponde al concepto de 'Mensualidad / Consumos varios' o el id de consumo que tengas definido.
            // Para este ejemplo dinámico usaremos 3 basándonos en tu volcado.
            $con_id_consumo = 3; 
            $cxc_estado = 'PENDIENTE';

            // Insertar en Cuentas por Cobrar (`bas_cuentas_cobrar`)
            $sql_cxc = "INSERT INTO bas_cuentas_cobrar (
                            bas_id, con_id, cxc_valor_base, cxc_descuento, cxc_motivo_descuento, 
                            cxc_valor_final, cxc_saldo_pendiente, cxc_fecha_emision, cxc_estado
                        ) VALUES (?, ?, ?, 0.00, NULL, ?, ?, CURDATE(), ?)";
            
            $stmt_cxc = $mysqli->prepare($sql_cxc);
            $stmt_cxc->bind_param("iiddds", $bas_id, $con_id_consumo, $subtotal, $subtotal, $subtotal, $cxc_estado);
            $stmt_cxc->execute();
            $cxc_id = $mysqli->insert_id; // Obtenemos el id para amarrarlo al detalle de la venta

            // Insertar en Créditos (`bas_creditos`) para dejar la traza de la deuda totalizadora
            $cre_motivo = "Consumo en punto de venta POS - Crédito (Venta #$ven_id)";
            $sql_credito = "INSERT INTO bas_creditos (bas_id, cre_monto, cre_motivo, cre_fecha) VALUES (?, ?, ?, NOW())";
            $stmt_credito = $mysqli->prepare($sql_credito);
            $stmt_credito->bind_param("ids", $bas_id, $subtotal, $cre_motivo);
            $stmt_credito->execute();
        }

        // D. INSERTAR EL DETALLE DE LA VENTA (`bas_venta_detalles`)
        // Pasamos el cxc_id (será 0 si fue efectivo, o el id de la deuda si fue crédito)
        $sql_detalle = "INSERT INTO bas_venta_detalles (cxc_id, pro_id, det_cantidad, det_precio_unitario, det_subtotal) 
                        VALUES (?, ?, ?, ?, ?)";
        $stmt_detalle = $mysqli->prepare($sql_detalle);
        $stmt_detalle->bind_param("iiidd", $cxc_id, $pro_id, $det_cantidad, $precio_unit, $subtotal);
        
        if (!$stmt_detalle->execute()) {
            throw new Exception("Error al insertar el artículo en el detalle de la venta.");
        }
    }

    // Si todo salió bien, guardamos definitivamente en la base de datos
    $mysqli->commit();

    echo json_encode([
        'status' => 'success',
        'message' => '¡Venta procesada con éxito!',
        'ven_id' => $ven_id
    ]);

} catch (Exception $e) {
    // Si algo falló en cualquier paso, deshacemos todos los cambios del bloque
    $mysqli->rollback();
    echo json_encode([
        'status' => 'error',
        'message' => $e->getMessage()
    ]);
}

$mysqli->close();
?>