"""Market Data Pydantic & Dataclass Schemas."""
from __future__ import annotations

from dataclasses import dataclass
from decimal import Decimal
from typing import Optional


@dataclass
class Candle:
    symbol: str
    interval: str
    timestamp: int  # UTC millisecond timestamp
    open: Decimal
    high: Decimal
    low: Decimal
    close: Decimal
    volume: Decimal
    turnover: Optional[Decimal] = None
    is_closed: bool = True


@dataclass
class Ticker:
    symbol: str
    bid_price: Decimal
    ask_price: Decimal
    last_price: Decimal
    volume_24h: Decimal
    price_24h_pcnt: Decimal
    high_24h: Decimal
    low_24h: Decimal
    timestamp: int


@dataclass
class OrderBookLevel:
    price: Decimal
    size: Decimal


@dataclass
class OrderBook:
    symbol: str
    bids: list[OrderBookLevel]
    asks: list[OrderBookLevel]
    timestamp: int

    @property
    def spread(self) -> Decimal:
        if self.asks and self.bids:
            return self.asks[0].price - self.bids[0].price
        return Decimal("0")

    @property
    def mid_price(self) -> Decimal:
        if self.asks and self.bids:
            return (self.asks[0].price + self.bids[0].price) / Decimal("2")
        return Decimal("0")


@dataclass
class FundingRate:
    symbol: str
    funding_rate: Decimal
    funding_time: int
