using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using PolyTrader.Modules.Accounting.Models;
namespace PolyTrader.Modules.Accounting.Services
{
///
/// Unabhängige Polymarket-Activity-Quelle (Data-API /activity, ALLE Typen). Interface, damit die
/// Buchungslogik ohne Live-API testbar/offline lauffähig ist; die Live-Implementierung (Zielland)
/// mappt die reale API-JSON auf und speichert den Rohschnappschuss.
///
public interface IActivitySource
{
/// Activity ab (null = volle Historie/Backfill), paginiert.
Task> GetActivityAsync(string wallet, DateTime? since, CancellationToken ct);
}
/// On-Chain-USDC-Transfers des Safe-Wallets (ERC-20-Logs). Live-Impl über Alchemy (Zielland).
public interface ITransferSource
{
Task> GetTransfersAsync(string wallet, DateTime? since, CancellationToken ct);
}
/// On-Chain-USDC-Saldo als Balance-Anker (Soll-Ist). Live-Impl über GetUsdcBalanceAsync.
public interface IBalanceAnchorSource
{
Task GetBalanceAsync(string wallet, CancellationToken ct);
}
///
/// Offline-Stubs: das Modul läuft ohne Live-Anbindung vollständig (Ingest bucht dann korrekt nichts).
/// Im Zielland werden die echten Quellen registriert (Muster wie NullFarmingMarketSource).
///
public sealed class NullActivitySource : IActivitySource
{
public Task> GetActivityAsync(string wallet, DateTime? since, CancellationToken ct)
=> Task.FromResult((IReadOnlyList)Array.Empty());
}
public sealed class NullTransferSource : ITransferSource
{
public Task> GetTransfersAsync(string wallet, DateTime? since, CancellationToken ct)
=> Task.FromResult((IReadOnlyList)Array.Empty());
}
public sealed class NullBalanceAnchorSource : IBalanceAnchorSource
{
public Task GetBalanceAsync(string wallet, CancellationToken ct) => Task.FromResult((decimal?)null);
}
///
/// Whitelist der Polymarket-System-Contract-Adressen (lowercased). Transfers zu/von diesen Adressen
/// sind interne Trading-Bewegungen (bereits in der Activity), KEINE Ein-/Auszahlungen. Wird im
/// Zielland aus Config/Docs befüllt/verifiziert (CTF-Adresse liegt bereits im Core; Exchange/
/// NegRisk-Adapter/USDC ergänzen). Default leer → ohne Live-Transfers unkritisch.
///
public sealed class AccountingSystemContracts
{
public HashSet Addresses { get; } = new(StringComparer.OrdinalIgnoreCase);
public AccountingSystemContracts(IEnumerable? addresses = null)
{
if (addresses == null) return;
foreach (var a in addresses)
if (!string.IsNullOrWhiteSpace(a)) Addresses.Add(a.Trim().ToLowerInvariant());
}
}
}