from datetime import date, datetime, time, timezone
from zoneinfo import ZoneInfo

from fastapi.templating import Jinja2Templates

templates = Jinja2Templates(directory="templates")


# --- IDŐZÓNA-KEZELÉS ---
# Az adatbázisban minden DateTime időbélyeg UTC-ben tárolódik (models.py:
# default=lambda: datetime.now(timezone.utc)). A MariaDB DATETIME oszlop az időzóna-
# információt eldobja, így visszaolvasáskor "csupasz" (naiv) UTC-értéket kapunk.
# Megjelenítés (lista, napló, PDF, sablon) ELŐTT mindig ezeken a függvényeken keresztül
# kell helyi (Europe/Budapest) időre váltani - a nyári/téli időszámítást a ZoneInfo kezeli.
# FONTOS: tárolásra továbbra is UTC-t használunk, csak a megjelenítés helyi idejű!
HELYI_TZ = ZoneInfo("Europe/Budapest")


def helyi_datetime(dt):
    """UTC (naiv vagy tz-aware) datetime -> naiv helyi (Europe/Budapest) datetime.
    None -> None. A naiv bemenetet UTC-nek tekinti (így tárolunk az adatbázisban)."""
    if dt is None:
        return None
    if dt.tzinfo is None:
        dt = dt.replace(tzinfo=timezone.utc)
    return dt.astimezone(HELYI_TZ).replace(tzinfo=None)


def helyi_ido(dt, fmt="%Y-%m-%d %H:%M"):
    """UTC datetime -> helyi időre váltott, formázott szöveg. None -> "-"."""
    if dt is None:
        return "-"
    return helyi_datetime(dt).strftime(fmt)


def helyi_most():
    """Az aktuális helyi (Europe/Budapest) idő naiv datetime-ként - a szerver
    rendszer-időzónájától (a VPS-en UTC) függetlenül."""
    return datetime.now(HELYI_TZ).replace(tzinfo=None)


def helyi_nap_utc_hatarai(nap: date):
    """Egy helyi naptári nap kezdete és vége naiv UTC datetime-ként - az UTC-ben tárolt
    időbélyegek helyi nap szerinti adatbázis-szűréséhez (pl. "tól-ig" dátumszűrő)."""
    kezdet = datetime.combine(nap, time.min, tzinfo=HELYI_TZ).astimezone(timezone.utc)
    veg = datetime.combine(nap, time.max, tzinfo=HELYI_TZ).astimezone(timezone.utc)
    return kezdet.replace(tzinfo=None), veg.replace(tzinfo=None)


# Jinja-szűrő a sablonokhoz: {{ f.uploaded_at | helyi_ido }}
templates.env.filters["helyi_ido"] = helyi_ido


# --- KÖZÖS LÁBLÉC (v42, templates/_lablec.html): az aktuális év és a futó verzió ---
# A verzió a CHANGELOG.md tetejéről jön (verzio_utils), a fájl módosítási ideje szerint gyorsítótárazva - így egy oldal-kirajzolás
# nem olvassa újra a fájlt, a deploy utáni (frissített CHANGELOG) első kérés viszont már az új verziót mutatja.
_VERZIO_GYORSITOTAR = {"mtime": None, "ertek": "", "datum": ""}


def aktualis_ev() -> int:
    """A helyi (Europe/Budapest) naptári év a láblécbe."""
    return helyi_most().year


def _verzio_betoltes() -> None:
    """A gyorsítótár frissítése, ha a CHANGELOG.md módosult (v43: a lábléc ÉS a fejléc verzió-jelvénye közös forrása)."""
    import verzio_utils
    mtime = verzio_utils.CHANGELOG_PATH.stat().st_mtime
    if _VERZIO_GYORSITOTAR["mtime"] != mtime:
        jelenlegi = verzio_utils.jelenlegi_verzio()
        _VERZIO_GYORSITOTAR["ertek"] = str(jelenlegi["verzio"]) if jelenlegi else ""
        _VERZIO_GYORSITOTAR["datum"] = str(jelenlegi["datum"]) if jelenlegi else ""
        _VERZIO_GYORSITOTAR["mtime"] = mtime


