"""Pydantic API schemas."""
from datetime import datetime, date

from pydantic import BaseModel, ConfigDict, EmailStr


# ── Auth ─────────────────────────────────────────────────
class UserCreate(BaseModel):
    email: EmailStr
    password: str


class UserOut(BaseModel):
    model_config = ConfigDict(from_attributes=True)
    id: int
    email: str
    role: str = "user"
    created_at: datetime


class Token(BaseModel):
    access_token: str
    token_type: str = "bearer"


# ── Signals ──────────────────────────────────────────────
class SignalOut(BaseModel):
    model_config = ConfigDict(from_attributes=True)
    id: int
    symbol: str
    company: str
    direction: str
    signal_type: str = "options"
    status: str
    risk_rating: str
    price: float
    confidence: float
    probability: float
    entry: float
    stop_loss: float
    target1: float
    target2: float
    risk_reward: float
    position_size: int
    max_risk_usd: float
    scores: dict
    rationale: list
    rejection_reasons: list
    option_contract: dict
    indicators: dict
    history: list
    created_at: datetime


# ── Scanner ──────────────────────────────────────────────
class ScanRunOut(BaseModel):
    model_config = ConfigDict(from_attributes=True)
    id: int
    started_at: datetime
    universe_size: int
    candidates: int
    signals_created: int
    results: list


# ── Paper trades ─────────────────────────────────────────
class PaperTradeCreate(BaseModel):
    signal_id: int
    quantity: int | None = None  # default: signal position size


class PaperTradeOut(BaseModel):
    model_config = ConfigDict(from_attributes=True)
    id: int
    signal_id: int | None
    symbol: str
    direction: str
    quantity: int
    entry_price: float
    stop_loss: float
    initial_stop: float | None = None
    scaled_out: int = 0
    target: float
    status: str
    instrument: str = "shares"
    option_contract: dict | None = None
    option_entry_premium: float | None = None
    option_last_premium: float | None = None
    option_contracts: int = 0
    option_pnl: float = 0
    exit_price: float | None
    exit_reason: str | None
    pnl: float
    last_price: float
    mfe_r: float = 0
    mae_r: float = 0
    opened_at: datetime
    closed_at: datetime | None


# ── Reports ──────────────────────────────────────────────
class DailyReportOut(BaseModel):
    model_config = ConfigDict(from_attributes=True)
    id: int
    report_date: date
    summary: str
    payload: dict
    created_at: datetime
