"""
=========================================
CV6 AI Trading OS — Trading State ORM Models
=========================================
Persistent, restart-surviving storage for the single source of truth.
These tables let the TradingStateManager rebuild full trading state
(orders, positions, capital, PnL) after any restart, and provide an
append-only audit log of every event for recovery/forensics.

Tables:
  tsm_orders    — every order and its lifecycle status
  tsm_positions — every position (OPEN + CLOSED) with realized P&L
  tsm_capital   — single-row capital snapshot (id=1)
  tsm_events    — append-only audit log of every TradingEvent
"""

import time
from sqlalchemy import Column, String, Integer, Float, Text
from app.database.base import Base


class OrderRecord(Base):
    __tablename__ = "tsm_orders"

    order_id        = Column(String(80), primary_key=True)
    broker          = Column(String(32), default="", index=True)
    symbol          = Column(String(48), nullable=False, index=True)
    exchange        = Column(String(16), default="NSE")
    side            = Column(String(8),  default="")          # BUY | SELL
    order_type      = Column(String(16), default="MARKET")
    product         = Column(String(16), default="INTRADAY")
    quantity        = Column(Integer, default=0)
    filled_quantity = Column(Integer, default=0)
    price           = Column(Float, default=0.0)
    avg_price       = Column(Float, default=0.0)
    status          = Column(String(24), default="PLACED", index=True)  # PLACED|FILLED|PARTIALLY_FILLED|REJECTED|CANCELLED
    mode            = Column(String(8),  default="REAL")
    strategy        = Column(String(64), default="")
    ai_confidence   = Column(Float, default=0.0)
    reason          = Column(Text, default="")
    created_at      = Column(Float, default=lambda: time.time())
    updated_at      = Column(Float, default=lambda: time.time())


class PositionRecord(Base):
    __tablename__ = "tsm_positions"

    id            = Column(Integer, primary_key=True, autoincrement=True)
    symbol        = Column(String(48), nullable=False, index=True)
    broker        = Column(String(32), default="")
    exchange      = Column(String(16), default="NSE")
    style         = Column(String(16), default="INTRADAY")
    side          = Column(String(8),  default="BUY")         # BUY (long) | SELL (short)
    qty           = Column(Integer, default=0)
    entry_price   = Column(Float, default=0.0)
    ltp           = Column(Float, default=0.0)
    stop_loss     = Column(Float, default=0.0)
    target_price  = Column(Float, default=0.0)
    status        = Column(String(16), default="OPEN", index=True)   # OPEN | CLOSED
    exit_price    = Column(Float, default=0.0)
    realized_pnl  = Column(Float, default=0.0)
    exit_reason   = Column(String(32), default="")
    strategy      = Column(String(64), default="")
    ai_confidence = Column(Float, default=0.0)
    mode          = Column(String(8), default="REAL")
    entry_order_id= Column(String(80), default="")
    sl_order_id   = Column(String(80), default="")   # broker-side stop-loss order (Tier-1)
    opened_at     = Column(Float, default=lambda: time.time())
    closed_at     = Column(Float, nullable=True)
    updated_at    = Column(Float, default=lambda: time.time())


class CapitalState(Base):
    __tablename__ = "tsm_capital"

    id                = Column(Integer, primary_key=True)   # always 1 (singleton row)
    total_capital     = Column(Float, default=0.0)
    available_capital = Column(Float, default=0.0)
    deployed_capital  = Column(Float, default=0.0)
    realized_pnl      = Column(Float, default=0.0)
    updated_at        = Column(Float, default=lambda: time.time())


class TradingEventRecord(Base):
    __tablename__ = "tsm_events"

    event_id   = Column(String(48), primary_key=True)
    event_type = Column(String(32), index=True)
    symbol     = Column(String(48), index=True)
    broker     = Column(String(32), default="")
    order_id   = Column(String(80), default="")
    payload    = Column(Text, default="")
    ts         = Column(Float, default=lambda: time.time(), index=True)
