from __future__ import annotations

import secrets

from sqlalchemy.orm import Session

from ..models import SystemSetting

DEFAULTS: dict[str, str] = {
    "school_name": "Sekolah Saya",
    "enrollment_key": "",  # dibuat otomatis
    "download_expiry_minutes": "10",
    "download_approval_minutes": "5",
    "download_auto_reject_ext": "exe,msi,bat,cmd,ps1,scr,vbs,jar,apk,dll,com,reg",
    "download_auto_approve_ext": "",
    "download_max_mb": "200",
    "screen_fps": "2",
    "screen_quality": "50",
    "screen_max_width": "1280",
    "blocked_attempt_notify": "true",
    "log_retention_days": "365",
    "wol_broadcast": "255.255.255.255",
    "request_expiry_minutes_apps": "30",
}
EDITABLE_BY_ADMIN = set(DEFAULTS) - {"enrollment_key"}


def get_setting(db: Session, key: str) -> str:
    row = db.get(SystemSetting, key)
    if row is not None and row.value is not None:
        return row.value
    if key == "enrollment_key":
        val = secrets.token_urlsafe(9)
        set_setting(db, key, val)
        return val
    return DEFAULTS.get(key, "")


def get_int(db: Session, key: str, default: int = 0) -> int:
    try:
        return int(get_setting(db, key))
    except (TypeError, ValueError):
        return default


def set_setting(db: Session, key: str, value: str) -> None:
    row = db.get(SystemSetting, key)
    if row is None:
        db.add(SystemSetting(key=key, value=value))
    else:
        row.value = value
    db.commit()


def all_settings(db: Session, include_secret: bool = False) -> dict[str, str]:
    out = {k: get_setting(db, k) for k in DEFAULTS}
    if not include_secret:
        out.pop("enrollment_key", None)
    return out


def csv_set(s: str) -> set[str]:
    return {x.strip().lower().lstrip(".") for x in (s or "").split(",") if x.strip()}
