namespace Application.Abstractions.Crypto;

public static class CryptoHubData
{
    // WebSocket Ticker 전체 필드
    public sealed record TickerData(
        string Market,
        string Symbol,
        decimal OpeningPrice,
        decimal HighPrice,
        decimal LowPrice,
        decimal TradePrice,
        decimal PrevClosingPrice,
        string Change,
        decimal ChangePrice,
        decimal SignedChangePrice,
        decimal ChangeRate,
        decimal SignedChangeRate,
        decimal TradeVolume,
        decimal AccTradeVolume,
        decimal AccTradeVolume24h,
        decimal AccTradePrice,
        decimal AccTradePrice24h,
        string TradeDate,
        string TradeTime,
        long TradeTimestamp,
        string AskBid,
        decimal AccAskVolume,
        decimal AccBidVolume,
        decimal Highest52WeekPrice,
        string Highest52WeekDate,
        decimal Lowest52WeekPrice,
        string Lowest52WeekDate,
        string MarketState,
        string? DelistingDate,
        string MarketWarning,
        long Timestamp,
        string StreamType
    );

    // WebSocket Trade 전체 필드
    public sealed record TradeData(
        string Market,
        string Symbol,
        decimal TradePrice,
        decimal TradeVolume,
        string AskBid,
        decimal PrevClosingPrice,
        string Change,
        decimal ChangePrice,
        string TradeDate,
        string TradeTime,
        long TradeTimestamp,
        long SequentialId,
        long Timestamp,
        string StreamType,
        decimal BestAskPrice,
        decimal BestAskSize,
        decimal BestBidPrice,
        decimal BestBidSize
    );

    // WebSocket Orderbook 전체 필드
    public sealed record OrderbookData(
        string Market,
        string Symbol,
        decimal TotalAskSize,
        decimal TotalBidSize,
        IReadOnlyList<OrderbookUnitData> Units,
        long Timestamp,
        decimal Level,
        string StreamType
    );

    public sealed record OrderbookUnitData(
        decimal AskPrice,
        decimal BidPrice,
        decimal AskSize,
        decimal BidSize
    );

    // WebSocket Candle 전체 필드
    public sealed record CandleData(
        string Market,
        string Symbol,
        string CandleDateTimeUtc,
        string CandleDateTimeKst,
        decimal OpeningPrice,
        decimal HighPrice,
        decimal LowPrice,
        decimal TradePrice,
        decimal CandleAccTradeVolume,
        decimal CandleAccTradePrice,
        long Timestamp,
        string StreamType
    );
}