import os
from urllib.parse import urlparse, quote_plus
from dotenv import load_dotenv

# Prioriza variables del archivo .env local sobre variables heredadas del sistema.
load_dotenv(override=True)


def _required_env(name: str) -> str:
    value = os.getenv(name, "").strip()
    if not value:
        raise RuntimeError(f"Falta variable de entorno requerida: {name}")
    return value


def _env_int(name: str, default: int) -> int:
    raw = os.getenv(name, "").strip()
    if not raw:
        return default
    try:
        return int(raw)
    except ValueError:
        return default


def _db_host_port():
    raw_host = _required_env("DB_HOST").strip()
    host = raw_host
    port = None

    if "://" in raw_host:
        parsed = urlparse(raw_host)
        if parsed.hostname:
            host = parsed.hostname
            port = parsed.port

    host = host.rstrip("/")

    if host.endswith(":"):
        host = host[:-1]
    elif ":" in host:
        h, sep, p = host.rpartition(":")
        if sep and p.isdigit():
            host = h
            port = int(p)

    port_env = os.getenv("DB_PORT", "").strip()
    if port_env:
        if not port_env.isdigit():
            raise RuntimeError("DB_PORT debe ser numérico.")
        port = int(port_env)

    if not host:
        raise RuntimeError("DB_HOST quedó vacío tras parseo.")
    return host, port


class Config:
    SECRET_KEY = _required_env("SECRET_KEY")
    _db_host, _db_port = _db_host_port()
    _db_port_part = f":{_db_port}" if _db_port else ""
    _db_user = quote_plus(_required_env("DB_USER"))
    _db_pass = quote_plus(_required_env("DB_PASS"))
    _db_name = _required_env("DB_NAME").lstrip("/")
    if not _db_name:
        raise RuntimeError("DB_NAME inválido tras limpiar '/'.")

    SQLALCHEMY_DATABASE_URI = (
        f"mysql+pymysql://{_db_user}:{_db_pass}"
        f"@{_db_host}{_db_port_part}/{_db_name}?charset=utf8mb4"
    )
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    SQLALCHEMY_ENGINE_OPTIONS = {"pool_pre_ping": True}
    SESSION_COOKIE_HTTPONLY = True
    SESSION_COOKIE_SAMESITE = "Lax"
    SESSION_COOKIE_SECURE = os.getenv("SESSION_COOKIE_SECURE", "0") == "1"
    WTF_CSRF_TIME_LIMIT = 60 * 60 * 2

    MESES_PROPUESTA_PROGRAMACION = max(1, _env_int("MESES_PROPUESTA_PROGRAMACION", 1))
