import 'package:networks_sdk/networks_sdk.dart';

import '../../domain/entities/user.dart';
import '../../domain/repositories/auth_repository.dart';
import '../remote/login_request.dart';
import '../remote/logout_request.dart';

/// 认证 Repository 实现
///
/// implements [AuthRepository] 接口（domain/repositories/ 中定义）。
/// 直接使用 [ApiClient] 发送请求，将 DTO 转为 Domain Entity。
/// 后续可加 Local DataSource 实现离线缓存。
///
/// ## 数据流位置
///
/// ```
/// LoginUseCase.execute(email, password)
///   → ★ AuthRepositoryImpl.login() ★        ← 你在这里
///     → ApiClient.executeRequest(LoginRequest)
///       → 服务端 POST /auth/login
///     ← LoginData（Response DTO）
///     → onTokenUpdate(token)                  ← 回调写入 Token
///     ← LoginData.toEntity() → User          ← DTO → Entity 转换在这里
///   ← User（Domain Entity）
/// ```
class AuthRepositoryImpl implements AuthRepository {
  final NetworksSdkApi _client;
  final void Function(String?) _onTokenUpdate;

  AuthRepositoryImpl({required NetworksSdkApi client, required void Function(String?) onTokenUpdate,})  : _client = client, _onTokenUpdate = onTokenUpdate;

  @override
  Future<User> login({required String email, required String password}) async {
    final LoginResponse? loginResponse = await _client.executeRequest(
      LoginRequest(email: email, password: password),
    );

    if (loginResponse == null) {
      throw Exception('Login failed: empty response');
    }

    _onTokenUpdate(loginResponse.data.accessToken);

    return loginResponse.toEntity();
  }

  @override
  Future<User?> getCurrentUser() async {
    // TODO: 从本地存储获取用户信息
    return null;
  }

  @override
  Future<void> logout() async {
    await _client.executeRequest(LogoutRequest());
    _onTokenUpdate(null); // 回调清除 Token（内存 + 持久化由 Provider 层组合）
  }
}
