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()) { loadTickets(refresh: true); } /// Recupera i ticket. Se reset = true, svuota la lista e riparte da offset 0. Future loadTickets({bool refresh = false}) async { if (state.isLoading) return; if (!refresh && state.hasReachedMax) return; emit( state.copyWith( isLoading: true, errorMessage: '', tickets: refresh ? [] : state.tickets, ), ); try { final currentOffset = refresh ? 0 : state.tickets.length; final newTickets = await _repository.fetchStoreTickets( offset: currentOffset, limit: _limit, searchTerm: state.searchTerm, dateRange: state.dateRange, statusFilter: state.statusFilter, ticketTypeFilter: state.ticketTypeFilter, staffIdFilter: state.staffIdFilter, ); emit( state.copyWith( tickets: refresh ? 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, TicketType? ticketTypeFilter, String? staffIdFilter, bool clearSearch = false, bool clearDate = false, bool clearStatus = false, }) { emit( state.copyWith( searchTerm: searchTerm, dateRange: dateRange, statusFilter: statusFilter, ticketTypeFilter: ticketTypeFilter, staffIdFilter: staffIdFilter, clearSearch: clearSearch, clearDate: clearDate, clearStatus: clearStatus, ), ); loadTickets(refresh: true); // Applica i filtri e ricarica } void toggleTicketSelection(String ticketId) { final currentSelection = Set.from(state.selectedTicketIds); if (currentSelection.contains(ticketId)) { currentSelection.remove(ticketId); } else { currentSelection.add(ticketId); } emit(state.copyWith(selectedTicketIds: currentSelection)); } void clearSelection() { emit(state.copyWith(selectedTicketIds: {})); } void selectAll(List ticketIds) { emit(state.copyWith(selectedTicketIds: ticketIds.toSet())); } }