import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flux/features/tickets/models/ticket_model.dart'; import 'package:flux/features/tickets/data/ticket_repository.dart'; import 'package:get_it/get_it.dart'; import 'ticket_list_state.dart'; class TicketListCubit extends Cubit { final TicketRepository _repository = GetIt.I.get(); static const int _limit = 20; // Paginazione a blocchi di 20 TicketListCubit() : super(const TicketListState()) { fetchTickets(reset: true); } /// Recupera i ticket. Se reset = true, svuota la lista e riparte da offset 0. Future fetchTickets({bool reset = false}) async { if (state.isLoading) return; if (!reset && state.hasReachedMax) return; emit( state.copyWith( isLoading: true, errorMessage: '', tickets: reset ? [] : state.tickets, ), ); try { final currentOffset = reset ? 0 : state.tickets.length; final newTickets = await _repository.fetchStoreTickets( offset: currentOffset, limit: _limit, searchTerm: state.searchTerm, dateRange: state.dateRange, statusFilter: state.statusFilter, ); emit( state.copyWith( tickets: reset ? newTickets : [...state.tickets, ...newTickets], isLoading: false, hasReachedMax: newTickets.length < _limit, ), ); } catch (e) { emit(state.copyWith(isLoading: false, errorMessage: e.toString())); } } /// Aggiorna i filtri e ricarica tutto da zero void updateFilters({ String? searchTerm, DateTimeRange? dateRange, TicketStatus? statusFilter, bool clearSearch = false, bool clearDate = false, bool clearStatus = false, }) { emit( state.copyWith( searchTerm: searchTerm, dateRange: dateRange, statusFilter: statusFilter, clearSearch: clearSearch, clearDate: clearDate, clearStatus: clearStatus, ), ); fetchTickets(reset: true); // Applica i filtri e ricarica } }