import 'package:dartz/dartz.dart';
import '../../core/errors/failures.dart';
import '../../data/models/auth/auth_user.dart';
import '../../data/models/auth/login_request.dart';
import '../../data/models/auth/login_response.dart';
import '../../data/models/auth/token_response.dart';
import '../../data/models/auth/refresh_token_request.dart';

/// 인증 Repository 인터페이스
/// 사용자 로그인, 로그아웃, 토큰 관리 등 인증 관련 기능을 담당
abstract class AuthRepository {
  /// 사용자 로그인
  /// [loginRequest] 로그인 요청 데이터 (사용자명, 비밀번호)
  /// Returns: 로그인 응답 (토큰, 사용자 정보)
  Future<Either<Failure, LoginResponse>> login(LoginRequest loginRequest);

  /// 사용자 로그아웃
  /// 서버에 로그아웃 요청을 보내고 세션을 종료
  /// Returns: 로그아웃 성공/실패 여부
  Future<Either<Failure, void>> logout();

  /// 액세스 토큰 갱신
  /// [refreshRequest] 리프레시 토큰 요청 데이터
  /// Returns: 새로운 토큰 정보
  Future<Either<Failure, TokenResponse>> refreshToken(RefreshTokenRequest refreshRequest);

  /// 현재 인증된 사용자 정보 조회
  /// Returns: 현재 사용자 정보
  Future<Either<Failure, AuthUser>> getCurrentUser();

  /// 인증 상태 확인
  /// 현재 사용자가 인증되어 있는지 확인
  /// Returns: 인증 여부 (true: 인증됨, false: 미인증)
  Future<Either<Failure, bool>> isAuthenticated();

  /// 비밀번호 변경
  /// [currentPassword] 현재 비밀번호
  /// [newPassword] 새 비밀번호
  /// Returns: 비밀번호 변경 성공/실패 여부
  Future<Either<Failure, void>> changePassword(String currentPassword, String newPassword);

  /// 비밀번호 재설정 요청
  /// [email] 비밀번호 재설정을 요청할 이메일 주소
  /// Returns: 비밀번호 재설정 요청 성공/실패 여부
  Future<Either<Failure, void>> requestPasswordReset(String email);

  /// 세션 유효성 검증
  /// 현재 저장된 토큰이 유효한지 서버에서 검증
  /// Returns: 세션 유효성 여부
  Future<Either<Failure, bool>> validateSession();

  /// 로컬 저장소에 보관된 리프레시 토큰 조회
  /// Returns: 저장된 리프레시 토큰(없으면 null)
  Future<Either<Failure, String?>> getStoredRefreshToken();

  /// 로컬 저장소에 보관된 액세스 토큰 조회
  /// Returns: 저장된 액세스 토큰(없으면 null)
  Future<Either<Failure, String?>> getStoredAccessToken();

  /// 로컬 세션 정리(토큰/사용자 정보 삭제)
  Future<Either<Failure, void>> clearLocalSession();
}
