using System.Text.Json.Nodes;
using Csob.Client;
namespace Csob.Services;
/// AISP – account information (accounts, balance, transactions, standing orders, direct debits).
public sealed class AccountsService
{
private readonly CsobApiAccessor _accessor;
public AccountsService(CsobApiAccessor accessor) => _accessor = accessor;
public Task ListAsync(int? page, int? size, string? sort, string? order, CancellationToken ct)
=> _accessor.Client.GetAsync(CsobApiPaths.Accounts, Paging(page, size, sort, order), ct);
public Task BalanceAsync(string accountId, string? currency, CancellationToken ct)
=> _accessor.Client.GetAsync(CsobApiPaths.Balance(accountId),
new Dictionary { ["currency"] = currency }, ct);
public Task TransactionsAsync(string accountId, TransactionQuery query, CancellationToken ct)
=> _accessor.Client.GetAsync(CsobApiPaths.Transactions(accountId), query.ToDictionary(), ct);
public Task AwaitingTransactionsAsync(string accountId, int? page, int? size, CancellationToken ct)
=> _accessor.Client.GetAsync(CsobApiPaths.AwaitingTransactions(accountId), Paging(page, size, null, null), ct);
public Task StandingOrdersAsync(string accountId, int? page, int? size, CancellationToken ct)
=> _accessor.Client.GetAsync(CsobApiPaths.AccountStandingOrders(accountId), Paging(page, size, null, null), ct);
public Task StandingOrderDetailAsync(string accountId, string standingOrderId, CancellationToken ct)
=> _accessor.Client.GetAsync(CsobApiPaths.AccountStandingOrder(accountId, standingOrderId), null, ct);
public Task DirectDebitsAsync(string accountId, int? page, int? size, CancellationToken ct)
=> _accessor.Client.GetAsync(CsobApiPaths.AccountDirectDebits(accountId), Paging(page, size, null, null), ct);
private static Dictionary Paging(int? page, int? size, string? sort, string? order) => new()
{
["page"] = page?.ToString(),
["size"] = size?.ToString(),
["sort"] = sort,
["order"] = order,
};
}
/// Optional filters for the transactions listing (forwarded as query parameters).
public sealed class TransactionQuery
{
public int? Page { get; set; }
public int? Size { get; set; }
public string? Sort { get; set; }
public string? Order { get; set; }
/// ISO date (YYYY-MM-DD) lower bound.
public string? DateFrom { get; set; }
/// ISO date (YYYY-MM-DD) upper bound.
public string? DateTo { get; set; }
public Dictionary ToDictionary() => new()
{
["page"] = Page?.ToString(),
["size"] = Size?.ToString(),
["sort"] = Sort,
["order"] = Order,
["dateFrom"] = DateFrom,
["dateTo"] = DateTo,
};
}