using System;
using System.ComponentModel;
using System.Collections.Generic;

namespace PolyTraderSharp.Models
{
    /// <summary>
    /// Ein überwachter Master-Trader, dessen Trades kopiert werden. Neben Identifikation und
    /// Statistik enthält er per-Master-Verhaltenseinstellungen (Auto-Pause, Maker-Einstieg).
    /// Die [Description]-Attribute erscheinen im PropertyGrid als Erklärung.
    /// </summary>
    public class TrackedTrader
    {
        [Browsable(false)]
        public int Id { get; set; }

        [Category("01. Identification")]
        [DisplayName("Wallet-Adresse")]
        [Description("Polygon-Wallet des Master-Traders. Diese Adresse wird on-chain (Alchemy-WSS) auf Käufe/Verkäufe überwacht.")]
        public string WalletAddress { get; set; } = string.Empty;

        [Category("01. Identification")]
        [DisplayName("Anzeigename")]
        [Description("Frei wählbarer Name zur Wiedererkennung in UI und Logs.")]
        public string DisplayName { get; set; } = string.Empty;

        [Category("02. Categorization")]
        [DisplayName("Kategorie")]
        [Description("Einordnung des Master-Typs (z. B. HF, INSIDER, SNIPER, HOLDER). Beeinflusst teils das Verhalten " +
                     "(z. B. engere SELL-Limits für 'HF'). Frei setzbar; für Verhaltensregeln bitte konsistente Werte verwenden.")]
        public string Category { get; set; } = "NEW_BIG_BET";

        [Category("02. Categorization")]
        [DisplayName("Beschreibung")]
        [Description("Freitext-Notiz zum Master (z. B. Herkunft, beobachtete Stärken/Schwächen).")]
        public string Description { get; set; } = string.Empty;

        [Category("02. Categorization")]
        [DisplayName("Begründung / Reasoning")]
        [Description("Warum kopieren wir diesen Master? Wird auch vom Auto-Kill-Switch mit Zeitstempel befüllt, wenn er " +
                     "automatisch pausiert wird (Phase 3.3).")]
        public string Reasoning { get; set; } = string.Empty;

        [Category("03. General")]
        [DisplayName("Aktiv")]
        [Description("Nur aktive Master werden kopiert und on-chain überwacht. Wird bei ausgelöster Auto-Pause automatisch " +
                     "auf 'false' gesetzt; Reaktivierung erfolgt bewusst nur manuell.")]
        public bool IsActive { get; set; } = true;

        [Category("03. General")]
        [DisplayName("Ausgeblendet")]
        [Description("Blendet den Master in der Standard-Ansicht aus, ohne ihn zu löschen (Archiv). Kopiert wird trotzdem nur, " +
                     "wenn 'Aktiv' gesetzt ist.")]
        public bool IsHidden { get; set; } = false;

        [Category("05. Copytrading-Verhalten")]
        [DisplayName("Auto-Pause aktiv")]
        [Description("Kill-Switch für diesen Master: Läuft die Copy-Performance der letzten Trades unter die Schwelle, wird der " +
                     "Master automatisch deaktiviert (Aktiv = false) samt Benachrichtigung, damit nachts nicht weiter Verlust " +
                     "aufläuft. STANDARDMÄSSIG AN; für einzelne Master bewusst abschaltbar, wenn du trotz Schwäche dranbleiben " +
                     "willst. Reaktivierung immer manuell. (Auslöse-Logik: Phase 3.3.)")]
        public bool AutoPauseEnabled { get; set; } = true;

        [Category("05. Copytrading-Verhalten")]
        [DisplayName("Maker-Einstieg")]
        [Description("Wenn aktiv, werden BUYs als GTC-Limit AUF dem Best-Bid platziert (Maker) statt teuer über dem Ask (Taker). " +
                     "Sinnvoll für langsame Master (Haltedauer Stunden/Tage): spart Taker-Fees und Spread. Kein Fill nach der " +
                     "konfigurierten Zeit → Eskalation auf Taker oder Verwerfen. (Ausführungs-Logik: Phase 4.)")]
        public bool MakerEntry { get; set; } = false;

        // Stats
        [Category("04. Statistics")]
        [ReadOnly(true)]
        [DisplayName("Trades (7 Tage)")]
        [Description("Anzahl der vom Analytics-Job erfassten Master-Trades der letzten 7 Tage (Kennzahl, kein Einstellwert).")]
        public int TotalTrades { get; set; } = 0;

        [Category("04. Statistics")]
        [ReadOnly(true)]
        [DisplayName("Gewinner-Trades")]
        [Description("Anzahl profitabler Master-Trades im Auswertungsfenster (Kennzahl).")]
        public int WinningTrades { get; set; } = 0;

        [Category("04. Statistics")]
        [ReadOnly(true)]
        [DisplayName("Winrate (%)")]
        [Description("Anteil profitabler Trades. ACHTUNG: allein irreführend – Favoriten-Käufer haben hohe Winrate und können " +
                     "trotzdem negativ sein. Profit-Faktor/Ø-PnL sind aussagekräftiger (Phase 3).")]
        public double Winrate30t { get; set; } = 0.0;

        [Category("04. Statistics")]
        [ReadOnly(true)]
        [DisplayName("PnL (7 Tage)")]
        [Description("Realisierter Gewinn/Verlust des MASTERS im Fenster (nicht unser Copy-Ergebnis).")]
        public double TotalPnl { get; set; } = 0.0;

        // --- Copy-Score (Phase 3): was WIR mit diesem Master verdient haben, letzte 30 Tage ---

        [Category("05. Copy-Score (30 Tage)")]
        [ReadOnly(true)]
        [DisplayName("Copy-PnL (30T)")]
        [Description("Summierter realisierter Gewinn/Verlust UNSERER kopierten Trades dieses Masters der letzten 30 Tage (inkl. unserer Slippage/Fees). Primäre Rentabilitätskennzahl – aussagekräftiger als die Master-eigene Winrate.")]
        public decimal CopyPnl30d { get; set; }

        [Category("05. Copy-Score (30 Tage)")]
        [ReadOnly(true)]
        [DisplayName("Profit-Faktor (30T)")]
        [Description("Bruttogewinn / Bruttoverlust unserer Copy-Trades (30T). > 1 = profitabel, < 1 = Verlust. 999 = bisher kein Verlust. Robuster als die reine Winrate.")]
        public decimal CopyProfitFactor { get; set; }

        [Category("05. Copy-Score (30 Tage)")]
        [ReadOnly(true)]
        [DisplayName("Ø PnL/Trade (30T)")]
        [Description("Durchschnittlicher Copy-PnL pro Trade (30T). Negativ = dieser Master kostet uns im Schnitt Geld.")]
        public decimal CopyAvgPnlPerTrade { get; set; }

        [Category("05. Copy-Score (30 Tage)")]
        [ReadOnly(true)]
        [DisplayName("Copy-Trades (30T)")]
        [Description("Anzahl unserer geschlossenen Copy-Trades dieses Masters in den letzten 30 Tagen (Stichprobengröße für die obigen Kennzahlen).")]
        public int CopyTradeCount30d { get; set; }

        [Browsable(false)]
        public HashSet<int> AssignedAccountIds { get; set; } = new();
    }
}
