from __future__ import annotations

from dataclasses import dataclass
from pathlib import Path
import tomllib


@dataclass(frozen=True)
class Settings:
    project_root: Path
    tdx_root: Path
    legacy_data_dir: Path
    legacy_finance_parquet: Path
    financial_pit_path: Path
    daily_price_path: Path
    vendor_dir: Path
    gbbq_path: Path
    processed_dir: Path
    database_dir: Path
    report_dir: Path
    min_trading_days: int
    min_avg_amount_20: float
    max_business_day_staleness: int


def _resolve(project_root: Path, value: str) -> Path:
    path = Path(value)
    return path if path.is_absolute() else project_root / path


def load_settings(config_path: Path) -> Settings:
    config_path = config_path.resolve()
    project_root = config_path.parent.parent
    raw = tomllib.loads(config_path.read_text(encoding="utf-8"))
    paths = raw["paths"]
    universe = raw["universe"]
    adjustment = raw["adjustment"]
    return Settings(
        project_root=project_root,
        tdx_root=_resolve(project_root, paths["tdx_root"]),
        legacy_data_dir=_resolve(project_root, paths["legacy_data_dir"]),
        legacy_finance_parquet=_resolve(project_root, paths["legacy_finance_parquet"]),
        financial_pit_path=_resolve(project_root, paths["financial_pit_path"]),
        daily_price_path=_resolve(project_root, paths["daily_price_path"]),
        vendor_dir=_resolve(project_root, adjustment["vendor_dir"]),
        gbbq_path=_resolve(project_root, adjustment["gbbq_path"]),
        processed_dir=_resolve(project_root, paths["processed_dir"]),
        database_dir=_resolve(project_root, paths["database_dir"]),
        report_dir=_resolve(project_root, paths["report_dir"]),
        min_trading_days=int(universe["min_trading_days"]),
        min_avg_amount_20=float(universe["min_avg_amount_20"]),
        max_business_day_staleness=int(universe["max_business_day_staleness"]),
    )
