from __future__ import annotations

from pydantic import BaseModel, Field


class MarketStatusResponse(BaseModel):
    equity_latest_update: str | None = None
    crypto_latest_update: str | None = None
    equity_cached_points: int = 0
    crypto_cached_points: int = 0
    mapped_equity_instruments: int = 0
    mapped_crypto_assets: int = 0
    render_provider_calls: bool = False
    warnings: list[str] = Field(default_factory=list)


class QuoteRefreshRequest(BaseModel):
    provider: str = "auto"
    currency: str = "CHF"
    range: str = "1d"
    interval: str = "5m"
    limit: int = 100
    price_date: str | None = None
    only_missing: bool = True
    max_retries: int = Field(default=2, ge=0, le=3)
    pacing_seconds: float = Field(default=0.6, ge=0, le=5)
    dry_run: bool = False


class MarketBatchUpdateResponse(BaseModel):
    action: str
    provider: str
    total: int = 0
    updated: int = 0
    skipped: int = 0
    warnings: list[str] = Field(default_factory=list)
    errors: list[str] = Field(default_factory=list)
    target_date: str | None = None
    cached: int = 0
    processed: int = 0
    valued: int = 0
    coverage_total: int = 0
    complete: bool = False
    results: list[dict[str, str | int | bool | None]] = Field(default_factory=list)
    render_provider_calls: bool = False


class MarketQuoteResponse(BaseModel):
    latest_price: str | None = None
    currency: str | None = None
    change_abs: str | None = None
    change_pct: str | None = None
    open: str | None = None
    high: str | None = None
    low: str | None = None
    close: str | None = None
    volume: str | None = None
    provider: str | None = None
    provider_symbol: str | None = None
    fetched_at: str | None = None
    quality_status: str = "missing"
    warnings: list[str] = Field(default_factory=list)
    chart_points: list[dict[str, str | None]] = Field(default_factory=list)


class ChartPoint(BaseModel):
    timestamp: str
    price: str
    currency: str
    provider: str | None = None
    quality_status: str | None = None


class MarketChartResponse(BaseModel):
    latest_price: str | None = None
    currency: str | None = None
    change_abs: str | None = None
    change_pct: str | None = None
    open: str | None = None
    high: str | None = None
    low: str | None = None
    close: str | None = None
    volume: str | None = None
    provider: str | None = None
    provider_symbol: str | None = None
    fetched_at: str | None = None
    quality_status: str = "missing"
    chart_points: list[ChartPoint] = Field(default_factory=list)
    warnings: list[str] = Field(default_factory=list)


class EquityCandle(BaseModel):
    time: str
    open: str
    high: str
    low: str
    close: str
    volume: str | None = None


class EquityCandlesResponse(BaseModel):
    instrument_id: str | None = None
    symbol: str | None = None
    provider_symbol: str | None = None
    range: str = "1d"
    interval: str = "5m"
    provider: str = "yfinance"
    quality_status: str = "missing"
    candles: list[EquityCandle] = Field(default_factory=list)
    volume: list[int | None] = Field(default_factory=list)
    currency: str | None = None
    exchange_timezone: str | None = None
    fetched_at: str | None = None
    warnings: list[str] = Field(default_factory=list)
