import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:sqflite/sqflite.dart'; import 'package:yoshi_papas_app/services/repo_service.dart'; import '../data/api_response.dart'; import '../services/base_service.dart'; import '../models/models.dart'; class PedidoViewModel extends ChangeNotifier { String _busqueda = ""; String get busqueda => _busqueda; List _pedidos = []; Pedido? _selectedPedido; bool _isLoading = false; int _currentPage = 1; int _totalPedidos = 0; int _limit = 10; int get currentPage => _currentPage; int get totalPedidos => _totalPedidos; int get totalPages => (_totalPedidos / _limit).ceil(); List get pedidos => _pedidos; Pedido? get selectedPedido => _selectedPedido; bool get isLoading => _isLoading; void setIsLoading(bool loading) { _isLoading = loading; notifyListeners(); } Future guardarPedidoLocal({required Pedido pedido}) async { RepoService repoPedido = RepoService(); int nextFolio = await repoPedido.obtenerProximoFolio(); pedido.folio = nextFolio; int idPedido = await repoPedido.guardarLocal(pedido); if (idPedido > 0) { pedido.id = idPedido; RepoService repoPedidoProducto = RepoService(); RepoService repoPedidoProductoTopping = RepoService(); for (var producto in pedido.productos) { PedidoProducto pedidoProducto = PedidoProducto( idPedido: idPedido, idProducto: producto.idProducto, cantidad: producto.cantidad, costoUnitario: producto.costoUnitario, comentario: producto.comentario, ); int idPedidoProducto = await repoPedidoProducto.guardarLocal(pedidoProducto); for (var topping in producto.toppings) { PedidoProductoTopping pedidoProductoTopping = PedidoProductoTopping( idPedidoProducto: idPedidoProducto, idTopping: topping.idTopping, ); await repoPedidoProductoTopping.guardarLocal(pedidoProductoTopping); } } notifyListeners(); return true; } else { return false; } } Future fetchLocalPedidos({int page = 1}) async { _isLoading = true; _currentPage = page; notifyListeners(); RepoService repoPedido = RepoService(); _totalPedidos = await repoPedido.contarPedidos(); int offset = (_limit * (page - 1)); List paginatedPedidos = await repoPedido.obtenerPedidosPaginados(_limit, offset); _pedidos = paginatedPedidos; _isLoading = false; notifyListeners(); } void nextPage() { if (_currentPage < totalPages) { fetchLocalPedidosForScreen(page: _currentPage + 1); } } void previousPage() { if (_currentPage > 1) { fetchLocalPedidosForScreen(page: _currentPage - 1); } } Future fetchLocalPedidosForScreen({int page = 1}) async { setIsLoading(true); RepoService repoPedido = RepoService(); _currentPage = page; var db = await RepoService().db; int? count = Sqflite.firstIntValue( await db!.rawQuery('SELECT COUNT(*) FROM Pedido')); _totalPedidos = count ?? 0; int offset = (_limit * (page - 1)); List localPedidos = await repoPedido.obtenerPedidosPaginados(_limit, offset); _pedidos = localPedidos; setIsLoading(false); notifyListeners(); } Future fetchPedidoConProductos(int idPedido) async { RepoService repoPedido = RepoService(); Pedido? pedido = await repoPedido.obtenerPorId(idPedido); if (pedido != null) { RepoService repoProducto = RepoService(); RepoService repoProductoInfo = RepoService(); List productos = await repoProducto.obtenerPorIdPedido(idPedido); for (var producto in productos) { Producto? prodInfo = await repoProductoInfo.obtenerProductoPorId(producto.idProducto!); if (prodInfo != null) { producto.producto = prodInfo; } RepoService repoTopping = RepoService(); List toppings = await repoTopping.obtenerToppingsPorPedidoProducto(producto.id!); for (var topping in toppings) { Producto? toppingInfo = await repoProductoInfo.obtenerProductoPorId(topping.idTopping!); if (toppingInfo != null) { topping.topping = toppingInfo; } } producto.toppings = toppings; } pedido.productos = productos; } return pedido; } Future buscarPedidosPorFolio(String folio) async { setIsLoading(true); RepoService repoPedido = RepoService(); List localPedidos = await repoPedido.buscarPorFolio(folio); _pedidos = localPedidos; setIsLoading(false); notifyListeners(); } Future buscarPedidosPorFecha( DateTime startDate, DateTime endDate) async { setIsLoading(true); RepoService repoPedido = RepoService(); List localPedidos = await repoPedido.buscarPorFecha(startDate, endDate); _pedidos = localPedidos; setIsLoading(false); notifyListeners(); } Future> buscarPorFecha( DateTime startDate, DateTime endDate) async { setIsLoading(true); RepoService repoPedido = RepoService(); List pedidos = await repoPedido.buscarPorFecha(startDate, endDate); setIsLoading(false); notifyListeners(); return pedidos; } Future cancelarPedido(int idPedido) async { var db = await RepoService().db; await db?.update('Pedido', {'estatus': 'CANCELADO'}, where: 'id = ?', whereArgs: [idPedido]); fetchLocalPedidosForScreen(); } }