def lablec_verzio() -> str:
    """A futó verzió száma (pl. "42") vagy "" - a CHANGELOG.md legfelső bejegyzése; hiba esetén sosem dob kivételt (a lábléc nem törheti el az oldalt)."""
    try:
        _verzio_betoltes()
        return _VERZIO_GYORSITOTAR["ertek"]
    except Exception:
        return ""


def verzio_adat() -> dict:
    """A rendszeradmin fejléc verzió-jelvényéhez: {"verzio": "42", "datum": "2026-10-06"} vagy {} (sosem dob kivételt)."""
    try:
        _verzio_betoltes()
        return {"verzio": _VERZIO_GYORSITOTAR["ertek"], "datum": _VERZIO_GYORSITOTAR["datum"]} if _VERZIO_GYORSITOTAR["ertek"] else {}
    except Exception:
        return {}


templates.env.globals["aktualis_ev"] = aktualis_ev
templates.env.globals["lablec_verzio"] = lablec_verzio
templates.env.globals["verzio_adat"] = verzio_adat


def modul_fejlec_adat(request, user) -> dict:
    """A modulok közös fejléceinek (templates/_fejlec_emelogep.html v44, _fejlec_ebk.html v45, később VIVÜ / tűzvédelem) adatai - EGY helyen számolva, így az útvonalaknak nem kell
    mindegyiknek külön átadniuk őket (korábban a dashboard / lista / gépfelvitel stb. útvonal mind a saját `sugo_e`, `tobb_modul_van`,
    `working_company_id`, `ceg_aktiv`, `ai_szkenneles`, `is_rendszeradmin` kulcsokat állította össze, és ahol ez hiányzott, a fejléc gombjai eltűntek).
    Visszaadott kulcsok:
        working_company_id - az aktív cégkörnyezet (cookie / utolsó választás / saját cég)
        ceg_aktiv          - az aktív cég nincs inaktiválva (inaktív cégnél nincs szerkesztő gomb)
        tobb_modul_van     - van hova modult váltani (a modulváltó menüpont megjelenik)
        sugo_e             - a cégnek engedélyezett a Használati útmutató / súgó
        ai_szkenneles      - a cégnek engedélyezett az AI adattábla-felismerés (fizetős extra)
        is_rendszeradmin   - a felhasználó a rendszeradminisztrátor (Excel gépimport menüpont)
    Hiba esetén (vagy ha nincs `user`) BIZTONSÁGOS alapértékeket ad (minden extra gomb rejtve) - a fejléc nem törheti el az oldalt. Rövid életű,
    saját adatbázis-munkamenetet használ (néhány egyszerű lekérdezés), amit mindig lezár."""
    adat = {"working_company_id": None, "ceg_aktiv": False, "tobb_modul_van": False, "sugo_e": False, "ai_szkenneles": False, "is_rendszeradmin": False}
    if user is None:
        return adat
    db = None
    try:
        from database import SessionLocal
        from routers.ai_scan import ai_szkenneles_engedelyezve
        from security import (get_working_company_id, is_company_active, is_rendszeradminisztrator, sugo_engedelyezve, van_e_tobb_modulja)
        db = SessionLocal()
        ceg_id = get_working_company_id(user, request)
        adat.update({
            "working_company_id": ceg_id,
            "ceg_aktiv": is_company_active(ceg_id, db),
            "tobb_modul_van": van_e_tobb_modulja(user, db),
            "sugo_e": sugo_engedelyezve(ceg_id, db),
            "ai_szkenneles": ai_szkenneles_engedelyezve(ceg_id, db),
            "is_rendszeradmin": is_rendszeradminisztrator(user),
        })
    except Exception:
        import logging
        logging.getLogger(__name__).exception("modul_fejlec_adat: a fejléc adatai nem állíthatók össze (biztonságos alapértékek)")
    finally:
        if db is not None:
            db.close()
    return adat

# v44 név (visszafelé kompatibilis): az emelőgépes fejléc és a tesztek ezen a néven hívják; v45 óta a modulok közös globálja a modul_fejlec_adat
emelogep_fejlec_adat = modul_fejlec_adat
templates.env.globals["modul_fejlec_adat"] = modul_fejlec_adat
templates.env.globals["emelogep_fejlec_adat"] = modul_fejlec_adat
