<?php
require_once "../modelos/Inventario.php";

$inventario = new Inventario();

$idproducto = isset($_POST["idproducto"]) ? limpiarCadena($_POST["idproducto"]) : "";
$codigo = isset($_POST["codigo"]) ? limpiarCadena($_POST["codigo"]) : "";
$nombre = isset($_POST["nombre"]) ? limpiarCadena($_POST["nombre"]) : "";
$descripcion = isset($_POST["descripcion"]) ? limpiarCadena($_POST["descripcion"]) : "";
$idcategoria = isset($_POST["idcategoria"]) ? limpiarCadena($_POST["idcategoria"]) : "";
$tipo_producto = isset($_POST["tipo_producto"]) ? limpiarCadena($_POST["tipo_producto"]) : "";
$principio_activo = isset($_POST["principio_activo"]) ? limpiarCadena($_POST["principio_activo"]) : "";
$concentracion = isset($_POST["concentracion"]) ? limpiarCadena($_POST["concentracion"]) : "";
$presentacion = isset($_POST["presentacion"]) ? limpiarCadena($_POST["presentacion"]) : "";
$registro_sanitario = isset($_POST["registro_sanitario"]) ? limpiarCadena($_POST["registro_sanitario"]) : "";
$requiere_receta = isset($_POST["requiere_receta"]) ? limpiarCadena($_POST["requiere_receta"]) : "0";
$stock_actual = isset($_POST["stock_actual"]) ? limpiarCadena($_POST["stock_actual"]) : "0";
$stock_minimo = isset($_POST["stock_minimo"]) ? limpiarCadena($_POST["stock_minimo"]) : "0";
$stock_maximo = isset($_POST["stock_maximo"]) ? limpiarCadena($_POST["stock_maximo"]) : "0";
$unidad_medida = isset($_POST["unidad_medida"]) ? limpiarCadena($_POST["unidad_medida"]) : "UNIDAD";
$precio_compra = isset($_POST["precio_compra"]) ? limpiarCadena($_POST["precio_compra"]) : "0";
$precio_venta = isset($_POST["precio_venta"]) ? limpiarCadena($_POST["precio_venta"]) : "0";
$precio_venta_publico = isset($_POST["precio_venta_publico"]) ? limpiarCadena($_POST["precio_venta_publico"]) : "0";
$ubicacion = isset($_POST["ubicacion"]) ? limpiarCadena($_POST["ubicacion"]) : "";
$lote = isset($_POST["lote"]) ? limpiarCadena($_POST["lote"]) : "";
$fecha_vencimiento = isset($_POST["fecha_vencimiento"]) ? limpiarCadena($_POST["fecha_vencimiento"]) : "";
$idproveedor = isset($_POST["idproveedor"]) ? limpiarCadena($_POST["idproveedor"]) : "";
$observaciones = isset($_POST["observaciones"]) ? limpiarCadena($_POST["observaciones"]) : "";

