using CashLineERP.Contracts.Finance;

namespace CashLineERP.Application.Finance;

public interface IPaymentGatewayExecutionService
{
    IReadOnlyCollection<PaymentGatewayExecutionResponse> GetExecutions(long? paymentChannelConfigurationId = null, string? statusCode = null);
    PaymentGatewayExecutionResponse? GetExecution(long paymentGatewayExecutionId);
    IReadOnlyCollection<PaymentGatewayExecutionResponse> GetCustomerCollectionExecutions(long customerPaymentRequestId);
    PaymentGatewayExecutionResponse QueueCustomerCollection(long customerPaymentRequestId, long actorUserId);
    IReadOnlyCollection<PaymentGatewayExecutionResponse> GetSupplierPayoutExecutions(long accountsPayablePaymentId);
    PaymentGatewayExecutionResponse QueueSupplierPayout(long accountsPayablePaymentId, string integrationProviderCode, long actorUserId);
    IReadOnlyCollection<PaymentGatewayExecutionResponse> GetRefundExecutions(long customerRefundId);
    PaymentGatewayExecutionResponse QueueCustomerRefund(long customerRefundId, long actorUserId);
    PaymentGatewayProviderContractResponse GetCustomerCollectionProviderContract(long customerPaymentRequestId);
    PaymentGatewayProviderContractResponse GetSupplierPayoutProviderContract(long accountsPayablePaymentId, string? integrationProviderCode = null);
    PaymentGatewayProviderContractResponse GetCustomerRefundProviderContract(long customerRefundId);
    PaymentGatewayProviderContractResponse GetExecutionProviderStatusContract(long paymentGatewayExecutionId);
    PaymentGatewayProviderContractResponse GetExecutionProviderCancelContract(long paymentGatewayExecutionId);
    DispatchPaymentGatewayExecutionBatchResultResponse DispatchPendingExecutions(DispatchPaymentGatewayExecutionBatchRequest request);
}
