<?php
session_start();
require_once "modelo/Db.php";

if (!isset($_SESSION['usu_codigo'])) {
    header("Location: sba_login.php");
    exit;
}

$bd = new clsbdd();

/* =========================
   VALIDAR CAJA ABIERTA
========================= */
$rsCaja = $bd->ejecutar("
    SELECT caj_codigo
    FROM sba_caja
    WHERE usu_codigo = {$_SESSION['usu_codigo']}
    AND caj_estado = 'ABIERTA'
    LIMIT 1
");

if (!$rsCaja || $rsCaja->num_rows == 0) {
    echo json_encode([
        "ok" => false,
        "msg" => "No se puede realizar la venta. La caja no está aperturada."
    ]);
    exit;
}

$caja = $rsCaja->fetch_assoc();
$caj_codigo = $caja['caj_codigo'];

/* =========================
   VALIDAR DATOS
========================= */
if (!isset($_POST['cantidad']) || !is_array($_POST['cantidad'])) {
    echo json_encode(["ok" => false, "msg" => "Datos incompletos"]);
    exit;
}

$tipo_pago = $_POST['tipo_pago'] ?? '';
$entregado = floatval($_POST['entregado'] ?? 0);

$total = 0;
$detalle = [];

/* =========================
   CALCULAR TOTAL
========================= */
foreach ($_POST['cantidad'] as $prd_codigo => $cant) {

    $cant = intval($cant);
    if ($cant <= 0) continue;

    $rsProd = $bd->ejecutar("
        SELECT prd_nombre, prd_precio, prd_stock
        FROM sba_productos
        WHERE prd_codigo = $prd_codigo
        AND prd_estado = 1
        LIMIT 1
    ");

    if ($rsProd && $rsProd->num_rows == 1) {
        $p = $rsProd->fetch_assoc();

        if ($p['prd_stock'] < $cant) {
            echo json_encode([
                "ok" => false,
                "msg" => "Stock insuficiente para {$p['prd_nombre']}"
            ]);
            exit;
        }

        $subtotal = $cant * $p['prd_precio'];
        $total += $subtotal;

        $detalle[] = [
            "prd_codigo" => $prd_codigo,
            "cantidad" => $cant,
            "precio" => $p['prd_precio'],
            "subtotal" => $subtotal
        ];
    }
}

if ($total <= 0) {
    echo json_encode(["ok" => false, "msg" => "No hay productos seleccionados"]);
    exit;
}

/* =========================
   VALIDAR EFECTIVO
========================= */
if ($tipo_pago == 'EFECTIVO' && $entregado < $total) {
    echo json_encode([
        "ok" => false,
        "msg" => "El valor entregado es insuficiente"
    ]);
    exit;
}

$vuelto = ($tipo_pago == 'EFECTIVO') ? ($entregado - $total) : 0;

/* =========================
   GUARDAR VENTA
========================= */
$bd->carga_campos("
    ven_fecha,
    ven_total,
    ven_tipo_pago,
    ven_entregado,
    ven_vuelto,
    usu_codigo,
    caj_codigo
");

$bd->carga_valores("
    NOW(),
    $total,
    '$tipo_pago',
    $entregado,
    $vuelto,
    {$_SESSION['usu_codigo']},
    $caj_codigo
");

$ven_codigo = $bd->insertar("sba_ventas");

if ($ven_codigo == 0) {
    echo json_encode(["ok" => false, "msg" => "Error al guardar la venta"]);
    exit;
}

/* =========================
   DETALLE + DESCONTAR STOCK
========================= */
foreach ($detalle as $d) {

    $bd->carga_campos("
        ven_codigo,
        prd_codigo,
        det_cantidad,
        det_precio,
        det_subtotal
    ");

    $bd->carga_valores("
        $ven_codigo,
        {$d['prd_codigo']},
        {$d['cantidad']},
        {$d['precio']},
        {$d['subtotal']}
    ");

    $bd->insertar("sba_ventas_detalle");

    // descontar stock
    $bd->ejecutar("
        UPDATE sba_productos
        SET prd_stock = prd_stock - {$d['cantidad']}
        WHERE prd_codigo = {$d['prd_codigo']}
    ");
}

/* =========================
   RESPUESTA FINAL
========================= */
echo json_encode([
    "ok" => true,
    "venta" => $ven_codigo,
    "total" => $total,
    "entregado" => $entregado,
    "vuelto" => $vuelto
]);
