using System;
using Avalonia.Media;
using PolyTrader.App.Avalonia.Shell;
using PolyTrader.Modules.CopyTrading.Logic;

namespace PolyTrader.App.Avalonia.ViewModels
{
    /// <summary>
    /// Farbpalette zu den <see cref="TradeRowTint"/>-Kategorien. Die Schwellenlogik liegt
    /// (getestet) in <see cref="TradeRowColoring"/>; hier steht nur, wie die Kategorien aussehen.
    ///
    /// <para>Die Farben kommen aus den Themen-Ressourcen und werden bei JEDEM Zugriff aufgelöst –
    /// deshalb Eigenschaften statt <c>static readonly</c>. Nach einem Themenwechsel liefern sie
    /// sofort die passende Variante; im hellen Schema die Pastelltöne der bisherigen Oberfläche,
    /// im dunklen gedämpfte Entsprechungen (helle Pastelltöne würden dort blenden).</para>
    /// </summary>
    public static class TradeRowPalette
    {
        public static IBrush Loss => ThemeManager.Brush("AppTradeLossBrush");
        public static IBrush SmallWin => ThemeManager.Brush("AppTradeSmallWinBrush");
        public static IBrush BigWin => ThemeManager.Brush("AppTradeBigWinBrush");

        public static IBrush ForPnlPercent(decimal pnlPercent) => TradeRowColoring.ForPnlPercent(pnlPercent) switch
        {
            TradeRowTint.Loss => Loss,
            TradeRowTint.BigWin => BigWin,
            _ => SmallWin
        };
    }

    /// <summary>Zeile des Grids „Offene Trades" (aufgeloester Kontoname + Zeilenfarbe).</summary>
    public sealed class CopyOpenTradeRow
    {
        public string Account { get; init; } = string.Empty;
        public string Trader { get; init; } = string.Empty;
        public string Market { get; init; } = string.Empty;
        public string Outcome { get; init; } = string.Empty;
        public string Side { get; init; } = string.Empty;
        public decimal Entry { get; init; }
        public decimal Current { get; init; }
        public decimal Size { get; init; }
        public decimal Amount { get; init; }
        public decimal Value { get; init; }
        public decimal Unrealized { get; init; }
        public decimal UnrealizedPct { get; init; }
        public string Status { get; init; } = string.Empty;

        /// <summary>Zeilenhintergrund nach Buchgewinn – wie zuvor die DataBindingComplete-Färbung.</summary>
        public IBrush RowBrush => TradeRowPalette.ForPnlPercent(UnrealizedPct);
    }

    /// <summary>
    /// Zeile des Grids „Geschlossene Trades". Bewusst eigener Typ und nicht das Modell
    /// <c>PolyTraderSharp.Models.ClosedTradeRow</c>: hier stehen der aufgeloeste Master-Trader-Name
    /// und die Zeilenfarbe, die es dort nicht gibt.
    /// </summary>
    public sealed class CopyClosedTradeRow
    {
        public int TradeId { get; init; }
        public string Account { get; init; } = string.Empty;
        public string Trader { get; init; } = string.Empty;
        public string Market { get; init; } = string.Empty;
        public string Outcome { get; init; } = string.Empty;
        public string Side { get; init; } = string.Empty;
        public decimal Entry { get; init; }
        public decimal Exit { get; init; }
        public decimal Size { get; init; }
        public decimal Pnl { get; init; }
        public decimal PnlPercent { get; init; }
        public DateTime OpenedAt { get; init; }
        public DateTime ClosedAt { get; init; }

        public IBrush RowBrush => TradeRowPalette.ForPnlPercent(PnlPercent);
    }

    /// <summary>Eintrag der Account-Zuweisung eines Master-Traders (Mehrfachauswahl).</summary>
    public sealed class AccountAssignment
    {
        public int AccountId { get; init; }
        public string Label { get; init; } = string.Empty;
        public bool IsAssigned { get; set; }
    }
}
