using IdokladSdk.Models.BankStatement.Patch;
using IdokladSdk.Models.BankStatement.Post;
using IdokladSdk.Models.IssuedDocumentPayment;
using IdokladSdk.Models.ReceivedDocumentPayments;
using Idoklad.Client;
namespace Idoklad.Services;
///
/// Payments and bank statements: bank statements, issued document payments and received document
/// payments.
///
public sealed class PaymentsService
{
private readonly IdokladApiAccessor _accessor;
public PaymentsService(IdokladApiAccessor accessor) => _accessor = accessor;
// ---- Bank statements ----
public Task ListBankStatementsAsync(int page, int pageSize, CancellationToken ct)
=> _accessor.Api.BankStatementClient.List().ToPageAsync(page, pageSize, ct);
public Task BankStatementDetailAsync(int id, CancellationToken ct)
=> _accessor.Api.BankStatementClient.Detail(id).ToDetailAsync(ct);
public async Task CreateBankStatementAsync(BankStatementPostModel model, CancellationToken ct)
=> (await _accessor.Api.BankStatementClient.PostAsync(model, ct)).Unwrap();
public async Task UpdateBankStatementAsync(BankStatementPatchModel model, CancellationToken ct)
=> (await _accessor.Api.BankStatementClient.UpdateAsync(model, ct)).Unwrap();
public async Task DeleteBankStatementAsync(int id, CancellationToken ct)
=> (await _accessor.Api.BankStatementClient.DeleteAsync(id, ct)).Unwrap();
// ---- Issued document payments ----
public Task ListIssuedPaymentsAsync(int page, int pageSize, CancellationToken ct)
=> _accessor.Api.IssuedDocumentPaymentClient.List().ToPageAsync(page, pageSize, ct);
public Task IssuedPaymentDetailAsync(int id, CancellationToken ct)
=> _accessor.Api.IssuedDocumentPaymentClient.Detail(id).ToDetailAsync(ct);
public async Task IssuedPaymentDefaultAsync(int invoiceId, CancellationToken ct)
=> (await _accessor.Api.IssuedDocumentPaymentClient.DefaultAsync(invoiceId, ct)).Unwrap();
public async Task CreateIssuedPaymentAsync(IssuedDocumentPaymentPostModel model, CancellationToken ct)
=> (await _accessor.Api.IssuedDocumentPaymentClient.PostAsync(model, ct)).Unwrap();
public async Task DeleteIssuedPaymentAsync(int id, CancellationToken ct)
=> (await _accessor.Api.IssuedDocumentPaymentClient.DeleteAsync(id, ct)).Unwrap();
public async Task FullyUnpayIssuedAsync(int invoiceId, CancellationToken ct)
=> (await _accessor.Api.IssuedDocumentPaymentClient.FullyUnpayAsync(invoiceId, ct)).Unwrap();
// ---- Received document payments ----
public Task ListReceivedPaymentsAsync(int page, int pageSize, CancellationToken ct)
=> _accessor.Api.ReceivedDocumentPaymentsClient.List().ToPageAsync(page, pageSize, ct);
public Task ReceivedPaymentDetailAsync(int id, CancellationToken ct)
=> _accessor.Api.ReceivedDocumentPaymentsClient.Detail(id).ToDetailAsync(ct);
public async Task ReceivedPaymentDefaultAsync(int invoiceId, CancellationToken ct)
=> (await _accessor.Api.ReceivedDocumentPaymentsClient.DefaultAsync(invoiceId, ct)).Unwrap();
public async Task CreateReceivedPaymentAsync(ReceivedDocumentPaymentPostModel model, CancellationToken ct)
=> (await _accessor.Api.ReceivedDocumentPaymentsClient.PostAsync(model, ct)).Unwrap();
public async Task DeleteReceivedPaymentAsync(int id, CancellationToken ct)
=> (await _accessor.Api.ReceivedDocumentPaymentsClient.DeleteAsync(id, ct)).Unwrap();
public async Task FullyUnpayReceivedAsync(int invoiceId, CancellationToken ct)
=> (await _accessor.Api.ReceivedDocumentPaymentsClient.FullyUnpayAsync(invoiceId, ct)).Unwrap();
}