<?php
session_start();
require '../../../script/conexion.php';

ini_set('display_errors', 0);
error_reporting(E_ALL);

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    http_response_code(405);
    exit('Método no permitido');
}

function post($k, $default = '') {
    return trim($_POST[$k] ?? $default);
}

$id_venta           = post('id_venta');
$referencia_producto= post('referencia_producto');
$talla              = post('talla');
$cantidad           = post('cantidad');
$precio_unidad      = post('precio_unidad');

/* ---------------- Validaciones ---------------- */
$errores = [];

if ($id_venta === '' || !ctype_digit($id_venta) || (int)$id_venta <= 0) $errores[] = 'id_venta inválido';
if ($referencia_producto === '') $errores[] = 'Falta referencia_producto';
if ($talla === '') $errores[] = 'Falta talla';

if ($cantidad === '' || !is_numeric($cantidad) || (int)$cantidad <= 0) $errores[] = 'Cantidad inválida';
$cantidad_int = (int)$cantidad;

if ($precio_unidad === '' || !is_numeric($precio_unidad) || (float)$precio_unidad < 0) $errores[] = 'Precio inválido';
$precio_num = (float)$precio_unidad;

if ($errores) {
    http_response_code(400);
    exit('Error: ' . implode(', ', $errores));
}

$id_int = (int)$id_venta;
$total = $cantidad_int * $precio_num;

try {
    $conn->begin_transaction();

    /* 1) Traer venta y estado + tercero */
    $stmtV = $conn->prepare("SELECT estado, nombre_tercero FROM alm_venta WHERE id = ? LIMIT 1");
    if (!$stmtV) throw new Exception("Prepare venta: " . $conn->error);

    $stmtV->bind_param("i", $id_int);
    $stmtV->execute();
    $rowt = $stmtV->get_result()->fetch_assoc();
    $stmtV->close();

    if (!$rowt) {
        throw new Exception("La venta no existe");
    }

    $estado = $rowt['estado'];

    /* 2) Stock disponible (lock) */
    $stmtS = $conn->prepare("
        SELECT COALESCE(SUM(cantidad),0) AS disponible
        FROM alm_referencia_disponible
        WHERE referencia_producto = ? AND talla = ?
        FOR UPDATE
    ");
    if (!$stmtS) throw new Exception("Prepare stock: " . $conn->error);

    $stmtS->bind_param("ss", $referencia_producto, $talla);
    $stmtS->execute();
    $rowS = $stmtS->get_result()->fetch_assoc();
    $stmtS->close();

    $stock = (int)($rowS['disponible'] ?? 0);

    if ($stock < $cantidad_int) {
        $conn->rollback();
        header("Location: ../venta-detalle.php?id_venta=" . $id_int . "&err=" . urlencode("Stock insuficiente"));
        exit;
    }

    /* 3) Insert detalle (prepared) */
    $stmtI = $conn->prepare("
        INSERT INTO alm_venta_detalle
        (id_venta, referencia_producto, talla, cantidad, precio_unidad, total, estado)
        VALUES (?,?,?,?,?,?,?)
    ");
    if (!$stmtI) throw new Exception("Prepare insert: " . $conn->error);

    // i s s i d d s
    $stmtI->bind_param("issidss", $id_int, $referencia_producto, $talla, $cantidad_int, $precio_num, $total, $estado);

    if (!$stmtI->execute()) throw new Exception("Execute insert: " . $stmtI->error);
    $stmtI->close();

    /* 4) Actualizaciones de tus clases */
    $class_referencia = $referencia_producto;
    $class_talla = $talla;
    require '../../../clases/class-referencia.php';

    $class_nombre_tercero_cierre = $rowt['nombre_tercero'];
    $class_referencia_cierre = $referencia_producto;
    $class_talla_cierre = $talla;
    require '../../../clases/class-cierre.php';

    $conn->commit();

    header("Location: ../venta-detalle.php?id_venta=" . $id_int
        . "&dt_referencia=" . urlencode($referencia_producto)
        . "&dt_precio_unidad=" . urlencode((string)$precio_num)
        . "&dt_autofocus=1"
    );
    exit;

} catch (Exception $e) {
    $conn->rollback();
    http_response_code(500);
    exit("Error: " . $e->getMessage());
}
