import 'package:flutter/foundation.dart'; import '../models/venue.dart'; import '../services/kooltap_api_client.dart'; import '../services/remote_sync_service.dart'; enum RegistrationStep { initial, loadingVenues, venuesLoaded, error, registering, registered, } class RegistrationViewModel extends ChangeNotifier { final KoolTapApiClient apiClient; final RemoteSyncService syncService; RegistrationViewModel({required this.apiClient, required this.syncService}); RegistrationStep _step = RegistrationStep.initial; RegistrationStep get step => _step; List _venues = []; List get venues => _venues; Venue? _selectedVenue; Venue? get selectedVenue => _selectedVenue; /// Server-provided, so shown as-is. String? _errorMessage; String? get errorMessage => _errorMessage; void selectVenue(Venue venue) { _selectedVenue = venue; _errorMessage = null; notifyListeners(); } void deselectVenue() { _selectedVenue = null; _errorMessage = null; notifyListeners(); } Future fetchVenues() async { _step = RegistrationStep.loadingVenues; _selectedVenue = null; _errorMessage = null; notifyListeners(); try { _venues = await apiClient.getVenues(); _step = RegistrationStep.venuesLoaded; } on Exception catch (e) { debugPrint('RegistrationViewModel: fetchVenues error: $e'); _errorMessage = e.toString(); _step = RegistrationStep.error; } notifyListeners(); } Future registerDevice({ required String deviceName, required String registrationCode, }) async { final venue = _selectedVenue; if (venue == null) return false; _step = RegistrationStep.registering; _errorMessage = null; notifyListeners(); try { final credentials = await apiClient.registerDevice( venueId: venue.id, deviceName: deviceName, registrationCode: registrationCode, ); await syncService.setCredentials( deviceId: credentials.deviceId, token: credentials.token, venueId: venue.id, venueName: venue.name, ); _step = RegistrationStep.registered; notifyListeners(); return true; } on ApiException catch (e) { _errorMessage = e.message.isEmpty ? 'Registration failed (HTTP ${e.statusCode})' : e.message; } on Exception catch (e) { debugPrint('RegistrationViewModel: registerDevice error: $e'); _errorMessage = e.toString(); } _step = RegistrationStep.venuesLoaded; notifyListeners(); return false; } Future retry() => fetchVenues(); }