import 'package:dartz/dartz.dart';
import '../../core/errors/failures.dart';
import '../../data/models/administrator_dto.dart';

/// 관리자 관리 Repository 인터페이스 (백엔드 API Administrator 테이블)
/// Clean Architecture Domain Layer - Repository 계약
abstract class AdministratorRepository {
  /// 관리자 목록 조회 (페이지네이션 지원)
  /// [page] 페이지 번호 (기본값: 1)
  /// [pageSize] 페이지당 항목 수 (기본값: 20)
  /// [search] 검색어 (이름, 이메일, 전화번호)
  /// Returns: 페이지네이션된 관리자 목록
  Future<Either<Failure, AdministratorListResponse>> getAdministrators({
    int? page,
    int? pageSize,
    String? search,
  });

  /// 단일 관리자 조회
  /// [id] 관리자 고유 식별자
  /// Returns: 관리자 상세 정보
  Future<Either<Failure, AdministratorDto>> getAdministratorById(int id);

  /// 관리자 계정 생성
  /// [administrator] 생성할 관리자 정보
  /// Returns: 생성된 관리자 정보 (ID 포함)
  Future<Either<Failure, AdministratorDto>> createAdministrator(
    AdministratorRequestDto administrator,
  );

  /// 관리자 정보 수정
  /// [id] 수정할 관리자 고유 식별자
  /// [administrator] 수정할 관리자 정보
  /// Returns: 수정된 관리자 정보
  Future<Either<Failure, AdministratorDto>> updateAdministrator(
    int id,
    AdministratorUpdateRequestDto administrator,
  );

  /// 관리자 계정 삭제
  /// [id] 삭제할 관리자 고유 식별자
  /// Returns: 삭제 성공/실패 여부
  Future<Either<Failure, void>> deleteAdministrator(int id);

  /// 이메일 중복 확인
  /// [email] 체크할 이메일 주소
  /// [excludeId] 체크에서 제외할 관리자 ID (수정 시 현재 관리자 제외용)
  /// Returns: 중복 여부 (true: 중복됨, false: 중복되지 않음)
  Future<Either<Failure, bool>> isDuplicateEmail(String email, {int? excludeId});

  /// 관리자 인증 (로그인용)
  /// [email] 이메일 주소
  /// [password] 비밀번호
  /// Returns: 인증된 관리자 정보
  Future<Either<Failure, AdministratorDto>> authenticateAdministrator(
    String email,
    String password,
  );
}