"""
Shared data models used across the bot.
"""
from dataclasses import dataclass, field
from enum import Enum
from typing import Optional


class Direction(Enum):
    LONG = "LONG"
    SHORT = "SHORT"
    NONE = "NONE"


class TradeResult(Enum):
    WIN = "WIN"
    LOSS = "LOSS"
    BREAKEVEN = "BREAKEVEN"


@dataclass
class Candle:
    open_time: int
    open: float
    high: float
    low: float
    close: float
    volume: float

    @staticmethod
    def from_binance_list(row: list) -> "Candle":
        return Candle(
            open_time=int(row[0]),
            open=float(row[1]),
            high=float(row[2]),
            low=float(row[3]),
            close=float(row[4]),
            volume=float(row[5]),
        )


@dataclass
class Signal:
    direction: Direction
    confidence: float          # 0–1
    atr: float
    entry_price: float
    sl_price: float
    tp_price: float
    risk_reward: float
    adx: float
    rsi: float
    reason: str = ""


@dataclass
class Trade:
    id: str
    symbol: str
    direction: Direction
    entry_price: float
    sl_price: float
    tp_price: float
    quantity: float
    leverage: int
    open_time: int
    close_time: Optional[int] = None
    exit_price: Optional[float] = None
    pnl_usdt: Optional[float] = None
    fees_usdt: Optional[float] = None
    result: Optional[TradeResult] = None
    position_id: Optional[str] = None
    notes: str = ""

    @property
    def net_pnl(self) -> Optional[float]:
        if self.pnl_usdt is None or self.fees_usdt is None:
            return None
        return self.pnl_usdt - self.fees_usdt


@dataclass
class BotState:
    current_direction: Direction = Direction.NONE
    consecutive_losses: int = 0
    consecutive_wins: int = 0
    daily_pnl: float = 0.0
    total_pnl: float = 0.0
    peak_balance: float = 0.0
    is_running: bool = True
    daily_loss_halt: bool = False
    drawdown_halt: bool = False
    open_trade_id: Optional[str] = None
    last_trade_result: Optional[TradeResult] = None
    trades_today: int = 0
