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, }; }