using System;

namespace PolyTrader.Modules.Supervisor.Counterfactual
{
    /// <summary>
    /// Counterfactual-Ergebnis (Tabelle sup_counterfactuals): Was wäre aus einem ABGELEHNTEN
    /// BUY-Signal geworden, wenn wir gekauft hätten? Wird nach Marktauflösung berechnet —
    /// die halbe Strategie-Kalibrierung: verhindern unsere Risk-Limits Verluste oder Gewinne?
    /// </summary>
    public class CounterfactualRecord
    {
        public long Id { get; set; }                     // DB-Autoincrement
        public DateTime CheckedAt { get; set; } = DateTime.UtcNow;

        /// <summary>Journal-Eintrag, auf den sich dieses Ergebnis bezieht (ein Ergebnis je Entscheidung).</summary>
        public long DecisionId { get; set; }
        public string SignalId { get; set; } = string.Empty;

        public string ModuleName { get; set; } = string.Empty;
        public int AccountId { get; set; }
        public string TokenId { get; set; } = string.Empty;
        public string MarketSlug { get; set; } = string.Empty;
        public string MarketQuestion { get; set; } = string.Empty;

        /// <summary>Ablehnungsgrund (ReasonCode als String) — die Auswertedimension.</summary>
        public string Reason { get; set; } = string.Empty;

        /// <summary>Signalpreis zum Ablehnungszeitpunkt (Einstieg, den wir NICHT genommen haben).</summary>
        public decimal SignalPrice { get; set; }

        public bool IsWinner { get; set; }

        /// <summary>Hypothetischer PnL je Share: Gewinner (1 − Preis), Verlierer (−Preis). Ohne Fees.</summary>
        public decimal HypotheticalPnlPerShare { get; set; }
    }

    /// <summary>Reine Rechenlogik (getestet): hypothetischer PnL je Share eines nicht genommenen BUYs.</summary>
    public static class CounterfactualMath
    {
        public static decimal PnlPerShare(decimal signalPrice, bool isWinner) =>
            isWinner ? 1m - signalPrice : -signalPrice;
    }
}
