using System.ComponentModel;

namespace PolyTraderSharp.Models
{
    /// <summary>
    /// Copytrading-spezifische Detail-Einstellungen je Account (Investment-/Zeit-Limits).
    /// Bewusst getrennt vom Core-<see cref="AccountState"/> (allgemeine Account-Daten):
    /// Diese Werte gehören dem Copytrading-Modul und werden im Modul-View bearbeitet.
    /// Persistiert in Tabelle "mod_copytrading_account_settings" (Key = AccountId).
    ///
    /// Die [Description]-Attribute erscheinen im PropertyGrid als Erklärung – bitte bei
    /// jeder Verhaltensänderung mitpflegen, damit die Bedeutung nachvollziehbar bleibt.
    /// </summary>
    public class CopyTradingAccountSettings
    {
        [Browsable(false)]
        public int AccountId { get; set; }

        [Category("01. Risk Management")]
        [DisplayName("Limit pro Markt (%)")]
        [Description("Maximaler Einsatz in EINEN einzelnen Markt, als Prozent des Account-Guthabens (TotalBalance). " +
                     "Beispiel: 5 = höchstens 5 % des Guthabens in einem Markt. Begrenzt das Klumpenrisiko pro Markt.")]
        public decimal PerMarketLimit { get; set; } = 5.0m;

        [Category("01. Risk Management")]
        [DisplayName("Limit pro Master (%)")]
        [Description("Maximaler gleichzeitiger Gesamteinsatz in Trades EINES Master-Traders, als Prozent des Guthabens. " +
                     "Beispiel: 10 = höchstens 10 % des Guthabens gleichzeitig einem Master folgen. Begrenzt den Schaden, " +
                     "wenn ein einzelner Master schlecht läuft.")]
        public decimal PerMasterLimit { get; set; } = 10.0m;

        [Category("01. Risk Management")]
        [DisplayName("Max. Kaufpreis (0–1)")]
        [Description("Absolute Preis-Obergrenze pro Share auf der 0–1-Skala (1.00 = 100 ¢). Kauf wird übersprungen, wenn der " +
                     "Master über diesem Preis kauft; zusätzlich wird unser Limitpreis hierauf gedeckelt. " +
                     "Beispiel: 0.98 = nichts über 98 ¢ kaufen (nahe 1.00 ist das Aufwärtspotenzial gering, das Risiko asymmetrisch). " +
                     "WICHTIG: Wert IMMER auf der 0–1-Skala angeben. Migrierte Alt-Werte auf Cent-Skala (z. B. 98.0) wurden auf " +
                     "0.98 korrigiert – ein Wert > 1 hätte den Deckel nie greifen lassen (Vergleich erfolgt gegen den 0–1-Preis).")]
        public decimal MaxBuyPrice { get; set; } = 0.98m;

        [Category("01. Risk Management")]
        [DisplayName("Max. Preisaufschlag BUY (%)")]
        [Description("Wie viel Prozent ÜBER dem Einstiegspreis des Masters wir beim BUY maximal limitieren, um einen Fill zu " +
                     "bekommen (gedeckelt durch 'Max. Kaufpreis'). Beispiel: 2 = unser Limit liegt 2 % über dem Master-Preis. " +
                     "Höher = mehr/schnellere Fills, aber schlechtere Einstiegspreise (mehr Slippage).")]
        public decimal MaxPriceDifference { get; set; } = 2.0m;

        [Category("02. Time Limits (Exposure nach Restlaufzeit)")]
        [DisplayName("Limit < 6h Restlaufzeit (%)")]
        [Description("Exposure-Deckel für Märkte, die in WENIGER als 6 Stunden auflaufen (Zeit bis Marktschluss), als Prozent " +
                     "des Guthabens. Die Summe aller offenen Positionen in dieser Zeitklasse darf diesen Anteil nicht übersteigen. " +
                     "Schnell auflaufende Märkte sind binärer/riskanter – daher meist niedriger.")]
        public decimal perMaxTime6h { get; set; } = 20.0m;

