<?php
/**
 * POST /api/inventario/auditoria/registrar.php
 */
require_once '../../config/database.php';
require_once '../../includes/helpers.php';

require_post();
$data = json_input();

require_fields($data, ['producto_id', 'sucursal_id', 'cantidad_fisica', 'justificacion']);

$pdo = getConnection();

try {
    $pdo->beginTransaction();
    
    $pid = (int)$data['producto_id'];
    $sid = (int)$data['sucursal_id'];
    $fisico = (int)$data['cantidad_fisica'];
    $just = trim($data['justificacion']);
    
    // Obtener stock actual
    $stmtInv = $pdo->prepare("SELECT stock_total, stock_facturado, stock_no_facturado FROM inventario_sucursal WHERE producto_id = ? AND sucursal_id = ?");
    $stmtInv->execute([$pid, $sid]);
    $inv = $stmtInv->fetch(PDO::FETCH_ASSOC);
    
    if(!$inv) {
        throw new Exception("El producto no tiene registro de inventario en esta sucursal.");
    }
    
    $actual = (int)$inv['stock_total'];
    $diferencia = $fisico - $actual;
    
    if($diferencia === 0) {
        throw new Exception("La cantidad física ingresada es igual al stock actual. No hay ajuste que realizar.");
    }
    
    // Calcular tipo de movimiento
    $tipo = $diferencia > 0 ? 'ajuste_auditoria_suma' : 'ajuste_auditoria_resta';
    $cant_movimiento = abs($diferencia);
    
    // Actualizar inventario (distribuir la diferencia en no facturado por defecto)
    // Para simplificar: restamos del no_facturado primero si es resta, o sumamos a no_facturado si es suma
    $nuevoTotal = $fisico;
    $nuevoNoFact = (int)$inv['stock_no_facturado'] + $diferencia;
    $nuevoFact = (int)$inv['stock_facturado'];
    
    if($nuevoNoFact < 0) {
        // Se comió el no facturado, hay que restar del facturado
        $nuevoFact += $nuevoNoFact; // nuevoNoFact es negativo, así que resta
        $nuevoNoFact = 0;
    }
    
    $stmtUpd = $pdo->prepare("UPDATE inventario_sucursal SET stock_total = ?, stock_facturado = ?, stock_no_facturado = ? WHERE producto_id = ? AND sucursal_id = ?");
    $stmtUpd->execute([$nuevoTotal, $nuevoFact, $nuevoNoFact, $pid, $sid]);
    
    // Insertar Kardex
    $diffFact = $nuevoFact - (int)$inv['stock_facturado'];
    $diffNoFact = $nuevoNoFact - (int)$inv['stock_no_facturado'];
    $detalle_ajuste = [];
    if ($diffFact !== 0) $detalle_ajuste[] = ($diffFact > 0 ? "+" : "") . $diffFact . " Facturado";
    if ($diffNoFact !== 0) $detalle_ajuste[] = ($diffNoFact > 0 ? "+" : "") . $diffNoFact . " Sin Factura";
    $justificacion_kardex = "Auditoría: " . $just . " (" . implode(', ', $detalle_ajuste) . ")";

    $stmtK = $pdo->prepare("INSERT INTO inventario_movimientos (producto_id, sucursal_id, tipo_movimiento, cantidad, saldo_despues, justificacion, usuario_id) VALUES (?, ?, ?, ?, ?, ?, ?)");
    $stmtK->execute([$pid, $sid, $tipo, $cant_movimiento, $nuevoTotal, $justificacion_kardex, 1]); // default admin user 1

    $pdo->commit();
    json_success(['saldo_despues' => $nuevoTotal], "Ajuste realizado correctamente. Se creó el registro en Kardex.");
    
} catch (Exception $e) {
    if ($pdo->inTransaction()) {
        $pdo->rollBack();
    }
    json_error($e->getMessage());
}
?>
