<?php
// Modelo para gestión de productos del inventario
require_once "../config/Conexion.php";

class Inventario
{
    public function __construct()
    {
    }

    // Listar todos los productos activos
    public function listar()
    {
        $sql = "SELECT p.idproducto, p.codigo, p.nombre, p.descripcion, p.tipo_producto,
                p.stock_actual, p.stock_minimo, p.unidad_medida, p.precio_compra, p.precio_venta,
                p.fecha_vencimiento, p.ubicacion, p.estado,
                c.nombre as categoria, pr.razon_social as proveedor
                FROM inv_productos p
                LEFT JOIN inv_categorias c ON p.idcategoria = c.idcategoria
                LEFT JOIN inv_proveedores pr ON p.idproveedor = pr.idproveedor
                WHERE p.estado = 1
                ORDER BY p.nombre ASC";
        return ejecutarConsulta($sql);
    }

    // Listar productos con stock bajo
    public function listarStockBajo()
    {
        $sql = "SELECT p.idproducto, p.codigo, p.nombre, p.stock_actual, p.stock_minimo,
                p.unidad_medida, c.nombre as categoria,
                (p.stock_minimo - p.stock_actual) as cantidad_faltante
                FROM inv_productos p
                LEFT JOIN inv_categorias c ON p.idcategoria = c.idcategoria
                WHERE p.stock_actual <= p.stock_minimo AND p.estado = 1
                ORDER BY cantidad_faltante DESC";
        return ejecutarConsulta($sql);
    }

    // Listar productos próximos a vencer
    public function listarProximosVencer()
    {
        $sql = "SELECT p.idproducto, p.codigo, p.nombre, p.lote, p.fecha_vencimiento,
                p.stock_actual, c.nombre as categoria,
                DATEDIFF(p.fecha_vencimiento, CURDATE()) as dias_para_vencer
                FROM inv_productos p
                LEFT JOIN inv_categorias c ON p.idcategoria = c.idcategoria
                WHERE p.fecha_vencimiento IS NOT NULL
                AND p.fecha_vencimiento >= CURDATE()
                AND DATEDIFF(p.fecha_vencimiento, CURDATE()) <= 60
                AND p.estado = 1
                ORDER BY p.fecha_vencimiento ASC";
        return ejecutarConsulta($sql);
    }

    // Insertar producto
    public function insertar(
        $codigo,
        $nombre,
        $descripcion,
        $idcategoria,
        $tipo_producto,
        $principio_activo,
        $concentracion,
        $presentacion,
        $registro_sanitario,
        $requiere_receta,
        $stock_actual,
        $stock_minimo,
        $stock_maximo,
        $unidad_medida,
        $precio_compra,
        $precio_venta,
        $precio_venta_publico,
        $ubicacion,
        $lote,
        $fecha_vencimiento,
        $idproveedor,
        $observaciones
    ) {
        $sql = "INSERT INTO inv_productos (codigo, nombre, descripcion, idcategoria, tipo_producto,
                principio_activo, concentracion, presentacion, registro_sanitario, requiere_receta,
                stock_actual, stock_minimo, stock_maximo, unidad_medida, precio_compra, precio_venta,
                precio_venta_publico, ubicacion, lote, fecha_vencimiento, idproveedor, observaciones, estado)
                VALUES ('$codigo', '$nombre', '$descripcion', '$idcategoria', '$tipo_producto',
                '$principio_activo', '$concentracion', '$presentacion', '$registro_sanitario', '$requiere_receta',
                '$stock_actual', '$stock_minimo', '$stock_maximo', '$unidad_medida', '$precio_compra', '$precio_venta',
                '$precio_venta_publico', '$ubicacion', '$lote', " .
            ($fecha_vencimiento ? "'$fecha_vencimiento'" : "NULL") . ", " .
            ($idproveedor ? "'$idproveedor'" : "NULL") . ", '$observaciones', 1)";
        return ejecutarConsulta($sql);
    }