        [Category("02. Time Limits (Exposure nach Restlaufzeit)")]
        [DisplayName("Limit 6–24h Restlaufzeit (%)")]
        [Description("Exposure-Deckel für Märkte, die in 6 bis 24 Stunden auflaufen, als Prozent des Guthabens.")]
        public decimal perMaxTime24h { get; set; } = 20.0m;

        [Category("02. Time Limits (Exposure nach Restlaufzeit)")]
        [DisplayName("Limit 24–72h Restlaufzeit (%)")]
        [Description("Exposure-Deckel für Märkte, die in 24 bis 72 Stunden auflaufen, als Prozent des Guthabens.")]
        public decimal perMaxTime72h { get; set; } = 20.0m;

        [Category("02. Time Limits (Exposure nach Restlaufzeit)")]
        [DisplayName("Limit > 72h / kein Enddatum (%)")]
        [Description("Exposure-Deckel für Märkte, die in MEHR als 72 Stunden auflaufen oder kein Enddatum haben, als Prozent " +
                     "des Guthabens. Meist höher, da mehr Zeit zur Erholung bleibt.")]
        public decimal perMaxTimeNone { get; set; } = 40.0m;

        [Category("03. Exit / Take-Profit")]
        [DisplayName("Take-Profit (% Gewinn)")]
        [Description("Take-Profit-Schwelle in Prozent Gewinn: erreicht der aktuelle Preis >= Einstiegspreis × (1 + Wert/100), " +
                     "wird über die SELL-Eskalationsleiter verkauft (IMPLEMENTIERT). Default 9999 = praktisch deaktiviert – " +
                     "bewusst dormant, bis pro Master scharf geschaltet. Ein niedriger Wert (z. B. 50) aktiviert den Take-Profit.")]
        public decimal ProfitTarget { get; set; } = 9999m;

        [Category("03. Exit / Take-Profit")]
        [DisplayName("Pre-Redeem-Schwelle (0–1)")]
        [Description("Auto-Redeem: erreicht der Marktpreis diesen Wert, wird die Position vorzeitig glattgestellt (near-resolution, " +
                     "spart das Warten bis zur Auflösung). 0 = deaktiviert. WICHTIG: Der Code vergleicht gegen den 0–1-Preis " +
                     "(z. B. 0.995 = 99,5 ¢). Migrierte Alt-Werte wie 99.5 triggern NIE und sollten auf z. B. 0.995 korrigiert werden.")]
        public decimal PreRedeemLimit { get; set; } = 0.0m;

        [Category("03. Exit / Take-Profit")]
        [DisplayName("SELL-Floor (%)")]
        [Description("Untergrenze der SELL-Eskalationsleiter: absoluter Mindest-Verkaufspreis = Master-Exit-Preis × (1 − Wert/100). " +
                     "Unterhalb wird NICHT mehr verkauft, sondern die Position gehalten + Benachrichtigung. Schützt davor, in ein " +
                     "leergeräumtes Orderbuch als 'Exit-Liquidity' zu verkaufen. IMPLEMENTIERT (SellLadderService).")]
        public decimal SellFloorPct { get; set; } = 15.0m;

        [Category("04. Orderbuch / Ausführung")]
        [DisplayName("Max. Spread BUY (%)  [Phase 1.3]")]
        [Description("Pre-Trade-Orderbuch-Check: ist der Spread (Ask − Bid) breiter als dieser Prozentsatz, wird der BUY " +
                     "übersprungen (illiquider/riskanter Markt, Sniping-Verdacht). NOCH NICHT VERDRAHTET (Phase 1.3).")]
        public decimal MaxSpreadPct { get; set; } = 5.0m;

        [Category("04. Orderbuch / Ausführung")]
        [DisplayName("Min. Verkaufsquote (%)  [Phase 2]")]
        [Description("Mindest-Verkaufsquote des Masters, ab der wir einen Teilverkauf spiegeln. Verkäufe unter dieser Quote gelten " +
                     "als Rauschen (Day-Trader-Zappeln) und werden ignoriert. NOCH NICHT VERDRAHTET (Phase 2).")]
        public decimal MinSellRatioPct { get; set; } = 10.0m;
    }
}
