"""
=========================================
CV6 AI Trading OS
Trade History — Pydantic Schemas (v2)
=========================================
"""

import time
import uuid
from typing import Optional, List
from pydantic import BaseModel, Field


class TradeCreate(BaseModel):
    order_id:        Optional[str]   = Field(default_factory=lambda: str(uuid.uuid4()))
    broker_order_id: Optional[str]   = ""
    broker:          str             = Field("", example="angelone")
    symbol:          str             = Field(..., example="NIFTY")
    exchange:        Optional[str]   = "NSE"
    trade_type:      str             = Field("BUY", example="BUY")
    status:          Optional[str]   = "PENDING"
    quantity:        int             = Field(0, example=1)
    price:           Optional[float] = 0.0
    avg_price:       Optional[float] = 0.0
    filled_qty:      Optional[int]   = 0
    product:         Optional[str]   = "MIS"
    order_type:      Optional[str]   = "MARKET"
    pnl:             Optional[float] = 0.0
    charges:         Optional[float] = 0.0
    ai_signal:       Optional[str]   = ""
    ai_confidence:   Optional[float] = 0.0
    strategy:        Optional[str]   = ""
    notes:           Optional[str]   = ""
    placed_at:       Optional[float] = Field(default_factory=time.time)


class TradeUpdate(BaseModel):
    status:          Optional[str]   = None
    avg_price:       Optional[float] = None
    filled_qty:      Optional[int]   = None
    pnl:             Optional[float] = None
    charges:         Optional[float] = None
    broker_order_id: Optional[str]   = None
    notes:           Optional[str]   = None
    executed_at:     Optional[float] = None


class TradeOut(BaseModel):
    id:              int
    order_id:        str
    broker_order_id: str
    broker:          str
    symbol:          str
    exchange:        str
    trade_type:      str
    status:          str
    quantity:        int
    price:           float
    avg_price:       float
    filled_qty:      int
    product:         str
    order_type:      str
    pnl:             float
    charges:         float
    ai_signal:       str
    ai_confidence:   float
    strategy:        str
    notes:           str
    placed_at:       float
    executed_at:     Optional[float]
    updated_at:      float

    class Config:
        from_attributes = True


class PnLSummary(BaseModel):
    total_trades:   int
    total_pnl:      float
    total_charges:  float
    net_pnl:        float
    winning_trades: int
    losing_trades:  int
    win_rate_pct:   float
    avg_win:        float
    avg_loss:       float


class TradeListResponse(BaseModel):
    success:  bool = True
    total:    int
    limit:    int
    offset:   int
    trades:   List[TradeOut]
