using System.ComponentModel;

namespace PolyTrader.Modules.ResolutionFarming.Models
{
    /// <summary>
    /// Modul-Settings je Account (Tabelle rf_settings). Steuert Marktauswahl, Risiko-Limits und
    /// Ausführung des ResolutionFarming. Defaults sind konservativ (Plan Abschnitt 2.2/5).
    /// </summary>
    public class RfSettings
    {
        [Browsable(false)]
        public int AccountId { get; set; }

        [Category("01. Aktivierung")]
        [DisplayName("Modul aktiv")]
        [Description("Schaltet das ResolutionFarming für diesen Account scharf. Bei false wird nur gescannt (read-only).")]
        public bool Enabled { get; set; } = false;

        // ----- Marktauswahl -----

        [Category("02. Marktauswahl")]
        [DisplayName("Min. Preis (0–1)")]
        [Description("Unteres Ende des Favoriten-Preisbands. Nur Favoriten mit Ask >= diesem Wert werden gehandelt. Default 0.90.")]
        public decimal MinPrice { get; set; } = 0.90m;

        [Category("02. Marktauswahl")]
        [DisplayName("Max. Preis (0–1)")]
        [Description("Oberes Ende des Preisbands. Über diesem Ask ist die Marge zu klein. Default 0.98.")]
        public decimal MaxPrice { get; set; } = 0.98m;

        [Category("02. Marktauswahl")]
        [DisplayName("Max. Stunden bis Auflösung")]
        [Description("Nur Märkte, die innerhalb dieses Fensters auflösen, werden gescannt (Kapitalbindung begrenzen). Default 48 h.")]
        public int MaxHoursToResolution { get; set; } = 48;

        [Category("02. Marktauswahl")]
        [DisplayName("Kategorie-Whitelist (CSV)")]
        [Description("Nur diese Markt-Kategorien handeln (Komma-getrennt). Krypto bewusst ausgeschlossen (1,8 % Fee frisst die Marge). Default: Sports,Politics,Geopolitics.")]
        public string CategoryWhitelistCsv { get; set; } = "Sports,Politics,Geopolitics";

        [Category("02. Marktauswahl")]
        [DisplayName("Blacklist Slugs/Tags (CSV)")]
        [Description("Marktarten mit Resolution-Streitigkeiten (UMA-Disputes) o.ä. ausschließen. Teil-Match auf Slug/Tags.")]
        public string BlacklistCsv { get; set; } = "";

        // ----- Risiko -----

        [Category("03. Risiko")]
        [DisplayName("Min. Netto-Edge (%)")]
        [Description("Mindest-Netto-Edge NACH Fees: (1 − Ask) − Fee(Ask,Kategorie) >= dieser Wert. Default 1.5 %.")]
        public decimal MinEdgePct { get; set; } = 1.5m;

        [Category("03. Risiko")]
        [DisplayName("Max. Einsatz je Markt (USDC)")]
        [Description("Obergrenze des Einsatzes in einem einzelnen Markt. Default 25.")]
        public decimal MaxPerMarketUsd { get; set; } = 25m;

        [Category("03. Risiko")]
        [DisplayName("Max. Anteil je Cluster (%)")]
        [Description("Max. Anteil der Bankroll je Ereignis-Cluster (z. B. ein Spieltag). Korrelierte Favoriten teilen einen Cluster. Default 10 %.")]
        public decimal MaxPerClusterPct { get; set; } = 10m;

        [Category("03. Risiko")]
        [DisplayName("Max. Gesamt-Exposure (%)")]
        [Description("Max. Anteil der Bankroll gleichzeitig in offenen Positionen. Default 60 %.")]
        public decimal MaxTotalExposurePct { get; set; } = 60m;

        [Category("03. Risiko")]
        [DisplayName("Max. neue Positionen/Tag")]
        [Description("Drosselung der Neu-Einstiege pro Tag. Default 20.")]
        public int MaxNewPositionsPerDay { get; set; } = 20;

        [Category("03. Risiko")]
        [DisplayName("Tagesverlust-Kill-Switch (USDC)")]
        [Description("Überschreitet der realisierte Tagesverlust diesen Betrag, pausiert das Modul + Warnmeldung. 0 = deaktiviert.")]
        public decimal DailyLossKillSwitchUsd { get; set; } = 0m;

        // ----- Ausführung -----

        [Category("04. Ausführung")]
        [DisplayName("Maker-Fill-Timeout (Min.)")]
        [Description("Ruht der Maker-Einstieg (GTC-Limit, 0 Fees) so lange ohne Fill, greift die Taker-Fallback-Entscheidung. Default 15.")]
        public int MakerFillTimeoutMinutes { get; set; } = 15;

        [Category("04. Ausführung")]
        [DisplayName("Taker-Fallback erlauben")]
        [Description("Wenn true: nach Maker-Timeout per Taker füllen, sofern der Netto-Edge AUCH mit Taker-Fee noch >= Min-Edge ist. Wenn false: strikt Maker-only.")]
        public bool AllowTakerFallback { get; set; } = true;
    }
}
