import 'package:superport_v2/core/common/models/paginated_result.dart';

import '../entities/approval.dart';
import '../entities/approval_proceed_status.dart';

/// 결재 도메인에서 사용하는 저장소 인터페이스.
///
/// - presentation 레이어는 이 인터페이스만 의존하며, 실제 구현은 data 레이어가 담당한다.
abstract class ApprovalRepository {
  /// 결재 목록을 조회한다. 필터/페이지 조건을 지원한다.
  Future<PaginatedResult<Approval>> list({
    int page = 1,
    int pageSize = 20,
    int? transactionId,
    int? approvalStatusId,
    int? requestedById,
    List<String>? statusCodes,
    bool includePending = false,
    bool includeHistories = false,
    bool includeSteps = false,
  });

  /// 결재 상세 정보를 조회한다.
  Future<Approval> fetchDetail(
    int id, {
    bool includeSteps = true,
    bool includeHistories = true,
  });

  /// 결재를 상신한다.
  Future<Approval> submit(ApprovalSubmissionInput input);

  /// 결재를 재상신한다.
  Future<Approval> resubmit(ApprovalResubmissionInput input);

  /// 결재를 승인한다.
  Future<Approval> approve(ApprovalDecisionInput input);

  /// 결재를 반려한다.
  Future<Approval> reject(ApprovalDecisionInput input);

  /// 결재를 회수한다.
  Future<Approval> recall(ApprovalRecallInput input);

  /// 결재 감사 로그를 조회한다.
  Future<PaginatedResult<ApprovalHistory>> listHistory({
    required int approvalId,
    int page,
    int pageSize,
    DateTime? from,
    DateTime? to,
    int? actorId,
    int? approvalActionId,
  });

  /// 활성화된 결재 행위(approve/reject/comment 등) 목록 조회
  Future<List<ApprovalAction>> listActions({bool activeOnly = true});

  /// 결재 단계에 행위를 적용하고 최신 결재 정보를 반환
  Future<Approval> performStepAction(ApprovalStepActionInput input);

  /// 결재 단계 일괄 생성/재배치
  Future<Approval> assignSteps(ApprovalStepAssignmentInput input);

  /// 결재가 다음 단계로 진행 가능한지 여부를 확인한다.
  Future<ApprovalProceedStatus> canProceed(int id);

  /// 결재를 생성한다.
  Future<Approval> create(ApprovalCreateInput input);

  /// 결재를 수정한다.
  Future<Approval> update(ApprovalUpdateInput input);

  /// 결재를 삭제한다.
  Future<void> delete(int id);

  /// 삭제된 결재를 복구한다.
  Future<Approval> restore(int id);
}
