using Orleans;
using static Managing.Common.Enums;

namespace Managing.Application.Abstractions.Models;

/// <summary>
/// Platform-wide statistics without individual agent details
/// </summary>
[GenerateSerializer]
public class PlatformSummaryViewModel
{
    /// <summary>
    /// Total number of agents on the platform
    /// </summary>
    [Id(0)]
    public required int TotalAgents { get; set; }
    
    /// <summary>
    /// Total number of active strategies across all agents
    /// </summary>
    [Id(1)]
    public required int TotalActiveStrategies { get; set; }
    
    /// <summary>
    /// Total platform-wide profit and loss in USD
    /// </summary>
    [Id(2)]
    public required decimal TotalPlatformPnL { get; set; }
    
    /// <summary>
    /// Total volume traded across all agents in USD
    /// </summary>
    [Id(3)]
    public required decimal TotalPlatformVolume { get; set; }
    
    /// <summary>
    /// Total volume traded across all agents in the last 24 hours in USD
    /// </summary>
    [Id(4)]
    public required decimal TotalPlatformVolumeLast24h { get; set; }
    
    /// <summary>
    /// Total open interest across all positions in USD
    /// </summary>
    [Id(5)]
    public required decimal TotalOpenInterest { get; set; }
    
    /// <summary>
    /// Total number of open positions across all strategies
    /// </summary>
    [Id(6)]
    public required int TotalPositionCount { get; set; }
    
    // 24-hour changes
    /// <summary>
    /// Change in agent count over the last 24 hours
    /// </summary>
    [Id(7)]
    public required int AgentsChange24h { get; set; }
    
    /// <summary>
    /// Change in strategy count over the last 24 hours
    /// </summary>
    [Id(8)]
    public required int StrategiesChange24h { get; set; }
    
    /// <summary>
    /// Change in PnL over the last 24 hours
    /// </summary>
    [Id(9)]
    public required decimal PnLChange24h { get; set; }
    
    /// <summary>
    /// Change in volume over the last 24 hours
    /// </summary>
    [Id(10)]
    public required decimal VolumeChange24h { get; set; }
    
    /// <summary>
    /// Change in open interest over the last 24 hours
    /// </summary>
    [Id(11)]
    public required decimal OpenInterestChange24h { get; set; }
    
    /// <summary>
    /// Change in position count over the last 24 hours
    /// </summary>
    [Id(12)]
    public required int PositionCountChange24h { get; set; }
    
    // Breakdowns
    /// <summary>
    /// Volume breakdown by asset/ticker
    /// </summary>
    [Id(13)]
    public required Dictionary<Ticker, decimal> VolumeByAsset { get; set; }
    
    /// <summary>
    /// Position count breakdown by asset/ticker
    /// </summary>
    [Id(14)]
    public required Dictionary<Ticker, int> PositionCountByAsset { get; set; }
    
    /// <summary>
    /// Position count breakdown by direction (Long/Short)
    /// </summary>
    [Id(15)]
    public required Dictionary<TradeDirection, int> PositionCountByDirection { get; set; }
    
    // Metadata
    /// <summary>
    /// When the data was last updated
    /// </summary>
    [Id(16)]
    public required DateTime LastUpdated { get; set; }
    
    /// <summary>
    /// When the last 24-hour snapshot was taken
    /// </summary>
    [Id(17)]
    public required DateTime Last24HourSnapshot { get; set; }
    
    /// <summary>
    /// Daily volume history for the last 30 days for chart visualization
    /// </summary>
    [Id(18)]
    public required List<VolumeHistoryPoint> VolumeHistory { get; set; }
}

/// <summary>
/// Represents a volume data point for historical charting
/// </summary>
[GenerateSerializer]
public class VolumeHistoryPoint
{
    /// <summary>
    /// Date of the volume measurement
    /// </summary>
    [Id(0)]
    public required DateTime Date { get; set; }
    
    /// <summary>
    /// Total volume for that date in USD
    /// </summary>
    [Id(1)]
    public required decimal Volume { get; set; }
}
