// // lib/services/driver_socket_manager.dart // import 'dart:async'; // import 'dart:convert'; // import 'dart:developer'; // import 'dart:developer' as dev; // import 'dart:math'; // import 'package:wanisdriver/Provider/utils_singleton.dart'; // import 'package:stomp_dart_client/stomp.dart'; // import 'package:stomp_dart_client/stomp_config.dart'; // import 'package:stomp_dart_client/stomp_frame.dart'; // import '../config/constants/app_constant.dart'; // // // Helper class for the message queue // class _PendingMessage { // final String destination; // final String body; // final Map? headers; // _PendingMessage({required this.destination, required this.body, this.headers}); // } // // class DriverSocketManager { // final String jwtToken; // late StompClient _stompClient; // // // Use a StreamController to broadcast updates to multiple listeners // final _rideUpdateController = StreamController>.broadcast(); // Stream> get rideUpdateStream => _rideUpdateController.stream; // // bool _isConnected = false; // bool _isManuallyDisconnected = false; // int _reconnectAttempts = 0; // Timer? _reconnectTimer; // final List<_PendingMessage> _pendingMessages = []; // // bool get isConnected => _isConnected; // // DriverSocketManager({required this.jwtToken}); // // void connect() { // if (_isConnected) return; // _isManuallyDisconnected = false; // dev.log('🔌 DRIVER Socket Manager: Attempting to connect...'); // _stompClient = StompClient( // config: StompConfig( // url: socketUrlNative, // stompConnectHeaders: {'Authorization': 'Bearer $jwtToken'}, // webSocketConnectHeaders: {'Authorization': 'Bearer $jwtToken'}, // onConnect: (frame) { // dev.log('✅ DRIVER Socket Manager: STOMP Connected!'); // _isConnected = true; // _reconnectAttempts = 0; // _reconnectTimer?.cancel(); // _flushPendingMessages(); // Future.delayed(const Duration(milliseconds: 200), _subscribeToDestinations); // }, // onWebSocketError: (error) { // dev.log('🔴 DRIVER Socket error: $error'); // _isConnected = false; // _scheduleReconnect(); // }, // onDisconnect: (frame){ // dev.log('🔴 DRIVER Socket disconnected'); // _isConnected = false; // _scheduleReconnect(); // } // ), // ); // _stompClient.activate(); // } // // void _subscribeToDestinations() { // if (!_isConnected) return; // dev.log('✉️ DRIVER Socket Manager: Subscribing...'); // // Public offers // _stompClient.subscribe(destination: '/topic/ride-offers', callback: _handleFrame); // // Private messages // _stompClient.subscribe(destination: '/user/queue/driver', callback: _handleFrame); // _stompClient.subscribe(destination: '/user/queue/ride_updates', callback: _handleFrame); // } // // void _handleFrame(StompFrame frame) { // if (frame.body == null) return; // dev.log('📨 DRIVER Received on ${frame.headers['destination']}: ${frame.body}'); // try { // final data = json.decode(frame.body!) as Map; // _rideUpdateController.add(data); // } catch (e) { // dev.log('🚨 DRIVER Message parse error: $e'); // } // } // // void _sendOrQueue(String destination, String body, {Map? headers}) { // if (_isConnected) { // _stompClient.send(destination: destination, body: body, headers: headers); // } else { // _pendingMessages.add(_PendingMessage(destination: destination, body: body, headers: headers)); // } // } // // void sendAcceptRide({required int rideId}) { // final payload = json.encode({'rideId': rideId, 'accepted': true, 'driverid': utils.user?.driver.id}); // _sendOrQueue('/app/accept_ride', payload); // } // // void sendDeclineRide({required int rideId}) { // final payload = json.encode({'rideId': rideId, 'accepted': false, 'driverid': utils.user?.driver.id}); // _sendOrQueue('/app/accept_ride', payload); // } // // void sendRideUpdate(String type, {required int rideId}) { // final payload = json.encode({'rideId': rideId, 'type': type, 'message': '$type !!'}); // _sendOrQueue('/app/ride_updates', payload); // } // // void _flushPendingMessages() { // dev.log('📦 DRIVER Flushing ${_pendingMessages.length} pending messages...'); // for (var msg in _pendingMessages) { // _sendOrQueue(msg.destination, msg.body, headers: msg.headers); // } // _pendingMessages.clear(); // } // // void _scheduleReconnect() { // if (_isManuallyDisconnected || (_reconnectTimer?.isActive ?? false)) return; // final delay = Duration(seconds: min(pow(2, _reconnectAttempts).toInt(), 60)); // _reconnectAttempts++; // dev.log('🔄 DRIVER Scheduling reconnect in ${delay.inSeconds}s'); // _reconnectTimer = Timer(delay, () { // if (!_isManuallyDisconnected) connect(); // }); // } // // void dispose() { // dev.log('👋 DRIVER Socket Manager: Disposing...'); // _isManuallyDisconnected = true; // _reconnectTimer?.cancel(); // if (_stompClient.connected) _stompClient.deactivate(); // _rideUpdateController.close(); // } // }