using System;

namespace PolyTrader.Modules.Accounting.Models
{
    /// <summary>
    /// Normalisierte Polymarket-Activity-Position (Eingabe des Klassifikators). Die Live-Quelle
    /// (<c>IActivitySource</c>) mappt die tatsächliche API-JSON auf dieses Modell — so bleibt die
    /// pure Buchungslogik von der (im Zielland zu verifizierenden) API-Feldbenennung entkoppelt.
    /// </summary>
    public sealed class RawActivity
    {
        public string Type { get; init; } = string.Empty;   // TRADE/REDEEM/REWARD/FEE/SPLIT/MERGE/CONVERSION
        public string Side { get; init; } = string.Empty;   // BUY/SELL (bei TRADE)
        public DateTime Timestamp { get; init; }
        public string TxHash { get; init; } = string.Empty;
        public int LogIndex { get; init; }
        public string TokenId { get; init; } = string.Empty;
        public string MarketSlug { get; init; } = string.Empty;
        public string Outcome { get; init; } = string.Empty;
        public decimal Size { get; init; }                  // Shares
        public decimal Price { get; init; }                 // USDC je Share
        public decimal UsdcAmount { get; init; }            // Brutto-USDC des Ereignisses
        public decimal Fee { get; init; }
        public string RawJson { get; init; } = string.Empty;
    }

    /// <summary>
    /// Normalisierter On-Chain-USDC-Transfer des Safe-Wallets (Eingabe des Klassifikators). Die
    /// Live-Quelle liefert ERC-20-Transfer-Logs; die Klassifikation trennt interne Bewegungen
    /// (Safe ↔ Polymarket-System-Contracts, bereits in der Activity) von echten externen
    /// Ein-/Auszahlungen.
    /// </summary>
    public sealed class RawTransfer
    {
        public DateTime Timestamp { get; init; }
        public string TxHash { get; init; } = string.Empty;
        public int LogIndex { get; init; }
        public string FromAddress { get; init; } = string.Empty;
        public string ToAddress { get; init; } = string.Empty;
        public decimal UsdcAmount { get; init; }            // positiv
        public bool IsIncoming { get; init; }               // Ziel == unser Wallet
        public string RawJson { get; init; } = string.Empty;
    }
}
