namespace PolyTrader.Modules.CopyTrading.Logic
{
    /// <summary>
    /// Reine, geldkritische Trade-Mathematik (realisierter PnL, PnL-%, gewichteter
    /// Einstiegspreis). Aus der Engine herausgezogen, damit diese Rechnungen fest
    /// unit-getestet sind – Rundungs-/Vorzeichenfehler hier verfälschen direkt PnL und
    /// Kontostand. Verhalten 1:1 aus der Engine übernommen (mit defensivem Null-Guard).
    /// </summary>
    public static class TradeMath
    {
        /// <summary>Erlös eines Verkaufs: Anzahl Shares × Verkaufspreis.</summary>
        public static decimal ExitValue(decimal sizeShares, decimal exitPrice) => sizeShares * exitPrice;

        /// <summary>Realisierter Gewinn/Verlust = Erlös − eingesetztes Kapital.</summary>
        public static decimal RealizedPnl(decimal sizeShares, decimal exitPrice, decimal entryAmountUsd) =>
            ExitValue(sizeShares, exitPrice) - entryAmountUsd;

        /// <summary>PnL in Prozent des eingesetzten Kapitals; 0, wenn kein Kapital eingesetzt war.</summary>
        public static decimal PnlPercent(decimal realizedPnl, decimal entryAmountUsd) =>
            entryAmountUsd > 0m ? realizedPnl / entryAmountUsd * 100m : 0m;

        /// <summary>
        /// Gewichteter Durchschnitts-Einstiegspreis nach Aufstockung einer Position:
        /// Gesamt-USDC / Gesamt-Shares. Bei Size ≤ 0 wird 0 zurückgegeben (Div-durch-0-Schutz).
        /// </summary>
        public static decimal WeightedAverageEntryPrice(decimal totalAmountUsd, decimal totalSize) =>
            totalSize > 0m ? totalAmountUsd / totalSize : 0m;
    }
}
