import 'package:flutter_bloc/flutter_bloc.dart'; import 'server_event.dart'; import 'server_state.dart'; import '../../../domain/repositories/server_repository.dart'; import '../../../data/services/sync_service.dart'; class ServerBloc extends Bloc { final ServerRepository serverRepository; ServerBloc({required this.serverRepository}) : super(const ServerInitial()) { on(_onLoadServers); on(_onLoadGCoreServers); on(_onLoadGeViScopeServers); on(_onCreateServer); on(_onUpdateServer); on(_onDeleteServer); on(_onSyncServers); on(_onDownloadServers); on(_onCheckDirtyCount); } Future _onLoadServers( LoadServers event, Emitter emit, ) async { emit(const ServerLoading()); final result = await serverRepository.getAllServers(); final dirtyCountResult = await serverRepository.getDirtyCount(); result.fold( (failure) => emit(ServerError(failure.message)), (servers) { final dirtyCount = dirtyCountResult.fold((_) => 0, (count) => count); emit(ServerLoaded(servers, dirtyCount: dirtyCount)); }, ); } Future _onLoadGCoreServers( LoadGCoreServers event, Emitter emit, ) async { emit(const ServerLoading()); final result = await serverRepository.getGCoreServers(); final dirtyCountResult = await serverRepository.getDirtyCount(); result.fold( (failure) => emit(ServerError(failure.message)), (servers) { final dirtyCount = dirtyCountResult.fold((_) => 0, (count) => count); emit(ServerLoaded(servers, dirtyCount: dirtyCount)); }, ); } Future _onLoadGeViScopeServers( LoadGeViScopeServers event, Emitter emit, ) async { emit(const ServerLoading()); final result = await serverRepository.getGeViScopeServers(); final dirtyCountResult = await serverRepository.getDirtyCount(); result.fold( (failure) => emit(ServerError(failure.message)), (servers) { final dirtyCount = dirtyCountResult.fold((_) => 0, (count) => count); emit(ServerLoaded(servers, dirtyCount: dirtyCount)); }, ); } Future _onCreateServer( CreateServerEvent event, Emitter emit, ) async { emit(const ServerLoading()); final result = await serverRepository.createServer(event.server); await result.fold( (failure) async => emit(ServerError(failure.message)), (_) async { // Reload servers first final serversResult = await serverRepository.getAllServers(); final dirtyCountResult = await serverRepository.getDirtyCount(); serversResult.fold( (failure) => emit(ServerError(failure.message)), (servers) { final dirtyCount = dirtyCountResult.fold((_) => 0, (count) => count); emit(ServerLoaded(servers, dirtyCount: dirtyCount)); }, ); }, ); } Future _onUpdateServer( UpdateServerEvent event, Emitter emit, ) async { emit(const ServerLoading()); final result = await serverRepository.updateServer(event.server); await result.fold( (failure) async => emit(ServerError(failure.message)), (_) async { // Reload servers first final serversResult = await serverRepository.getAllServers(); final dirtyCountResult = await serverRepository.getDirtyCount(); serversResult.fold( (failure) => emit(ServerError(failure.message)), (servers) { final dirtyCount = dirtyCountResult.fold((_) => 0, (count) => count); emit(ServerLoaded(servers, dirtyCount: dirtyCount)); }, ); }, ); } Future _onDeleteServer( DeleteServerEvent event, Emitter emit, ) async { emit(const ServerLoading()); final result = await serverRepository.deleteServer(event.id, event.type); await result.fold( (failure) async => emit(ServerError(failure.message)), (_) async { // Reload servers first final serversResult = await serverRepository.getAllServers(); final dirtyCountResult = await serverRepository.getDirtyCount(); serversResult.fold( (failure) => emit(ServerError(failure.message)), (servers) { final dirtyCount = dirtyCountResult.fold((_) => 0, (count) => count); emit(ServerLoaded(servers, dirtyCount: dirtyCount)); }, ); }, ); } Future _onSyncServers( SyncServersEvent event, Emitter emit, ) async { emit(const ServerSyncing()); final result = await serverRepository.syncToServer(); result.fold( (failure) => emit(ServerError(failure.message)), (syncResult) { if (syncResult.status == SyncStatus.success) { emit(ServerSyncSuccess( syncResult.message ?? 'Sync completed', syncResult.syncedCount ?? 0, )); // Reload servers after sync add(const LoadServers()); } else if (syncResult.status == SyncStatus.error) { emit(ServerError(syncResult.message ?? 'Sync failed')); } }, ); } Future _onDownloadServers( DownloadServersEvent event, Emitter emit, ) async { emit(const ServerDownloading()); final result = await serverRepository.downloadFromServer(); result.fold( (failure) => emit(ServerError(failure.message)), (count) { emit(ServerOperationSuccess('Downloaded $count servers from server')); // Reload servers after download add(const LoadServers()); }, ); } Future _onCheckDirtyCount( CheckDirtyCountEvent event, Emitter emit, ) async { final result = await serverRepository.getDirtyCount(); result.fold( (failure) => emit(ServerError(failure.message)), (count) { // Just trigger a reload which will include the dirty count add(const LoadServers()); }, ); } }