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

require_post();
$data = json_input();

require_fields($data, ['proveedor_id', 'numero_factura', 'fecha_compra', 'tipo_pago', 'items']);

$pdo = getConnection();

try {
    $pdo->beginTransaction();

    $proveedor_id = (int)$data['proveedor_id'];
    $numero_factura = trim($data['numero_factura']);
    $fecha_compra = $data['fecha_compra'];
    $tipo_pago = $data['tipo_pago'];
    $dias_credito = isset($data['dias_credito']) ? (int)$data['dias_credito'] : 0;
    $monto_efectivo = isset($data['monto_efectivo']) ? (float)$data['monto_efectivo'] : 0.00;
    $items = $data['items'];

    if (empty($items)) {
        throw new Exception("El carrito está vacío");
    }

    // Calcular totales
    $total_compra = 0;
    foreach ($items as $item) {
        $total_compra += ((float)$item['costo_unitario'] * (int)$item['cantidad']);
    }

    $monto_ef = 0;
    $monto_cr = 0;
    $estado_pago = 'pagado';
    $fecha_limite = null;

    if ($tipo_pago === 'contado') {
        $monto_ef = $total_compra;
    } elseif ($tipo_pago === 'credito') {
        $monto_cr = $total_compra;
        $estado_pago = 'pendiente';
        $fecha_limite = date('Y-m-d', strtotime($fecha_compra . " + $dias_credito days"));
    } elseif ($tipo_pago === 'mixto') {
        $monto_ef = $monto_efectivo;
        $monto_cr = $total_compra - $monto_ef;
        if ($monto_cr > 0) {
            $estado_pago = 'pendiente';
            $fecha_limite = date('Y-m-d', strtotime($fecha_compra . " + $dias_credito days"));
        }
    }

    // 1. Guardar cabecera de la compra
    $stmtC = $pdo->prepare("INSERT INTO compras (fecha_compra, id_lugarCompra, total, tipo_pago, monto_efectivo, monto_credito, fecha_limite_pago, estado_pago) VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
    $stmtC->execute([$fecha_compra, $proveedor_id, $total_compra, $tipo_pago, $monto_ef, $monto_cr, $fecha_limite, $estado_pago]);
    $compra_id = $pdo->lastInsertId();

    // 1b. Crear registro en cuentas_pagar
    $saldo_pendiente = ($tipo_pago === 'contado') ? 0 : ($tipo_pago === 'mixto' ? $monto_cr : $total_compra);
    $estado_cuenta = ($saldo_pendiente <= 0) ? 'pagada' : 'pendiente';
    $stmtCP = $pdo->prepare("INSERT INTO cuentas_pagar (compra_id, proveedor_id, numero_factura, fecha_compra, fecha_vencimiento, total_factura, saldo_pendiente, estado, dias_credito) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)");
    $stmtCP->execute([$compra_id, $proveedor_id, $numero_factura, $fecha_compra, $fecha_limite, $total_compra, $saldo_pendiente, $estado_cuenta, $dias_credito]);

    // 2. Procesar detalles
    $stmtD = $pdo->prepare("INSERT INTO compras_detalle (compra_id, producto_id, cantidad, costo_unitario, costo_total, facturado, numero_factura, fecha_vencimiento, presentacion_id, factor_conversion_compra, cantidad_unidades_base) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
    
    $stmtInv = $pdo->prepare("INSERT INTO inventario_sucursal (producto_id, sucursal_id, stock_total, stock_facturado, stock_no_facturado, costo_promedio_local) VALUES (?, 1, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE stock_total = stock_total + VALUES(stock_total), stock_facturado = stock_facturado + VALUES(stock_facturado), stock_no_facturado = stock_no_facturado + VALUES(stock_no_facturado), costo_promedio_local = VALUES(costo_promedio_local)");

    foreach ($items as $item) {
        $pid = (int)$item['id'];
        $qty = (int)$item['cantidad'];
        $costoU = (float)$item['costo_unitario'];
        $facturado = isset($item['facturado']) && $item['facturado'] ? 1 : 0;
        $venc = !empty($item['fecha_vencimiento']) ? $item['fecha_vencimiento'] : null;
        $factor = (int)($item['factor'] ?? 1);
        $pres_id = (int)($item['presentacion_id'] ?? 1);

        $costo_total = $qty * $costoU;
        $base_qty = $qty * $factor;
        $base_costoU = ($factor > 0) ? ($costoU / $factor) : $costoU;

        // Insertar detalle
        $stmtD->execute([
            $compra_id, $pid, $qty, $costoU, $costo_total, $facturado, $numero_factura, $venc, $pres_id, $factor, $base_qty
        ]);

        // Obtener stock actual para Kardex
        $stmtCheck = $pdo->prepare("SELECT stock_total FROM inventario_sucursal WHERE producto_id = ? AND sucursal_id = 1");
        $stmtCheck->execute([$pid]);
        $currStockRow = $stmtCheck->fetch();
        $currStock = $currStockRow ? (int)$currStockRow['stock_total'] : 0;
        $saldo_despues = $currStock + $base_qty;

        // Actualizar inventario de bodega (Sucursal 1)
        $sFact = $facturado ? $base_qty : 0;
        $sNoFact = $facturado ? 0 : $base_qty;
        
        $stmtInv->execute([$pid, $base_qty, $sFact, $sNoFact, $base_costoU]);

        // Registrar en Kardex
        $stmtK = $pdo->prepare("INSERT INTO inventario_movimientos (producto_id, sucursal_id, tipo_movimiento, cantidad, saldo_despues, referencia_id, justificacion, usuario_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
        $justificacion_kardex = "Factura $numero_factura (" . ($facturado ? 'Facturado' : 'Sin Factura') . ")";
        $stmtK->execute([$pid, 1, 'ingreso_compra', $base_qty, $saldo_despues, $compra_id, $justificacion_kardex, 1]); // default admin user 1

        // Actualizar productos_costo_promedio (WAC) y lista de precios (automáticamente vía wac.php)
        recalcular_wac($pdo, $pid, $base_qty, $base_costoU);
    }

    $pdo->commit();

    json_success(['compra_id' => $compra_id], 'Compra registrada y stock actualizado');

} catch (Exception $e) {
    if ($pdo->inTransaction()) {
        $pdo->rollBack();
    }
    json_error("Error al registrar: " . $e->getMessage());
}
?>
