"""Pydantic schemas for trade setup endpoints."""

from __future__ import annotations

from datetime import date, datetime

from pydantic import BaseModel, Field


class TradeTargetResponse(BaseModel):
    price: float
    distance_from_entry: float
    distance_atr_multiple: float
    rr_ratio: float
    probability: float
    classification: str
    sr_level_id: int
    sr_strength: float
    is_primary: bool = False


class RecommendationSummaryResponse(BaseModel):
    action: str
    reasoning: str | None
    risk_level: str | None
    composite_score: float


class TradeSetupContextAsOfResponse(BaseModel):
    setup_detected_at: datetime
    score_computed_at: datetime | None = None
    sentiment_at: datetime | None = None
    price_date: date | None = None
    price_updated_at: datetime | None = None


class TradeSetupResponse(BaseModel):
    """A single trade setup detected by the R:R scanner."""

    id: int
    symbol: str
    direction: str
    entry_price: float
    stop_loss: float
    target: float
    rr_ratio: float
    composite_score: float
    detected_at: datetime
    confidence_score: float | None = None
    targets: list[TradeTargetResponse] = Field(default_factory=list)
    conflict_flags: list[str] = Field(default_factory=list)
    recommended_action: str | None = None
    reasoning: str | None = None
    risk_level: str | None = None
    actual_outcome: str | None = None
    outcome_date: date | None = None
    evaluated_at: datetime | None = None
    current_price: float | None = None
    momentum_percentile: float | None = None
    strategy_rank: float | None = None
    volatility_percentile: float | None = None
    context_as_of: TradeSetupContextAsOfResponse | None = None
    recommendation_summary: RecommendationSummaryResponse | None = None