switch ($_GET["op"]) {
    case 'guardaryeditar':
        if (empty($idproducto)) {
            if ($inventario->verificarCodigo($codigo)) {
                echo json_encode(["status" => "error", "message" => "El código ya existe"]);
            } else {
                $rspta = $inventario->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
                );
                echo $rspta ? json_encode(["status" => "success", "message" => "Producto registrado"]) :
                    json_encode(["status" => "error", "message" => "No se pudo registrar"]);
            }
        } else {
            if ($inventario->verificarCodigo($codigo, $idproducto)) {
                echo json_encode(["status" => "error", "message" => "El código ya existe"]);
            } else {
                $rspta = $inventario->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
                );
                echo $rspta ? json_encode(["status" => "success", "message" => "Producto actualizado"]) :
                    json_encode(["status" => "error", "message" => "No se pudo actualizar"]);
            }
        }
        break;

    case 'desactivar':
        $rspta = $inventario->desactivar($idproducto);
        echo $rspta ? "Producto desactivado" : "No se pudo desactivar";
        break;

    case 'activar':
        $rspta = $inventario->activar($idproducto);
        echo $rspta ? "Producto activado" : "No se pudo activar";
        break;

    case 'mostrar':
        $rspta = $inventario->mostrar($idproducto);
        echo json_encode($rspta);
        break;

    case 'listar':
        $rspta = $inventario->listar();
        $data = array();
        while ($reg = $rspta->fetch_object()) {
            $data[] = array(
                "0" => '<button class="btn btn-warning btn-sm" onclick="mostrarProducto(' . $reg->idproducto . ')"><i class="fa fa-pencil"></i></button>' .
                    ' <button class="btn btn-danger btn-sm" onclick="desactivarProducto(' . $reg->idproducto . ')"><i class="fa fa-trash"></i></button>',
                "1" => $reg->codigo,
                "2" => $reg->nombre,
                "3" => $reg->categoria,
                "4" => $reg->tipo_producto,
                "5" => $reg->stock_actual . ' ' . $reg->unidad_medida,
                "6" => ($reg->stock_actual <= $reg->stock_minimo) ?
                    '<span class="label label-danger">Stock Bajo</span>' :
                    '<span class="label label-success">OK</span>',
                "7" => '$' . number_format($reg->precio_venta, 2),
                "8" => $reg->ubicacion,
                "9" => ($reg->estado == 1) ? '<span class="label label-success">Activo</span>' :
                    '<span class="label label-danger">Inactivo</span>'
            );
        }
        $results = array(
            "sEcho" => 1,
            "iTotalRecords" => count($data),
            "iTotalDisplayRecords" => count($data),
            "aaData" => $data
        );
        echo json_encode($results);
        break;

    case 'listarStockBajo':
        $rspta = $inventario->listarStockBajo();
        $data = array();
        while ($reg = $rspta->fetch_object()) {
            $data[] = array(
                "0" => $reg->codigo,
                "1" => $reg->nombre,
                "2" => $reg->categoria,
                "3" => $reg->stock_actual . ' ' . $reg->unidad_medida,
                "4" => $reg->stock_minimo . ' ' . $reg->unidad_medida,
                "5" => '<span class="label label-danger">' . $reg->cantidad_faltante . ' ' . $reg->unidad_medida . '</span>'
            );
        }
        echo json_encode($data);
        break;

    case 'listarProximosVencer':
        $rspta = $inventario->listarProximosVencer();
        $data = array();
        while ($reg = $rspta->fetch_object()) {
            $data[] = array(
                "0" => $reg->codigo,
                "1" => $reg->nombre,
                "2" => $reg->lote,
                "3" => date('d/m/Y', strtotime($reg->fecha_vencimiento)),
                "4" => $reg->dias_para_vencer <= 30 ?
                    '<span class="label label-danger">' . $reg->dias_para_vencer . ' días</span>' :
                    '<span class="label label-warning">' . $reg->dias_para_vencer . ' días</span>',
                "5" => $reg->stock_actual
            );
        }
        echo json_encode($data);
        break;

    case 'selectCategoria':
        $rspta = $inventario->listarCategorias();
        echo '<option value="">Seleccione</option>';
        while ($reg = $rspta->fetch_object()) {
            echo '<option value=' . $reg->idcategoria . '>' . $reg->nombre . '</option>';
        }
        break;

    case 'selectProveedor':
        $rspta = $inventario->listarProveedores();
        echo '<option value="">Seleccione</option>';
        while ($reg = $rspta->fetch_object()) {
            echo '<option value=' . $reg->idproveedor . '>' . $reg->razon_social . '</option>';
        }
        break;

    case 'buscar':
        $criterio = isset($_POST["criterio"]) ? limpiarCadena($_POST["criterio"]) : "";
        $rspta = $inventario->buscar($criterio);
        $data = array();
        while ($reg = $rspta->fetch_object()) {
            $data[] = array(
                "idproducto" => $reg->idproducto,
                "codigo" => $reg->codigo,
                "nombre" => $reg->nombre,
                "stock_actual" => $reg->stock_actual,
                "unidad_medida" => $reg->unidad_medida,
                "precio_venta" => $reg->precio_venta
            );
        }
        echo json_encode($data);
        break;

    case 'guardarCategoria':
        $nombre_cat = isset($_POST["nombre_categoria"]) ? limpiarCadena($_POST["nombre_categoria"]) : "";
        $descripcion_cat = isset($_POST["descripcion_categoria"]) ? limpiarCadena($_POST["descripcion_categoria"]) : "";
        $tipo_cat = isset($_POST["tipo_categoria"]) ? limpiarCadena($_POST["tipo_categoria"]) : "";
        $rspta = $inventario->insertarCategoria($nombre_cat, $descripcion_cat, $tipo_cat);
        echo $rspta ? "Categoría registrada" : "No se pudo registrar";
        break;

    case 'guardarProveedor':
        $razon = isset($_POST["razon_social"]) ? limpiarCadena($_POST["razon_social"]) : "";
        $ruc = isset($_POST["ruc"]) ? limpiarCadena($_POST["ruc"]) : "";
        $contacto = isset($_POST["contacto"]) ? limpiarCadena($_POST["contacto"]) : "";
        $telefono = isset($_POST["telefono"]) ? limpiarCadena($_POST["telefono"]) : "";
        $email = isset($_POST["email"]) ? limpiarCadena($_POST["email"]) : "";
        $direccion = isset($_POST["direccion"]) ? limpiarCadena($_POST["direccion"]) : "";
        $ciudad = isset($_POST["ciudad"]) ? limpiarCadena($_POST["ciudad"]) : "";
        $obs = isset($_POST["observaciones_prov"]) ? limpiarCadena($_POST["observaciones_prov"]) : "";
        $rspta = $inventario->insertarProveedor($razon, $ruc, $contacto, $telefono, $email, $direccion, $ciudad, $obs);
        echo $rspta ? "Proveedor registrado" : "No se pudo registrar";
        break;

    case 'listarProveedores':
        $rspta = $inventario->listarProveedores();
        $data = array();
        while ($reg = $rspta->fetch_object()) {
            $data[] = array(
                $reg->razon_social,
                $reg->ruc ? $reg->ruc : '-',
                $reg->contacto ? $reg->contacto : '-',
                $reg->telefono ? $reg->telefono : '-',
                $reg->ciudad ? $reg->ciudad : '-'
            );
        }
        $results = array(
            "sEcho" => 1,
            "iTotalRecords" => count($data),
            "iTotalDisplayRecords" => count($data),
            "aaData" => $data
        );
        echo json_encode($results);
        break;

    case 'guardarMovimiento':
        require_once "../modelos/InventarioMovimientos.php";
        $movimientos = new InventarioMovimientos();

        $idproducto_mov = isset($_POST["idproducto"]) ? limpiarCadena($_POST["idproducto"]) : "";
        $cantidad_mov = isset($_POST["cantidad"]) ? limpiarCadena($_POST["cantidad"]) : "0";
        $tipo_mov = isset($_POST["tipo_movimiento"]) ? limpiarCadena($_POST["tipo_movimiento"]) : "";
        $precio_mov = isset($_POST["precio_unitario"]) ? limpiarCadena($_POST["precio_unitario"]) : "0";
        $obs_mov = isset($_POST["observaciones"]) ? limpiarCadena($_POST["observaciones"]) : "";
        $idusuario_mov = isset($_POST["idusuario"]) ? limpiarCadena($_POST["idusuario"]) : "";

        $numero_doc = $movimientos->obtenerUltimoNumero($tipo_mov);
        $total = $cantidad_mov * $precio_mov;

        $idmovimiento = $movimientos->insertar($tipo_mov, $numero_doc, null, $idusuario_mov, null, $total, $obs_mov);

        if ($idmovimiento) {
            $movimientos->insertarDetalle($idmovimiento, $idproducto_mov, $cantidad_mov, $precio_mov, "", null, "");

            if ($tipo_mov == 'ENTRADA') {
                $inventario->actualizarStock($idproducto_mov, $cantidad_mov, 'sumar');
            } else {
                $inventario->actualizarStock($idproducto_mov, $cantidad_mov, 'restar');
            }

            echo json_encode(["status" => "success", "message" => "Movimiento registrado correctamente"]);
        } else {
            echo json_encode(["status" => "error", "message" => "No se pudo registrar el movimiento"]);
        }
        break;

    case 'listarMovimientos':
        // Respuesta vacía por defecto
        $data = array();

        // Intentar cargar movimientos solo si el modelo existe
        if (file_exists("../modelos/InventarioMovimientos.php")) {
            require_once "../modelos/InventarioMovimientos.php";
            $movimientos = new InventarioMovimientos();

            // Intentar obtener datos
            $rspta = @$movimientos->listar();

            if ($rspta && is_object($rspta) && $rspta->num_rows > 0) {
                while ($reg = $rspta->fetch_object()) {
                    $productos = "Sin detalles";
                    $cantidad_total = 0;

                    // Intentar obtener detalles
                    $detalles = @$movimientos->listarDetalle($reg->idmovimiento);
                    if ($detalles && is_object($detalles) && $detalles->num_rows > 0) {
                        $temp = "";
                        while ($det = $detalles->fetch_object()) {
                            $temp .= $det->producto . " (" . $det->cantidad . " " . $det->unidad_medida . "), ";
                            $cantidad_total += $det->cantidad;
                        }
                        if ($temp) {
                            $productos = rtrim($temp, ", ");
                        }
                    }

                    $tipo_badge = $reg->tipo_movimiento == 'ENTRADA' ?
                        '<span class="label label-success">ENTRADA</span>' :
                        '<span class="label label-warning">SALIDA</span>';

                    $data[] = array(
                        date('d/m/Y H:i', strtotime($reg->fecha_movimiento)),
                        $tipo_badge,
                        $productos,
                        $cantidad_total,
                        isset($reg->usuario) && $reg->usuario ? $reg->usuario : 'Sistema'
                    );
                }
            }
        }

        // Siempre devolver respuesta válida
        $results = array(
            "sEcho" => 1,
            "iTotalRecords" => count($data),
            "iTotalDisplayRecords" => count($data),
            "aaData" => $data
        );
        echo json_encode($results);
        break;
}
?>