import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import '../models/models.dart';
import '../services/repo_service.dart';

class CorteCajaViewModel extends ChangeNotifier {
  List<CorteCaja> _cortes = [];
  List<CorteCaja> get cortes => _cortes;

  bool _isLoading = false;
  bool get isLoading => _isLoading;
  CorteCaja? _selectedCorte;

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

  double corteFinal = 0.0;
  double totalDepositos = 0.0;
  double totalGastos = 0.0;
  List<Deposito> depositos = [];
  List<Gasto> gastos = [];

  int get currentPage => _currentPage;
  int get totalCortes => _totalCortes;
  int get totalPages => (_totalCortes / _limit).ceil();

  CorteCaja? get selectedCorte => _selectedCorte;

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

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

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

  Future<void> fetchCortes({int page = 1}) async {
    setIsLoading(true);
    RepoService<CorteCaja> repoCorte = RepoService<CorteCaja>();
    _currentPage = page;
    _cortes = await repoCorte.obtenerTodos();
    setIsLoading(false);
    notifyListeners();
  }

  Future<void> buscarPorFecha(DateTime startDate, DateTime endDate) async {
    setIsLoading(true);
    RepoService<CorteCaja> repoCorte = RepoService<CorteCaja>();
    _cortes = await repoCorte.buscarPorFechaCorte(startDate, endDate);
    setIsLoading(false);
    notifyListeners();
  }

  Future<void> fetchDepositosAndGastos(int corteCajaId) async {
    RepoService<Deposito> depositoRepo = RepoService<Deposito>();
    RepoService<Gasto> gastoRepo = RepoService<Gasto>();
    depositos = await depositoRepo.obtenerDepositosPorIdCorteCaja(corteCajaId);
    gastos = await gastoRepo.obtenerGastosPorIdCorteCaja(corteCajaId);
    calcularTotalDeposito();
    calcularTotalGasto();
    notifyListeners();
  }

  Future<void> addDeposito(
      double monto, String descripcion, int corteCajaId) async {
    Deposito nuevoDeposito = Deposito(
        monto: monto, descripcion: descripcion, idCorteCaja: corteCajaId);
    await nuevoDeposito.guardar();
    depositos.add(nuevoDeposito);
    calcularTotalDeposito();
    notifyListeners();
  }

  Future<void> addGasto(
      double monto, String descripcion, int corteCajaId) async {
    Gasto nuevoGasto =
        Gasto(monto: monto, descripcion: descripcion, idCorteCaja: corteCajaId);
    await nuevoGasto.guardar();
    gastos.add(nuevoGasto);
    calcularTotalGasto();
    notifyListeners();
  }

  void calcularTotalDeposito() {
    totalDepositos = depositos.fold(0, (sum, item) => sum + (item.monto ?? 0));
  }

  void calcularTotalGasto() {
    totalGastos = gastos.fold(0, (sum, item) => sum + (item.monto ?? 0));
  }

  void quitarDeposito(int index) {
    depositos.removeAt(index);
    calcularTotalDeposito();
    notifyListeners();
  }

  void quitarGasto(int index) {
    gastos.removeAt(index);
    calcularTotalGasto();
    notifyListeners();
  }

  void calcularCorteFinal(
      double fondo, double fondoSiguiente, double ventasMostrador) {
    corteFinal = (fondo + totalDepositos + ventasMostrador) -
        (fondoSiguiente + totalGastos);
    notifyListeners();
  }
}
