<?php

function detectarPresentacionPorPrecio($pdo, $producto_id, $precioVenta, $presentacionSugerida = null) {
    $sql = "SELECT pp.presentacion_id, pr.nombre as presentacion, pp.factor_conversion, pp.precio_venta
            FROM producto_presentaciones pp
            JOIN presentaciones pr ON pr.id = pp.presentacion_id
            WHERE pp.producto_id = ? AND pp.activo = 1
            ORDER BY pp.factor_conversion ASC";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$producto_id]);
    $presentaciones = $stmt->fetchAll(PDO::FETCH_ASSOC);

    if (empty($presentaciones)) {
        return ['factor_conversion' => 1, 'presentacion' => 'UNIDAD', 'presentacion_id' => 1];
    }

    if ($presentacionSugerida) {
        $sugeridaStr = strtoupper(trim($presentacionSugerida));
        foreach ($presentaciones as $p) {
            if (strtoupper($p['presentacion']) === $sugeridaStr ||
                ($sugeridaStr === 'MAYOR' && strtoupper($p['presentacion']) === 'CAJA') ||
                ($sugeridaStr === 'MIXTO' && strtoupper($p['presentacion']) === 'CAJA')) {
                return [
                    'factor_conversion' => max(1, (int)$p['factor_conversion']),
                    'presentacion' => $p['presentacion'],
                    'presentacion_id' => (int)$p['presentacion_id']
                ];
            }
        }
    }

    $precioVenta = floatval($precioVenta);
    $tolerancia = 0.01;

    $presentacionesDesc = array_reverse($presentaciones);
    foreach ($presentacionesDesc as $p) {
        if ($p['precio_venta'] > 0 && abs($precioVenta - floatval($p['precio_venta'])) < $tolerancia) {
            return [
                'factor_conversion' => max(1, (int)$p['factor_conversion']),
                'presentacion' => $p['presentacion'],
                'presentacion_id' => (int)$p['presentacion_id']
            ];
        }
    }

    return ['factor_conversion' => 1, 'presentacion' => 'UNIDAD', 'presentacion_id' => 1];
}

function descontarStockFIFO($pdo, $producto_id, $sucursal_id, $unidades_base, $facturado) {
    $stockCol = ($facturado) ? 'stock_facturado' : 'stock_no_facturado';
    $sql = "UPDATE inventario_sucursal SET
        stock_total = GREATEST(0, CAST(stock_total AS SIGNED) - ?),
        $stockCol = GREATEST(0, CAST($stockCol AS SIGNED) - ?)
        WHERE producto_id = ? AND sucursal_id = ?";
    $pdo->prepare($sql)->execute([$unidades_base, $unidades_base, $producto_id, $sucursal_id]);
}

function restaurarStockLIFO($pdo, $producto_id, $sucursal_id, $cantidad, $precio, $facturado, $factor_historico = null) {
    if ($factor_historico !== null) {
        $unidades_base = $cantidad * $factor_historico;
    } else {
        $deteccion = detectarPresentacionPorPrecio($pdo, $producto_id, $precio);
        $unidades_base = $cantidad * $deteccion['factor_conversion'];
    }

    $stockCol = $facturado ? 'stock_facturado' : 'stock_no_facturado';
    $sql = "UPDATE inventario_sucursal SET
        stock_total = stock_total + ?,
        $stockCol = $stockCol + ?
        WHERE producto_id = ? AND sucursal_id = ?";
    $pdo->prepare($sql)->execute([$unidades_base, $unidades_base, $producto_id, $sucursal_id]);
}

function obtenerCPP($pdo, $producto_id) {
    $stmt = $pdo->prepare("SELECT costo_promedio_unidad_base FROM productos_costo_promedio WHERE producto_id = ? LIMIT 1");
    $stmt->execute([$producto_id]);
    $row = $stmt->fetch(PDO::FETCH_ASSOC);
    return $row ? floatval($row['costo_promedio_unidad_base']) : 0;
}

function obtenerStockSucursal($pdo, $producto_id, $sucursal_id) {
    $stmt = $pdo->prepare("SELECT stock_total, stock_facturado, stock_no_facturado
                           FROM inventario_sucursal WHERE producto_id = ? AND sucursal_id = ?");
    $stmt->execute([$producto_id, $sucursal_id]);
    $row = $stmt->fetch(PDO::FETCH_ASSOC);
    return $row ?: ['stock_total' => 0, 'stock_facturado' => 0, 'stock_no_facturado' => 0];
}

function obtenerFactorPorNombre($pdo, $producto_id, $nombre_presentacion) {
    if (empty($nombre_presentacion)) return 1;
    $nombre = strtoupper(trim($nombre_presentacion));
    if ($nombre === 'UNIDAD') return 1;

    $sql = "SELECT pp.factor_conversion
            FROM producto_presentaciones pp
            INNER JOIN presentaciones pres ON pp.presentacion_id = pres.id
            WHERE pp.producto_id = ? AND UPPER(pres.nombre) = ? AND pp.activo = 1
            LIMIT 1";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$producto_id, $nombre]);
    $res = $stmt->fetch();
    return $res ? max(1, intval($res['factor_conversion'])) : 1;
}

function obtenerSucursalActiva() {
    static $sucursal_id = null;
    if ($sucursal_id !== null) return $sucursal_id;

    $paths = [
        __DIR__ . '/../../config/sucursal_activa.php',
        dirname(__DIR__, 2) . '/config/sucursal_activa.php',
    ];

    foreach ($paths as $path) {
        if (file_exists($path)) {
            $config = require $path;
            $sucursal_id = $config['sucursal_id'];
            return $sucursal_id;
        }
    }

    $sucursal_id = 1;
    return $sucursal_id;
}
