import 'package:dio/dio.dart'; import 'package:flutter/cupertino.dart'; import 'package:get_it/get_it.dart'; import '../../../../core/consts/http_api_consts.dart'; import '../../../../core/logging/i_logger_service.dart'; import '../../../../core/storage/user_storage.dart'; class RemoteHttpDatasource { final Dio _dio; final UserStorage _userStorage; // 🔥 新增字段 final ILoggerService _logger = GetIt.I(); RemoteHttpDatasource(this._dio, this._userStorage); /// 示例:获取控制授权 (对应之前逻辑中的权限申请) /* Future> requestControlAuth(String robotId) async { try { final response = await _dio.post( '/robot/auth/request', data: {'robotId': robotId}, ); return response.data; } catch (e) { rethrow; } }*/ /// 🔥 返回完整权限信息: {hasPermission, owner} Future> requestRemoteControlViaHttp(String deviceName, String platform) async { final logPrefix = '🔑 [RemoteHttp][获取权限接口]'; final user = await _userStorage.getUser(); if (user == null) { debugPrint('❌ [RemoteHttp] 用户未登录,无法请求远程控制权限'); _logger.logWithLevel('❌ [RemoteHttp] 用户未登录,无法请求远程控制权限', shouldLog: true); return {'hasPermission': false, 'owner': null}; } final token = user.token; debugPrint('$logPrefix 开始请求远程控制权限 - deviceName: $deviceName, platform: $platform'); _logger.logWithLevel( '$logPrefix 开始请求远程控制权限 - deviceName: $deviceName, platform: $platform', shouldLog: true, ); try { final requestData = {'deviceId': deviceName, 'platform': platform}; debugPrint('$logPrefix 请求地址: POST /forward/device/remoteControl'); debugPrint('$logPrefix 实际请求体: $requestData'); _logger.logWithLevel( '$logPrefix 请求地址: POST /forward/device/remoteControl, 请求体: $requestData', shouldLog: true, ); final response = await _dio.post( '/forward/device/remoteControl', options: Options( headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ${token}', }, ), data: requestData); debugPrint("$logPrefix HTTP响应状态码: ${response.statusCode}"); _logger.logWithLevel("$logPrefix HTTP响应状态码: ${response.statusCode}", shouldLog: true); final responseData = response.data as Map; debugPrint("$logPrefix 完整响应数据:$responseData"); _logger.logWithLevel("$logPrefix 完整响应数据:$responseData", shouldLog: true); // 🔥 关键:先获取响应的 data 字段,再获取 remoteControl 和 owner final dataField = responseData['data'] as Map?; if (dataField != null) { final bool hasRemoteControl = dataField['remoteControl'] as bool? ?? false; final String? owner = dataField['owner'] as String?; debugPrint("$logPrefix 解析成功 - remoteControl=$hasRemoteControl, owner=$owner"); _logger.logWithLevel( "$logPrefix 解析成功 - remoteControl=$hasRemoteControl, owner=$owner", shouldLog: true, ); // 🔥 返回完整权限信息 return {'hasPermission': hasRemoteControl, 'owner': owner}; } else { debugPrint("$logPrefix 缺少 data 字段,响应结构异常"); _logger.logWithLevel("$logPrefix 缺少 data 字段,响应结构异常", shouldLog: true); return {'hasPermission': false, 'owner': null}; } } catch (e) { debugPrint('$logPrefix 请求远程控制权限失败:$e'); _logger.logWithLevel('$logPrefix 请求远程控制权限失败:$e', level: 'ERROR', shouldLog: true); return {'hasPermission': false, 'owner': null}; } } ///app退出远程控制后释放权限 /// [type] 1=从机器人详情页退出释放, 2=退出远程遥控页面释放 Future releaseRemoteControlViaHttp({ required String deviceId, required int type, }) async { final user = await _userStorage.getUser(); if (user == null) { debugPrint('❌ [RemoteHttp] releaseControl 未获取到用户信息,跳过释放'); return false; } final token = user.token; final requestData = { 'platform': 'app', 'type': type, 'deviceId': deviceId, 'token': token, }; debugPrint('📤 [RemoteHttp] releaseControl 实际请求体: $requestData'); try { final response = await _dio.post( HttpApiConsts.releaseControlUrl, options: Options( headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ${token}', }, ), data: requestData); final responseData = response.data as Map; debugPrint('📋 [RemoteHttp] releaseControl 响应: $responseData'); if (responseData['code'] == 200) { return true; } debugPrint( '⚠️ [RemoteHttp] releaseControl 返回 code=${responseData['code']},释放未成功'); return false; } catch (e) { debugPrint('❌ [RemoteHttp] releaseControl 请求失败:$e'); _logger.log('❌ [RemoteHttp] releaseControl 请求失败:$e'); return false; } } }