using System.Collections.Generic;

namespace PolyTrader.Modules.CopyTrading.Logic
{
    /// <summary>
    /// Reine Trader-Intelligence-Logik (Phase 3): Kennzahlen dazu, was WIR mit einem Master
    /// verdient haben (Copy-PnL aus unseren geschlossenen Trades), plus die Auto-Pause-Entscheidung.
    /// Bewusst pur/testbar; die Datenbeschaffung (Filter SourceTraderId + Zeitfenster) macht der Job.
    /// </summary>
    public static class TraderScore
    {
        /// <summary>Sentinel für Profit-Faktor ohne jeden Verlust (sonst Division durch 0).</summary>
        public const decimal NoLossProfitFactor = 999m;

        public readonly record struct CopyMetrics(int TradeCount, decimal CopyPnl, decimal ProfitFactor, decimal AvgPnlPerTrade);

        /// <summary>
        /// Berechnet Copy-Kennzahlen aus den realisierten PnLs unserer Trades eines Masters
        /// (bereits gefiltert auf Master + Zeitfenster).
        /// </summary>
        public static CopyMetrics Compute(IEnumerable<decimal> realizedPnls)
        {
            int count = 0;
            decimal sum = 0m, grossProfit = 0m, grossLoss = 0m;

            foreach (var pnl in realizedPnls)
            {
                count++;
                sum += pnl;
                if (pnl > 0m) grossProfit += pnl;
                else if (pnl < 0m) grossLoss += -pnl;
            }

            decimal profitFactor =
                grossLoss > 0m ? grossProfit / grossLoss :
                grossProfit > 0m ? NoLossProfitFactor : 0m;

            decimal avg = count > 0 ? sum / count : 0m;
            return new CopyMetrics(count, sum, profitFactor, avg);
        }

        /// <summary>
        /// Auto-Pause-Kill-Switch (Phase 3.3): pausiert einen Master hart, wenn er über genügend
        /// Trades ins Minus läuft. Reaktivierung bewusst nur manuell (hier nicht abgebildet).
        /// </summary>
        /// <param name="autoPauseEnabled">Per-Master-Flag (Default an).</param>
        /// <param name="tradeCount">Anzahl Copy-Trades im Fenster.</param>
        /// <param name="copyPnl">Summierter Copy-PnL im Fenster.</param>
        /// <param name="minTrades">Mindestanzahl Trades, bevor pausiert wird (Rausch-Schutz).</param>
        /// <param name="drawdownThresholdUsd">Max. erlaubter Verlust (positiv); darunter → Pause.</param>
        public static bool ShouldAutoPause(bool autoPauseEnabled, int tradeCount, decimal copyPnl, int minTrades, decimal drawdownThresholdUsd)
        {
            if (!autoPauseEnabled) return false;
            if (tradeCount < minTrades) return false;
            return copyPnl <= -drawdownThresholdUsd;
        }
    }
}
