from __future__ import annotations

import os
from dataclasses import dataclass

from src.errors import UserError

MATCH_DATE_WINDOW_DAYS_ENV_VAR = "MATCH_DATE_WINDOW_DAYS"
MATCH_MAX_DISTANCE_M_ENV_VAR = "MATCH_MAX_DISTANCE_M"


@dataclass(frozen=True)
class MatchingConfig:
    date_window_days: int
    max_distance_m: int


def load_matching_config() -> MatchingConfig:
    date_window_days = _load_positive_int(MATCH_DATE_WINDOW_DAYS_ENV_VAR, default=3)
    max_distance_m = _load_positive_int(MATCH_MAX_DISTANCE_M_ENV_VAR, default=25_000)
    return MatchingConfig(date_window_days=date_window_days, max_distance_m=max_distance_m)


def _load_positive_int(name: str, *, default: int) -> int:
    raw = os.environ.get(name, "").strip()
    if not raw:
        return default
    try:
        value = int(raw)
    except ValueError as exc:
        raise UserError(f"Invalid {name}: expected integer, got {raw!r}") from exc
    if value <= 0:
        raise UserError(f"Invalid {name}: must be > 0 (got {value})")
    return value
