import 'package:flutter/material.dart';
import 'package:sqflite/sqflite.dart';
import '../services/services.dart';

import '../models/models.dart';

class CategoriaProductoViewModel extends ChangeNotifier {
  String _busqueda = "";
  String get busqueda => _busqueda;

  List<CategoriaProducto> _categoriaProductos = [];
  bool _isLoading = false;
  CategoriaProducto? _selectedCategoriaProducto;
  Map<int, String> _categoriaMap = {};

  List<CategoriaProducto> get categoriaProductos => _categoriaProductos;
  CategoriaProducto? get selectedCategoriaProducto =>
      _selectedCategoriaProducto;
  bool get isLoading => _isLoading;

  Map<int, String> get categoriaMap => _categoriaMap;

  int _currentPage = 1;
  int _totalProducts = 0;
  int _limit = 10;

  int get currentPage => _currentPage;
  int get totalProducts => _totalProducts;
  int get totalPages => (_totalProducts / _limit).ceil();

  setBusqueda(String value) {
    _busqueda = value;
    notifyListeners();
  }

  void selectCategoriaProducto(CategoriaProducto categoriaProducto) {
    _selectedCategoriaProducto = categoriaProducto;
    notifyListeners();
  }

  Future<void> fetchLocalAll({int page = 1}) async {
    _currentPage = page; // Ajusta la página actual
    var db = await RepoService().db;

    // Primero, obtén el total de productos para calcular el total de páginas
    int? count = Sqflite.firstIntValue(
        await db!.rawQuery('SELECT COUNT(*) FROM CategoriaProducto'));
    _totalProducts = count ?? 0;

    // Calcular el offset basado en la página actual y el límite
    int offset = (_limit * (page - 1));

    // Consulta con paginación
    var query = await db.query('CategoriaProducto',
        orderBy: 'id asc', limit: _limit, offset: offset);
    _categoriaProductos =
        query.map((element) => CategoriaProducto.fromJson(element)).toList();
    notifyListeners();
  }

  Future<void> fetchLocalCategoria() async {
    var db = await RepoService().db;
    var query = await db!.query('CategoriaProducto', orderBy: 'idLocal asc');
    List<CategoriaProducto> aux = [];
    _categoriaMap = {};
    for (var element in query) {
      CategoriaProducto categoria = CategoriaProducto.fromJson(element);
      aux.add(categoria);
      _categoriaMap[categoria.id!] = categoria.nombre!;
    }
    _categoriaProductos = aux;
    notifyListeners();
  }

  Future<List<CategoriaProducto>> getCategoriaProducto({String q = ''}) async {
    var db = await RepoService().db;
    List<Map> results = await db!.query('CategoriaProducto',
        where: 'nombre LIKE ?', whereArgs: ['%$q%'], orderBy: 'nombre ASC');
    return results
        .map(
            (map) => CategoriaProducto.fromJson(Map<String, dynamic>.from(map)))
        .toList();
  }

  Future<void> addCategoriaProducto(CategoriaProducto categoriaProducto) async {
    await RepoService().guardar(categoriaProducto);
    fetchLocalAll();
  }

  Future<void> fetchLocalByName({required String nombre}) async {
    var db = await RepoService().db;
    var query = await db!.query(
      'CategoriaProducto',
      where: 'nombre LIKE "%$nombre%"',
      orderBy: 'idLocal asc',
    );
    List<CategoriaProducto> aux = [];
    for (var element in query) {
      CategoriaProducto categoriaProducto = CategoriaProducto.fromJson(element);
      aux.add(categoriaProducto);
    }
    _categoriaProductos = aux;
    notifyListeners();
  }

  Future<void> updateCategoriaProducto(
      CategoriaProducto categoriaProducto) async {
    setIsLoading(true);
    try {
      int result = await RepoService().guardar(categoriaProducto);
      print("Update result: $result");
      fetchLocalAll();
    } catch (e) {
      print('Error updating product: $e');
    }
    setIsLoading(false);
  }

  Future<void> deleteCategoriaProducto(int id) async {
    await RepoService().eliminar<CategoriaProducto>(id);
    fetchLocalAll();
  }

  void setIsLoading(bool loading) {
    _isLoading = loading;
    notifyListeners();
  }

  void nextPage() {
    if (_currentPage < totalPages) {
      fetchLocalAll(page: _currentPage + 1);
    }
  }

  void previousPage() {
    if (_currentPage > 1) {
      fetchLocalAll(page: _currentPage - 1);
    }
  }
}
