import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flux/features/master_data/providers/data/provider_repository.dart'; import 'package:get_it/get_it.dart'; import '../models/provider_model.dart'; class ProvidersState extends Equatable { final List allProviders; // Tutti i provider della company final List associatedIds; // ID dei provider attivi nello store selezionato final bool isLoading; final String? errorMessage; const ProvidersState({ this.allProviders = const [], this.associatedIds = const [], this.isLoading = false, this.errorMessage, }); ProvidersState copyWith({ List? allProviders, List? associatedIds, bool? isLoading, String? errorMessage, }) { return ProvidersState( allProviders: allProviders ?? this.allProviders, associatedIds: associatedIds ?? this.associatedIds, isLoading: isLoading ?? this.isLoading, errorMessage: errorMessage, ); } @override List get props => [ allProviders, associatedIds, isLoading, errorMessage, ]; } class ProvidersCubit extends Cubit { final ProviderRepository _repository = GetIt.I(); ProvidersCubit() : super(const ProvidersState()); // Carica i provider della company e quelli associati a uno store specifico Future loadProviders(String companyId, String? storeId) async { emit(state.copyWith(isLoading: true)); try { final all = await _repository.fetchAllCompanyProviders(companyId); List associated = []; if (storeId != null) { associated = await _repository.fetchAssociatedProviderIds(storeId); } emit( state.copyWith( allProviders: all, associatedIds: associated, isLoading: false, ), ); } catch (e) { emit(state.copyWith(isLoading: false, errorMessage: e.toString())); } } // Aggiunge o rimuove l'associazione con lo store Future toggleProviderAssociation({ required String providerId, required String storeId, required bool isCurrentlyAssociated, }) async { try { if (isCurrentlyAssociated) { await _repository.disassociateProviderFromStore( providerId: providerId, storeId: storeId, ); // Aggiorniamo lo stato locale rimuovendo l'ID final newIds = List.from(state.associatedIds) ..remove(providerId); emit(state.copyWith(associatedIds: newIds)); } else { await _repository.associateProviderToStore( providerId: providerId, storeId: storeId, ); // Aggiorniamo lo stato locale aggiungendo l'ID final newIds = List.from(state.associatedIds)..add(providerId); emit(state.copyWith(associatedIds: newIds)); } } catch (e) { emit(state.copyWith(errorMessage: "Errore durante l'aggiornamento: $e")); } } // Salvataggio/Update anagrafica (nuovo o modifica) Future saveProvider(ProviderModel provider) async { emit(state.copyWith(isLoading: true)); try { await _repository.saveProvider(provider); // Ricarichiamo la lista per vedere le modifiche await loadProviders(provider.companyId, null); } catch (e) { emit(state.copyWith(isLoading: false, errorMessage: e.toString())); } } }