\
from dataclasses import dataclass
import os
import re

from dotenv import load_dotenv

load_dotenv()


def _required(name: str) -> str:
    value = os.getenv(name, "").strip()
    if not value:
        raise RuntimeError(f"Falta la variable obligatoria {name} en .env")
    return value


def _identifier(name: str, value: str) -> str:
    if not re.fullmatch(r"[A-Za-z0-9_]+", value):
        raise RuntimeError(
            f"{name} contiene caracteres no permitidos para un identificador SQL: {value!r}"
        )
    return value


@dataclass(frozen=True)
class Settings:
    db_host: str
    db_port: int
    db_user: str
    db_password: str
    moodle_db: str
    connect_db: str
    moodle_prefix: str
    sync_scope: str
    default_country_code: str


def get_settings() -> Settings:
    sync_scope = os.getenv("SYNC_SCOPE", "eligible_only").strip().lower()
    allowed_scopes = {"eligible_only", "with_phone", "all_active"}
    if sync_scope not in allowed_scopes:
        raise RuntimeError(
            f"SYNC_SCOPE={sync_scope!r} no es válido. Usa: {', '.join(sorted(allowed_scopes))}"
        )

    moodle_db = _identifier("MOODLE_DB", _required("MOODLE_DB"))
    connect_db = _identifier("CONNECT_DB", _required("CONNECT_DB"))
    moodle_prefix = _identifier(
        "MOODLE_PREFIX", os.getenv("MOODLE_PREFIX", "mdl_").strip()
    )

    return Settings(
        db_host=_required("DB_HOST"),
        db_port=int(os.getenv("DB_PORT", "3306")),
        db_user=_required("DB_USER"),
        db_password=_required("DB_PASSWORD"),
        moodle_db=moodle_db,
        connect_db=connect_db,
        moodle_prefix=moodle_prefix,
        sync_scope=sync_scope,
        default_country_code=os.getenv("DEFAULT_COUNTRY_CODE", "51").strip(),
    )
