import 'dart:async';

import '../../../../../core/network/ws_client.dart';
import '../../../../auth/data/data_source/local/auth_local_data.dart';

/// منبعِ realtime بازی: یک اتصال WebSocket را مدیریت کرده و پیام‌ها/وضعیت را
/// به‌صورت استریم در اختیار repository می‌گذارد. توکن از حافظه‌ی محلی خوانده می‌شود.
class GameWsProvider {
  final AuthLocalData local;
  GameWsProvider(this.local);

  WsClient? _ws;
  StreamSubscription? _msgSub;
  StreamSubscription? _statusSub;

  final _messages = StreamController<Map<String, dynamic>>.broadcast();
  final _status = StreamController<WsStatus>.broadcast();

  Stream<Map<String, dynamic>> get messages => _messages.stream;
  Stream<WsStatus> get status => _status.stream;

  Future<void> connect() async {
    await _teardown(); // اتصال قبلی (در صورت وجود) بسته شود
    final token = await local.readToken();
    if (token == null || token.isEmpty) return;
    final ws = WsClient(token);
    _ws = ws;
    _msgSub = ws.messages.listen(_messages.add);
    _statusSub = ws.status.listen(_status.add);
    ws.connect();
  }

  void send(Map<String, dynamic> msg) => _ws?.send(msg);

  Future<void> _teardown() async {
    await _msgSub?.cancel();
    await _statusSub?.cancel();
    _msgSub = null;
    _statusSub = null;
    _ws?.dispose();
    _ws = null;
  }

  Future<void> disconnect() => _teardown();
}
