import 'package:dartz/dartz.dart';
import '../../core/errors/failures.dart';
import '../../models/license_model.dart';
import '../../data/models/common/paginated_response.dart';
import '../../data/models/dashboard/license_expiry_summary.dart';

/// 라이선스 관리 Repository 인터페이스
/// 장비 라이선스 및 유지보수 계약 정보 관리를 담당
abstract class LicenseRepository {
  /// 라이선스 목록 조회
  /// [page] 페이지 번호 (기본값: 1)
  /// [limit] 페이지당 항목 수 (기본값: 20)
  /// [search] 검색어 (라이선스명, 회사명, 장비명 등)
  /// [companyId] 회사 ID 필터
  /// [equipmentType] 장비 유형 필터
  /// [expiryStatus] 만료 상태 필터 ('expired', 'expiring', 'active')
  /// [sortBy] 정렬 기준 ('name', 'expiryDate', 'createdAt' 등)
  /// [sortOrder] 정렬 순서 ('asc', 'desc')
  /// Returns: 페이지네이션된 라이선스 목록
  Future<Either<Failure, PaginatedResponse<License>>> getLicenses({
    int? page,
    int? limit,
    String? search,
    int? companyId,
    String? equipmentType,
    String? expiryStatus,
    String? sortBy,
    String? sortOrder,
  });

  /// 라이선스 상세 정보 조회
  /// [id] 라이선스 고유 식별자
  /// Returns: 라이선스 상세 정보 (회사, 장비 정보 포함)
  Future<Either<Failure, License>> getLicenseById(int id);

  /// 라이선스 생성
  /// [license] 생성할 라이선스 정보
  /// Returns: 생성된 라이선스 정보 (ID 포함)
  Future<Either<Failure, License>> createLicense(License license);

  /// 라이선스 정보 수정
  /// [id] 수정할 라이선스 고유 식별자
  /// [license] 수정할 라이선스 정보
  /// Returns: 수정된 라이선스 정보
  Future<Either<Failure, License>> updateLicense(int id, License license);

  /// 라이선스 삭제
  /// [id] 삭제할 라이선스 고유 식별자
  /// Returns: 삭제 성공/실패 여부
  Future<Either<Failure, void>> deleteLicense(int id);

  /// 만료 예정 라이선스 조회
  /// [days] 앞으로 N일 내 만료 예정 (기본값: 30일)
  /// [companyId] 회사 ID 필터 (선택적)
  /// Returns: 만료 예정 라이선스 목록
  Future<Either<Failure, List<License>>> getExpiringLicenses({int days = 30, int? companyId});

  /// 만료된 라이선스 조회
  /// [companyId] 회사 ID 필터 (선택적)
  /// Returns: 이미 만료된 라이선스 목록
  Future<Either<Failure, List<License>>> getExpiredLicenses({int? companyId});

  /// 라이선스 만료 요약 정보 조회
  /// 대시보드용 30일/60일/90일 내 만료 예정 요약 정보
  /// Returns: 만료 예정 요약 정보
  Future<Either<Failure, LicenseExpirySummary>> getLicenseExpirySummary();

  /// 라이선스 갱신
  /// [id] 갱신할 라이선스 ID
  /// [newExpiryDate] 새로운 만료일
  /// [renewalCost] 갱신 비용 (선택적)
  /// [renewalNote] 갱신 비고 (선택적)
  /// Returns: 갱신된 라이선스 정보
  Future<Either<Failure, License>> renewLicense(
    int id, 
    DateTime newExpiryDate, 
    {double? renewalCost, String? renewalNote}
  );

  /// 회사별 라이선스 통계
  /// [companyId] 회사 ID
  /// Returns: 해당 회사의 라이선스 통계 정보 (전체, 활성, 만료, 만료예정)
  Future<Either<Failure, Map<String, int>>> getLicenseStatsByCompany(int companyId);

  /// 라이선스 유형별 통계
  /// Returns: 라이선스 유형별 개수 (소프트웨어, 하드웨어 등)
  Future<Either<Failure, Map<String, int>>> getLicenseCountByType();

  /// 라이선스 만료일 사전 알림 설정
  /// [licenseId] 라이선스 ID
  /// [notifyDays] 만료 N일 전 알림 (기본값: 30일)
  /// Returns: 알림 설정 성공/실패 여부
  Future<Either<Failure, void>> setExpiryNotification(int licenseId, {int notifyDays = 30});

  /// 라이선스 검색 (자동완성용)
  /// [query] 검색 쿼리
  /// [companyId] 회사 ID 필터 (선택적)
  /// [limit] 결과 제한 수 (기본값: 10)
  /// Returns: 일치하는 라이선스 목록
  Future<Either<Failure, List<License>>> searchLicenses(String query, {int? companyId, int? limit});
}
