from __future__ import annotations

from dataclasses import dataclass

REQUIRED_COLUMNS = ("symbol", "date", "open", "high", "low", "close", "volume")
OPTIONAL_COLUMNS = (
    "previous_close", "trades", "value_traded", "market_cap", "sector", "company_name",
    "adjusted_open", "adjusted_high", "adjusted_low", "adjusted_close", "adjusted_volume",
    "adjustment_factor", "is_adjusted", "provider", "fetched_at", "source_reference", "raw_artifact",
    "source_symbol", "adjustment_source", "adjustment_method", "provider_trust",
)
NUMERIC_COLUMNS = (
    "open", "high", "low", "close", "previous_close", "volume", "trades", "value_traded",
    "market_cap", "adjusted_open", "adjusted_high", "adjusted_low", "adjusted_close",
    "adjusted_volume", "adjustment_factor",
)

CANONICAL_EQUITY_COLUMNS = REQUIRED_COLUMNS + OPTIONAL_COLUMNS
CANONICAL_INDEX_COLUMNS = (
    "date", "index", "open", "high", "low", "close", "volume",
    "provider", "provider_trust", "source_symbol", "fetched_at", "source_reference", "raw_artifact",
    "underlying_source", "imported_at",
    "benchmark_role",
)
CORPORATE_ACTION_COLUMNS = (
    "symbol", "action_date", "action_type", "ratio", "cash_amount", "source", "source_reference",
    "provider", "provider_trust",
)
CONSTITUENT_COLUMNS = ("effective_date", "symbol", "index", "source_reference")


@dataclass(frozen=True)
class DataIssue:
    severity: str
    code: str
    message: str
    symbol: str | None = None
    date: str | None = None
    row_count: int = 1
    details: dict[str, object] | None = None
