using System;

namespace PolyTrader.Modules.Accounting.Models
{
    /// <summary>
    /// Buchungssatz-Typ im neutralen Ledger. Als String persistiert (erweiterbar). Deckt die
    /// Polymarket-Activity-Typen und die On-Chain-Ein-/Auszahlungen ab.
    /// </summary>
    public enum LedgerEventType
    {
        TradeBuy,     // Kauf-Fill: Cash raus (Kosten + Fee)
        TradeSell,    // Verkauf-Fill: Cash rein (Erlös − Fee)
        Redeem,       // Resolution-Auszahlung (Gewinner-Shares → USDC)
        Reward,       // Liquidity-Reward / Maker-Rebate (Einnahme)
        Fee,          // eigenständige Gebühr (Ausgabe)
        Split,        // CTF-Split (geldneutral, bestandsrelevant)
        Merge,        // CTF-Merge (geldneutral)
        Conversion,   // NegRisk-Conversion (geldneutral)
        Deposit,      // externe USDC-Einzahlung ins Wallet (Cash rein)
        Withdrawal,   // externe USDC-Auszahlung aus dem Wallet (Cash raus)
        Other         // unbekannter Typ – roh erfasst, geldneutral bis geklärt
    }

    /// <summary>
    /// Unveränderlicher, normalisierter Buchungssatz (Tabelle acc_ledger). Buchungsgrundlage ist
    /// AUSSCHLIESSLICH die unabhängige Polymarket-/On-Chain-Quelle (nie unsere Trading-DB).
    /// Jeder Satz führt über TxHash/LogIndex und den <see cref="IdempotencyKey"/> auf einen prüfbaren
    /// Nachweis zurück; überlappende Abrufe buchen dank des Unique-Keys nicht doppelt.
    /// Vorzeichenkonvention: <see cref="NetUsdc"/> = Cash-Wirkung auf das Konto (+ Zufluss / − Abfluss).
    /// </summary>
    public class LedgerEntry
    {
        public long Id { get; set; }                       // Autoincrement-PK
        public int AccountId { get; set; }
        public LedgerEventType EventType { get; set; }
        public DateTime Timestamp { get; set; }            // Ereigniszeit (UTC)

        public string TokenId { get; set; } = string.Empty;
        public string MarketSlug { get; set; } = string.Empty;
        public string Outcome { get; set; } = string.Empty;
        public string Side { get; set; } = string.Empty;   // BUY/SELL bei Trades

        public decimal Size { get; set; }                  // Shares
        public decimal PriceUsdc { get; set; }             // USDC je Share
        public decimal GrossUsdc { get; set; }             // absolute Bruttobewegung
        public decimal FeeUsdc { get; set; }
        public decimal NetUsdc { get; set; }               // signierte Cash-Wirkung (+/−)

        public string TxHash { get; set; } = string.Empty;
        public int LogIndex { get; set; }
        public string Source { get; set; } = string.Empty; // "polymarket-activity" / "onchain-transfer"

        public long IngestBatchId { get; set; }            // = IngestRun.Id
        public DateTime IngestedAt { get; set; } = DateTime.UtcNow;

        /// <summary>Stabiler Idempotenz-Schlüssel (unique). Gleiches Ereignis ⇒ gleicher Schlüssel.</summary>
        public string IdempotencyKey { get; set; } = string.Empty;
    }
}
