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

// 1. OBTENER LA CONEXIÓN (mysqli)
$db = null;
foreach ($GLOBALS as $value) {
    if ($value instanceof mysqli) {
        $db = $value;
        break;
    }
}

if (!$db) {
    echo json_encode(array('ok' => false, 'message' => 'No se pudo establecer conexión con la base de datos.'));
    exit;
}

// 2. CAPTURA DE DATOS DEL POST (PHP 5.6)
$idmovimiento = isset($_POST['idmovimiento']) ? $_POST['idmovimiento'] : null;
$idcliente    = isset($_POST['idcliente'])    ? $_POST['idcliente']    : null;
$fecha        = isset($_POST['fecha'])        ? $_POST['fecha']        : date('Y-m-d');

// Arrays de detalles y cobros
$articulos   = isset($_POST['id_art'])      ? $_POST['id_art']      : array();
$precios_vta = isset($_POST['prec_vta'])    ? $_POST['prec_vta']    : array();
$cantidades  = isset($_POST['cant_art'])    ? $_POST['cant_art']    : array();

$cuentas     = isset($_POST['id_cuenta'])   ? $_POST['id_cuenta']   : array();
$tipos_pago  = isset($_POST['id_tipo'])     ? $_POST['id_tipo']     : array();
$montos      = isset($_POST['monto_cobro']) ? $_POST['monto_cobro'] : array();

// Validación básica
if (!$idcliente || empty($articulos) || !$idmovimiento) {
    echo json_encode(array('ok' => false, 'message' => 'Datos incompletos (Cliente, Artículos, Movimiento o Cobros vacíos)'));
    exit;
}

// 3. INICIAR TRANSACCIÓN
$db->autocommit(FALSE);

try {
    // --- A. INSERTAR VENTA ---
    $stmt = $db->prepare("INSERT INTO venta (cliente, fecha) VALUES (?, ?)");
    if (!$stmt) { throw new Exception("Error preparando venta: " . $db->error); }
    $stmt->bind_param("is", $idcliente, $fecha);
    if (!$stmt->execute()) { throw new Exception("Error ejecutando venta: " . $stmt->error); }
    $idventa = $db->insert_id;
    $stmt->close();

    // --- B. INSERTAR DETALLES Y ACTUALIZAR STOCK ---
    
    // Consulta para obtener costo y precio de lista
    $sql_costo = "SELECT costo, precio FROM articulo WHERE idarticulo = ?";
    $stmtCosto = $db->prepare($sql_costo);
    if (!$stmtCosto) { throw new Exception("Error preparando consulta de costo: " . $db->error); }

    // Consulta para insertar detalle (9 parámetros)
    $stmtDet = $db->prepare("INSERT INTO det_venta (idventa, idarticulo, costo, precio, cantidad, importe, subtotal, descuento, ganancia) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)");
    if (!$stmtDet) { throw new Exception("Error preparando detalle: " . $db->error); }

    // Consulta para actualizar stock
    $stmtStock = $db->prepare("UPDATE articulo SET stock = stock - ? WHERE idarticulo = ?");
    if (!$stmtStock) { throw new Exception("Error preparando stock: " . $db->error); }

    foreach ($articulos as $i => $id_art) {
        $id_art_clean = (int)$id_art;
        
        // 1. Obtener costo y precio de lista original
        $stmtCosto->bind_param("i", $id_art_clean);
        $stmtCosto->execute();
        $result_costo = $stmtCosto->get_result();
        $linea_articulo = $result_costo->fetch_assoc();
        
        $costo_real = (double)(isset($linea_articulo['costo']) ? $linea_articulo['costo'] : 0.0);
        $precio_lista_original = (double)(isset($linea_articulo['precio']) ? $linea_articulo['precio'] : 0.0);
    
        // 2. Variables de la transacción
        $can = (double)$cantidades[$i];
        $pu_aplicado = (double)$precios_vta[$i]; // Importe unitario cobrado
        
        // CÁLCULOS LÓGICOS
        $subtotal = $pu_aplicado * $can;
        $descuento_total = ($precio_lista_original - $pu_aplicado) * $can;
        $ganancia_real = ($pu_aplicado - $costo_real) * $can;
    
        // 3. Insertar detalle con los cálculos corregidos
        // Se utiliza $precio_lista_original para el campo 'precio' de la tabla
        $stmtDet->bind_param("iiddddddd", 
            $idventa, 
            $id_art_clean, 
            $costo_real,    
            $precio_lista_original, 
            $can,            
            $pu_aplicado,   // Importe unitario
            $subtotal,      
            $descuento_total, 
            $ganancia_real  
        );
        if (!$stmtDet->execute()) { throw new Exception("Error ejecutando detalle: " . $stmtDet->error); }

        // 4. Actualizar Stock
        $stmtStock->bind_param("di", $can, $id_art_clean);
        if (!$stmtStock->execute()) { throw new Exception("Error actualizando stock: " . $stmtStock->error); }
    }
    $stmtCosto->close();
    $stmtDet->close();
    $stmtStock->close();
    
    // --- C. INSERTAR COBROS ---
    if (!empty($cuentas)) {
        $comprobantes_array = isset($_POST['nro_comprobante_cobro']) ? $_POST['nro_comprobante_cobro'] : array();

        $sql_cobro = "INSERT INTO cobro (fecha, idmovimiento, idventa, idcuenta, idtipo_cuenta, importe_cobro, nro_comprobante) VALUES (?, ?, ?, ?, ?, ?, ?)";
        $stmtCob = $db->prepare($sql_cobro);
        if (!$stmtCob) { throw new Exception("Error preparando cobro: " . $db->error); }

        foreach ($cuentas as $i => $id_cta) {
            $id_tp = $tipos_pago[$i];
            $mon   = $montos[$i];
            $nro_comp_actual = isset($comprobantes_array[$i]) ? trim($comprobantes_array[$i]) : "";

            $stmtCob->bind_param("siiiids", 
                $fecha,             
                $idmovimiento,      
                $idventa,           
                $id_cta,            
                $id_tp,             
                $mon,               
                $nro_comp_actual 
            );

            if (!$stmtCob->execute()) { throw new Exception("Error ejecutando cobro: " . $stmtCob->error); }
        }
        $stmtCob->close();
    }

    // SI TODO SALIÓ BIEN
    $db->commit();
    $db->autocommit(TRUE);
    echo json_encode(array('ok' => true, 'idventa' => $idventa));

} catch (Exception $e) {
    // SI ALGO FALLA
    $db->rollback();
    $db->autocommit(TRUE);
    echo json_encode(array('ok' => false, 'message' => 'Error en el proceso: ' . $e->getMessage()));
}
?>