import 'dart:async';
import 'dart:convert';
import 'package:web_socket_channel/web_socket_channel.dart';
import 'package:web_socket_channel/status.dart' as status;
import 'package:chepuhagram/core/constants.dart';

class SocketService {
  WebSocketChannel? _channel;
  final StreamController<Map<String, dynamic>> _messageController = 
      StreamController<Map<String, dynamic>>.broadcast();

  // Поток, который будут слушать провайдеры
  Stream<Map<String, dynamic>> get messages => _messageController.stream;

  void connect(String token) {
    if (_channel != null) return; // Уже подключены

    // В FastAPI эндпоинт обычно ожидает токен в URL или подзаголовке
    final uri = Uri.parse("ws://${AppConstants.baseUrl}/ws?token=$token");
    
    _channel = WebSocketChannel.connect(uri);

    _channel!.stream.listen(
      (data) {
        final decoded = jsonDecode(data);
        _messageController.add(decoded);
      },
      onError: (error) => _reconnect(token),
      onDone: () => _reconnect(token),
    );
  }

  void _reconnect(String token) {
    _channel = null;
    Future.delayed(const Duration(seconds: 5), () => connect(token));
  }

  void sendMessage(Map<String, dynamic> data) {
    _channel?.sink.add(jsonEncode(data));
  }

  void disconnect() {
    _channel?.sink.close(status.goingAway);
    _channel = null;
  }
}