    // Editar producto
    public function editar(
        $idproducto,
        $codigo,
        $nombre,
        $descripcion,
        $idcategoria,
        $tipo_producto,
        $principio_activo,
        $concentracion,
        $presentacion,
        $registro_sanitario,
        $requiere_receta,
        $stock_minimo,
        $stock_maximo,
        $unidad_medida,
        $precio_compra,
        $precio_venta,
        $precio_venta_publico,
        $ubicacion,
        $lote,
        $fecha_vencimiento,
        $idproveedor,
        $observaciones
    ) {
        $sql = "UPDATE inv_productos SET
                codigo = '$codigo',
                nombre = '$nombre',
                descripcion = '$descripcion',
                idcategoria = '$idcategoria',
                tipo_producto = '$tipo_producto',
                principio_activo = '$principio_activo',
                concentracion = '$concentracion',
                presentacion = '$presentacion',
                registro_sanitario = '$registro_sanitario',
                requiere_receta = '$requiere_receta',
                stock_minimo = '$stock_minimo',
                stock_maximo = '$stock_maximo',
                unidad_medida = '$unidad_medida',
                precio_compra = '$precio_compra',
                precio_venta = '$precio_venta',
                precio_venta_publico = '$precio_venta_publico',
                ubicacion = '$ubicacion',
                lote = '$lote',
                fecha_vencimiento = " . ($fecha_vencimiento ? "'$fecha_vencimiento'" : "NULL") . ",
                idproveedor = " . ($idproveedor ? "'$idproveedor'" : "NULL") . ",
                observaciones = '$observaciones'
                WHERE idproducto = '$idproducto'";
        return ejecutarConsulta($sql);
    }

    // Mostrar producto
    public function mostrar($idproducto)
    {
        $sql = "SELECT * FROM inv_productos WHERE idproducto = '$idproducto'";
        return ejecutarConsultaSimpleFila($sql);
    }

    // Desactivar producto
    public function desactivar($idproducto)
    {
        $sql = "UPDATE inv_productos SET estado = 0 WHERE idproducto = '$idproducto'";
        return ejecutarConsulta($sql);
    }

    // Activar producto
    public function activar($idproducto)
    {
        $sql = "UPDATE inv_productos SET estado = 1 WHERE idproducto = '$idproducto'";
        return ejecutarConsulta($sql);
    }

    // Actualizar stock
    public function actualizarStock($idproducto, $cantidad, $operacion)
    {
        if ($operacion == 'sumar') {
            $sql = "UPDATE inv_productos SET stock_actual = stock_actual + $cantidad WHERE idproducto = '$idproducto'";
        } else {
            $sql = "UPDATE inv_productos SET stock_actual = stock_actual - $cantidad WHERE idproducto = '$idproducto'";
        }
        return ejecutarConsulta($sql);
    }

    // Listar categorías
    public function listarCategorias()
    {
        $sql = "SELECT * FROM inv_categorias WHERE estado = 1 ORDER BY nombre ASC";
        return ejecutarConsulta($sql);
    }

    // Listar proveedores
    public function listarProveedores()
    {
        $sql = "SELECT * FROM inv_proveedores WHERE estado = 1 ORDER BY razon_social ASC";
        return ejecutarConsulta($sql);
    }

    // Insertar categoría
    public function insertarCategoria($nombre, $descripcion, $tipo)
    {
        $sql = "INSERT INTO inv_categorias (nombre, descripcion, tipo, estado)
                VALUES ('$nombre', '$descripcion', '$tipo', 1)";
        return ejecutarConsulta($sql);
    }

    // Insertar proveedor
    public function insertarProveedor($razon_social, $ruc, $contacto, $telefono, $email, $direccion, $ciudad, $observaciones)
    {
        $sql = "INSERT INTO inv_proveedores (razon_social, ruc, contacto, telefono, email, direccion, ciudad, observaciones, estado)
                VALUES ('$razon_social', '$ruc', '$contacto', '$telefono', '$email', '$direccion', '$ciudad', '$observaciones', 1)";
        return ejecutarConsulta($sql);
    }

    // Buscar productos
    public function buscar($criterio)
    {
        $sql = "SELECT p.idproducto, p.codigo, p.nombre, p.descripcion, p.tipo_producto,
                p.stock_actual, p.unidad_medida, p.precio_venta, c.nombre as categoria
                FROM inv_productos p
                LEFT JOIN inv_categorias c ON p.idcategoria = c.idcategoria
                WHERE p.estado = 1 AND (p.nombre LIKE '%$criterio%' OR p.codigo LIKE '%$criterio%')
                ORDER BY p.nombre ASC
                LIMIT 20";
        return ejecutarConsulta($sql);
    }

    // Verificar código duplicado
    public function verificarCodigo($codigo, $idproducto = 0)
    {
        $sql = "SELECT COUNT(*) as total FROM inv_productos 
                WHERE codigo = '$codigo' AND idproducto != '$idproducto'";
        $result = ejecutarConsultaSimpleFila($sql);
        return $result['total'] > 0;
    }
}
?>