import os
from dataclasses import dataclass
from pathlib import Path
from urllib.parse import quote_plus

from dotenv import load_dotenv


PROJECT_DIR = Path(__file__).resolve().parent.parent

# cPanel permite configurar variables desde el panel. También se admite un archivo
# cpanel.env para facilitar la instalación mediante el Administrador de archivos.
# Las variables reales del servidor siempre tienen prioridad.
load_dotenv(PROJECT_DIR / ".env", override=False)
load_dotenv(PROJECT_DIR / "cpanel.env", override=False)


def _database_url() -> str:
    explicit_url = os.getenv("DATABASE_URL", "").strip()
    if explicit_url:
        return explicit_url

    engine = os.getenv("DB_ENGINE", "sqlite").strip().lower()
    if engine in {"mysql", "mariadb"}:
        host = os.getenv("MYSQL_HOST", "localhost").strip()
        port = os.getenv("MYSQL_PORT", "3306").strip()
        database = os.getenv("MYSQL_DATABASE", "").strip()
        username = os.getenv("MYSQL_USER", "").strip()
        password = os.getenv("MYSQL_PASSWORD", "")
        if not database or not username or not password:
            raise RuntimeError(
                "Faltan MYSQL_DATABASE, MYSQL_USER o MYSQL_PASSWORD en cpanel.env."
            )
        return (
            "mysql+pymysql://"
            f"{quote_plus(username)}:{quote_plus(password)}@{host}:{port}/"
            f"{quote_plus(database)}?charset=utf8mb4"
        )

    sqlite_path = os.getenv("SQLITE_PATH", "").strip()
    if sqlite_path:
        db_path = Path(sqlite_path).expanduser().resolve()
    else:
        db_path = (PROJECT_DIR / "data" / "alberto_smith.db").resolve()
    db_path.parent.mkdir(parents=True, exist_ok=True)
    return f"sqlite:///{db_path.as_posix()}"


@dataclass(frozen=True)
class Settings:
    app_name: str = os.getenv("APP_NAME", "Sistema de Notas U.E.N. Alberto Smith")
    secret_key: str = os.getenv("SECRET_KEY", "CAMBIAR-ESTA-CLAVE-EN-PRODUCCION")
    database_url: str = _database_url()
    admin_username: str = os.getenv("ADMIN_USERNAME", "administrador")
    admin_password: str = os.getenv("ADMIN_PASSWORD", "Cambiar123!")
    session_max_age: int = int(os.getenv("SESSION_MAX_AGE", "28800"))
    cookie_secure: bool = os.getenv("COOKIE_SECURE", "false").lower() in {
        "1",
        "true",
        "yes",
        "si",
        "sí",
    }
    article112_threshold: float = float(os.getenv("ARTICLE112_THRESHOLD", "0.30"))
    article112_passing_score: float = float(os.getenv("ARTICLE112_PASSING_SCORE", "10"))
    article112_absence_counts_as_fail: bool = os.getenv(
        "ARTICLE112_ABSENCE_COUNTS_AS_FAIL", "false"
    ).lower() in {"1", "true", "yes", "si", "sí"}
    school_year: str = os.getenv("SCHOOL_YEAR", "2026-2027")
    institution_timezone: str = os.getenv("INSTITUTION_TIMEZONE", "America/Caracas")
    grade_upload_hours: int = int(os.getenv("GRADE_UPLOAD_HOURS", "48"))
    institution_name: str = "U. E. N. “ALBERTO SMITH”"
    institution_code: str = "007911265"
    comuna: str = "COMUNA “MANUELITA SÁENZ” – SITUR 051603001008"
    consejo_comunal: str = "CONSEJO COMUNAL “LA REPRESA” SITUR 05-16-01-001-0005"


settings = Settings()
