"use client";

/**
 * IAuthRepository 接口
 *
 * 对齐 Dart 端 `AuthRepository` 抽象（lib/data/repositories/auth_repository.dart）：
 *   - 登录 / 登出 / 刷新 token / 第三方 OAuth 登录的公共契约
 *   - 登出强制清本地态（无论 API 成败）
 *   - `getCurrentUser` 成功后尽力写本地 User 缓存（best-effort）
 *   - 所有方法返回 `Promise<Result<T>>`，与 Dart `Future<Result<T>>` 对齐
 *
 * 注：仓库内私有方法（`_socialLogin` / `_saveLoginData`）不暴露在接口上。
 * 
 */

import type { Result } from "@/utils";
import type {
  GuestLoginResponse,
  LoginResponse,
  RefreshTokenResponse,
} from "@/data/dto/auth";
import type { User } from "@/data/dto/user";

export interface IAuthRepository {
  /** 用户注册。注册成功不会自动登录（与 Dart 行为一致）。 */
  register(input: {
    username: string;
    email: string;
    password: string;
    guestId?: string;
  }): Promise<Result<void>>;

  /** 邮箱/用户名 + 密码登录。 */
  emailLogin(input: {
    email?: string;
    username?: string;
    password: string;
    guestId?: string;
  }): Promise<Result<LoginResponse>>;

  /** 发送邮箱验证码。 */
  sendCode(email: string): Promise<Result<void>>;

  /**
   * 退出登录：先调 API 注销服务端会话，无论成败都清本地登录态。
   */
  logout(): Promise<Result<void>>;

  /** 游客登录：使用 deviceId 换取 guest token。 */
  guestLogin(deviceId: string): Promise<Result<GuestLoginResponse>>;

  /** Google 登录。 */
  googleLogin(input: {
    idToken: string;
    guestId?: string;
  }): Promise<Result<LoginResponse>>;

  /** Facebook 登录（accessToken 流程）。 */
  facebookLogin(input: {
    accessToken: string;
    guestId?: string;
  }): Promise<Result<LoginResponse>>;

  /** Facebook ID 登录（v7.0 新增，fbId 流程）。 */
  facebookIdLogin(input: {
    fbId: string;
    avatarUrl?: string;
  }): Promise<Result<LoginResponse>>;

  /** Apple 登录。 */
  appleLogin(identityToken: string): Promise<Result<LoginResponse>>;

  /** 刷新 token：先读本地的 refresh token，空则返回错误。 */
  refreshToken(): Promise<Result<RefreshTokenResponse>>;

  /** 获取当前登录用户。成功后尽力写本地 User 缓存。 */
  getCurrentUser(): Promise<Result<User>>;
}
