"""KÖZÖS NAPLÓZÓ SEGÉD (v77, J-20) - egységes AuditLog-bejegyzés az "audit-hiányos" végpontokhoz.
Leírás: docs/JOGOSULTSAGOK.md (J-20), docs/RENDSZERNAPLO.md.

MIÉRT?
    A J-20 audit szerint a Jogosultsági napló (a Beállítások fül) és a rendszeradmin Rendszernaplója hiányos volt: a Beállítások-írások,
    a cég létrehozása / adatai / licence / kapcsolói / törlése, a felhasználó- és géptörlés (ez csak `print`), a modul-kapcsolás, a jelszócsere
    és az Admin általi felhasználó-szerkesztés nem hagyott nyomot. Ez a modul az ismétlődő `db.add(models.AuditLog(...))` blokkok helyett
    EGY helyen tartja a formátumot, a rövidítést és az érték-szövegeket.

SZABÁLYOK
    * `naploz()` SOHA nem commitol: a hívó végpont a módosítással EGY tranzakcióban commitol (ha a mentés elbukik, a naplósor sem marad meg,
      és fordítva: nincs napló nélküli módosítás).
    * Az értékek rövidítettek (`ERTEK_MAX`), így egy hosszú szöveg / JSON nem dagasztja a táblát; a szöveg-sablon (Jinja) automatikusan escape-el.
    * JELSZÓ, HASH, TOKEN, MENTŐKÓD értéke SOHA nem kerül ide: a hívó csak a tény-jellegű szöveget ("módosítva") adja át.
    * A `company_id` az az ügyfélcég, amelyet az esemény érint (a Jogosultsági napló erre szűr: `AuditLog.company_id == munkakörnyezet`).
      Cégtörlésnél a cég saját sorai is törlődnek, ezért oda NEM írunk: az 1-es (rendszeradmin) céghez kerül a bejegyzés (l. routers/rendszeradmin.py).
    * Új eseménytípus (field_name) felvételekor a `rendszernaplo_utils._PREFIXEK` listát is bővíteni kell (kategória-szűrő).
"""
import models

ERTEK_MAX = 300


def rovid(ertek, max_hossz: int = ERTEK_MAX):
    """Naplózható szöveg: None marad None, minden más szöveggé alakul és a határnál '…'-ra vágódik."""
    if ertek is None:
        return None
    szoveg = str(ertek).strip()
    if len(szoveg) > max_hossz:
        return szoveg[:max_hossz - 1] + "…"
    return szoveg


def be_ki(allapot) -> str:
    """Kapcsoló-állapot szövege (a Cég állapota / Bérbeadás sorok mintájára magyarul)."""
    return "Bekapcsolva" if allapot else "Kikapcsolva"


def naploz(db, actor, company_id, mezo: str, regi=None, uj=None, csak_ha_valtozott: bool = False, machine_id=None):
    """Egy AuditLog-sor hozzáadása a SESSION-höz (NEM commitol). `actor`: a végrehajtó User (vagy None = rendszer).
    `csak_ha_valtozott=True`: ha a (rövidített) régi és új érték egyezik, semmi sem íródik (pl. egy változatlan űrlap-beküldés).
    Visszatérés: a hozzáadott sor, vagy None, ha kimaradt."""
    r, u = rovid(regi), rovid(uj)
    if csak_ha_valtozott and r == u:
        return None
    sor = models.AuditLog(
        company_id=company_id, machine_id=machine_id, user_id=getattr(actor, "id", None),
        field_name=rovid(mezo, 255), old_value=r, new_value=u
    )
    db.add(sor)
    return sor
