from dataclasses import dataclass
from datetime import datetime
from typing import List, Optional


@dataclass
class P2POrder:
    """P2P Order model for Binance C2C trades"""
    
    order_id: str
    merchant_id: str
    merchant_name: str
    asset: str  # USDT, USDC, BTC, ETH
    fiat: str   # RUB, USD, EUR
    price: float
    available_amount: float
    min_single_trans_amount: float
    max_single_trans_amount: float
    trade_type: str  # BUY/SELL
    payment_methods: List[str]
    completion_rate: float
    orders_completed: int
    is_merchant: bool
    timestamp: Optional[datetime] = None
    
    def __post_init__(self):
        if self.timestamp is None:
            self.timestamp = datetime.now()
    



@dataclass
class OrderBookSnapshot:
    """Snapshot of P2P orderbook for specific asset"""
    
    asset: str
    fiat: str
    trade_type: str
    timestamp: float
    orders: List[P2POrder]
    
    @property
    def merchant_count(self) -> int:
        return len(set(order.merchant_id for order in self.orders))
    
    @property
    def total_volume(self) -> float:
        return sum(order.available_amount for order in self.orders)
    
    @property
    def average_price(self) -> float:
        if not self.orders:
            return 0.0
        return sum(order.price for order in self.orders) / len(self.orders)
    
    @property
    def best_price(self) -> float:
        if not self.orders:
            return 0.0
        if self.trade_type == "SELL":
            return min(order.price for order in self.orders)
        else:
            return max(order.price for order in self.orders)
    
    def get_orders_by_merchant(self, merchant_id: str) -> List[P2POrder]:
        return [order for order in self.orders if order.merchant_id == merchant_id]
    
    def get_order_by_id(self, order_id: str) -> Optional[P2POrder]:
        """Find order by ID"""
        for order in self.orders:
            if order.order_id == order_id:
                return order
        return None 