import 'package:json_annotation/json_annotation.dart';
import 'package:networks_sdk/networks_sdk.dart';

import '../../../core/foundation/api_paths.dart';
import '../../../domain/entities/user.dart';

part 'login_request.g.dart';

/// # /auth/login — 登录接口
///
/// ## 数据流位置
///
/// ```
/// AuthRepositoryImpl.login(email, password)
///   → _client.executeRequest( ★ LoginRequest ★ )         ← 你在这里
///     → 服务端 POST /auth/login
///     → SDK 内部 ApiResponseWrapper 拆包 { code, message, data }
///       → ★ LoginResponse ★ = data 字段，T in APIResponseWrapper<T>  ← 也在这里
///         → LoginResponse.toEntity() → User
/// ```

// ─────────────────────────────────────────────
//  Response DTO
// ─────────────────────────────────────────────

/// 登录响应中的用户档案，嵌套在 [LoginResponse.profile] 中。
///
/// 纯 Dart 类，无需任何注解。`_$LoginProfileFromJson` 由生成器从 `@ApiRequest` 声明中自动推导生成。
class LoginProfile {
  final int uid;
  final String uuid;
  @JsonKey(name: 'last_online')
  final int lastOnline;
  @JsonKey(name: 'profile_pic')
  final String profilePic;
  @JsonKey(name: 'profile_pic_gaussian')
  final String profilePicGaussian;
  final String nickname;
  final String contact;
  @JsonKey(name: 'country_code')
  final String countryCode;
  final String email;
  @JsonKey(name: 'recovery_email')
  final String recoveryEmail;
  final String username;
  final String bio;
  final int relationship;
  @JsonKey(name: 'user_alias')
  final String? userAlias;
  @JsonKey(name: 'channel_id')
  final int channelId;
  @JsonKey(name: 'channel_group_id')
  final int channelGroupId;
  final String hint;

  const LoginProfile({
    required this.uid,
    required this.uuid,
    required this.lastOnline,
    required this.profilePic,
    required this.profilePicGaussian,
    required this.nickname,
    required this.contact,
    required this.countryCode,
    required this.email,
    required this.recoveryEmail,
    required this.username,
    required this.bio,
    required this.relationship,
    this.userAlias,
    required this.channelId,
    required this.channelGroupId,
    required this.hint,
  });

  User toEntity() => User(
    uid: uid,
    uuid: uuid,
    lastOnline: lastOnline,
    profilePic: profilePic,
    profilePicGaussian: profilePicGaussian,
    nickname: nickname,
    contact: contact,
    countryCode: countryCode,
    email: email,
    recoveryEmail: recoveryEmail,
    username: username,
    bio: bio,
    relationship: relationship,
    userAlias: userAlias,
    hint: hint,
  );
}

/// 登录接口的业务响应数据（对应服务端 `data` 字段，即 T in `APIResponseWrapper<T>`）。
///
/// `{ code, message }` 由 SDK 内部的 `ApiResponseWrapper` 统一处理，
/// App 层只接触此类，不感知 envelope 结构。纯 Dart 类，无需任何注解。
class LoginResponse {
  @JsonKey(name: 'account_id')
  final String accountId;
  final LoginProfile profile;
  final String nonce;
  @JsonKey(name: 'access_token')
  final String accessToken;
  @JsonKey(name: 'refresh_token')
  final String refreshToken;
  @JsonKey(name: 'device_id')
  final String deviceId;
  @JsonKey(name: 'login_data')
  final String loginData;

  const LoginResponse({
    required this.accountId,
    required this.profile,
    required this.nonce,
    required this.accessToken,
    required this.refreshToken,
    required this.deviceId,
    required this.loginData,
  });

  User toEntity() => profile.toEntity();
}

// ─────────────────────────────────────────────
//  Request
// ─────────────────────────────────────────────

/// 登录请求
///
/// `@ApiRequest` 一个注解搞定一切：
/// - mixin 自动生成 path / method / requestType / includeToken / toJson
/// - parameters getter 自动注册 `_$LoginResponseFromJson` 到 SDK 全局注册表
@ApiRequest(
  path: ApiPaths.authLogin,
  method: HttpMethod.post,
  responseType: LoginResponse,
  requestType: ApiRequestType.login,
)
class LoginRequest extends ApiRequestable<LoginResponse>
    with _$LoginRequestApi {
  final String email;
  final String password;

  LoginRequest({required this.email, required this.password});
}
