from datetime import datetime
from sqlalchemy import Column, Integer, String, Float, DateTime, JSON, Enum
from sqlalchemy import event
import enum
from app.database import Base


class TradeMode(str, enum.Enum):
    REAL = "REAL"
    SIMULATION = "SIMULATION"


class TradeSignal(str, enum.Enum):
    BUY = "BUY"
    SELL = "SELL"


class TradeStatus(str, enum.Enum):
    OPEN = "OPEN"
    CLOSED = "CLOSED"


class TradeResult(str, enum.Enum):
    WIN = "WIN"
    LOSS = "LOSS"
    BREAKEVEN = "BREAKEVEN"


class Trade(Base):
    __tablename__ = "trades"

    id = Column(Integer, primary_key=True, index=True, autoincrement=True)
    pair = Column(String(20), nullable=False, index=True)
    mode = Column(Enum(TradeMode), nullable=False, default=TradeMode.SIMULATION)
    signal = Column(Enum(TradeSignal), nullable=False)
    entry_price = Column(Float, nullable=False)
    current_price = Column(Float, nullable=True)
    stop_loss = Column(Float, nullable=False)
    # JSON array: [tp1_price, tp2_price]
    take_profit_levels = Column(JSON, nullable=False, default=list)
    # JSON array: [False, False] — tracks which TPs have been hit
    tp_hits = Column(JSON, nullable=False, default=lambda: [False, False])
    quantity = Column(Float, nullable=True)
    opened_at = Column(DateTime, nullable=False, default=datetime.utcnow)
    closed_at = Column(DateTime, nullable=True)
    status = Column(Enum(TradeStatus), nullable=False, default=TradeStatus.OPEN)
    result = Column(Enum(TradeResult), nullable=True)
    pnl_percentage = Column(Float, nullable=True)
    pnl_amount = Column(Float, nullable=True)
    max_drawdown = Column(Float, nullable=True, default=0.0)
    # Snapshot of strategy analysis at trade open time
    strategy_snapshot = Column(JSON, nullable=True)

    def to_dict(self) -> dict:
        return {
            "id": self.id,
            "pair": self.pair,
            "mode": self.mode,
            "signal": self.signal,
            "entry_price": self.entry_price,
            "current_price": self.current_price,
            "stop_loss": self.stop_loss,
            "take_profit_levels": self.take_profit_levels,
            "tp_hits": self.tp_hits,
            "quantity": self.quantity,
            "opened_at": self.opened_at.isoformat() if self.opened_at else None,
            "closed_at": self.closed_at.isoformat() if self.closed_at else None,
            "status": self.status,
            "result": self.result,
            "pnl_percentage": self.pnl_percentage,
            "pnl_amount": self.pnl_amount,
            "max_drawdown": self.max_drawdown,
            "strategy_snapshot": self.strategy_snapshot,
        }
