import '../entities/approval.dart';
import '../entities/approval_flow.dart';
import '../repositories/approval_repository.dart';

/// 결재를 승인하는 유즈케이스.
///
/// - 승인자는 [ApprovalDecisionInput]을 통해 필요한 정보를 전달한다.
class ApproveApprovalUseCase {
  ApproveApprovalUseCase({required ApprovalRepository repository})
    : _repository = repository;

  final ApprovalRepository _repository;

  /// 결재를 승인하고 최신 [ApprovalFlow]를 반환한다.
  Future<ApprovalFlow> call(ApprovalDecisionInput input) async {
    await _ensureCanProceed(input.approvalId);
    final approval = await _repository.approve(input);
    return ApprovalFlow.fromApproval(approval);
  }

  /// 결재 단계 진행 권한을 사전 확인한다.
  Future<void> _ensureCanProceed(int approvalId) async {
    final status = await _repository.canProceed(approvalId);
    if (status.canProceed) {
      return;
    }
    final reason = status.reason?.trim();
    if (reason != null && reason.isNotEmpty) {
      throw StateError(reason);
    }
    throw StateError('결재를 진행할 권한이 없습니다.');
  }
}
