import 'dart:async'; import 'package:flutter/foundation.dart'; import '../models/agent_status.dart'; import '../models/queue_state.dart'; import '../services/api_client.dart'; import '../services/sse_service.dart'; class PhoneNumber { final String phoneNumber; final String friendlyName; PhoneNumber({required this.phoneNumber, required this.friendlyName}); factory PhoneNumber.fromJson(Map json) => PhoneNumber( phoneNumber: json['phone_number'] as String, friendlyName: json['friendly_name'] as String, ); } class AgentProvider extends ChangeNotifier { final ApiClient _api; final SseService _sse; AgentStatus? _status; List _queues = []; bool _sseConnected = false; List _phoneNumbers = []; StreamSubscription? _sseSub; StreamSubscription? _connSub; AgentStatus? get status => _status; List get queues => _queues; bool get sseConnected => _sseConnected; List get phoneNumbers => _phoneNumbers; AgentProvider(this._api, this._sse) { _connSub = _sse.connectionState.listen((connected) { _sseConnected = connected; notifyListeners(); }); _sseSub = _sse.events.listen(_handleSseEvent); } Future fetchStatus() async { try { final response = await _api.dio.get('/agent/status'); _status = AgentStatus.fromJson(response.data); notifyListeners(); } catch (e) { debugPrint('AgentProvider.fetchStatus error: $e'); } } Future updateStatus(AgentStatusValue newStatus) async { final statusStr = newStatus.name; try { await _api.dio.post('/agent/status', data: { 'status': statusStr, 'is_logged_in': true, }); _status = AgentStatus( status: newStatus, isLoggedIn: true, currentCallSid: _status?.currentCallSid, ); notifyListeners(); } catch (e) { debugPrint('AgentProvider.updateStatus error: $e'); } } Future fetchQueues() async { try { final response = await _api.dio.get('/queues/state'); final data = response.data; _queues = (data['queues'] as List) .map((q) => QueueInfo.fromJson(q as Map)) .toList(); notifyListeners(); } catch (e) { debugPrint('AgentProvider.fetchQueues error: $e'); } } Future fetchPhoneNumbers() async { try { final response = await _api.dio.get('/phone-numbers'); final data = response.data; _phoneNumbers = (data['phone_numbers'] as List) .map((p) => PhoneNumber.fromJson(p as Map)) .toList(); notifyListeners(); } catch (e) { debugPrint('AgentProvider.fetchPhoneNumbers error: $e'); } } Future refresh() async { await Future.wait([fetchStatus(), fetchQueues(), fetchPhoneNumbers()]); } void _handleSseEvent(SseEvent event) { switch (event.event) { case 'call_enqueued': case 'call_dequeued': fetchQueues(); break; case 'agent_status_changed': fetchStatus(); break; } } @override void dispose() { _sseSub?.cancel(); _connSub?.cancel(); super.dispose(); } }