"""Reference/lookup tables: countries, exchanges, sectors, industries (DATA_MODEL.md)."""
from __future__ import annotations

from typing import Optional

from sqlalchemy import ForeignKey, String
from sqlalchemy.orm import Mapped, mapped_column, relationship

from app.models.base import Base, uuid_pk


class Country(Base):
    __tablename__ = "countries"

    id: Mapped[str] = uuid_pk()
    iso2: Mapped[str] = mapped_column(String(2), unique=True, index=True)
    iso3: Mapped[str] = mapped_column(String(3), unique=True)
    name: Mapped[str] = mapped_column(String(128))
    region: Mapped[str] = mapped_column(String(64), index=True)  # e.g. "EUROPE", "ASIA_PACIFIC"
    currency: Mapped[str] = mapped_column(String(3))
    risk_free_rate_override: Mapped[Optional[float]] = mapped_column(nullable=True)
    equity_risk_premium_override: Mapped[Optional[float]] = mapped_column(nullable=True)


class Exchange(Base):
    __tablename__ = "exchanges"

    id: Mapped[str] = uuid_pk()
    mic: Mapped[str] = mapped_column(String(16), unique=True, index=True)  # ISO 10383 MIC
    name: Mapped[str] = mapped_column(String(128))
    country_id: Mapped[str] = mapped_column(ForeignKey("countries.id"), index=True)
    timezone: Mapped[str] = mapped_column(String(64))

    country: Mapped["Country"] = relationship()


class Sector(Base):
    __tablename__ = "sectors"

    id: Mapped[str] = uuid_pk()
    code: Mapped[str] = mapped_column(String(32), unique=True)  # e.g. "FINANCIALS" — used by industry_applicability.py
    name: Mapped[str] = mapped_column(String(128))


class Industry(Base):
    __tablename__ = "industries"

    id: Mapped[str] = uuid_pk()
    code: Mapped[str] = mapped_column(String(64), unique=True, index=True)
    name: Mapped[str] = mapped_column(String(128))
    sector_id: Mapped[str] = mapped_column(ForeignKey("sectors.id"), index=True)

    sector: Mapped["Sector"] = relationship()
