"""Ressourcen, die beide Anwendungen teilen.

``tesm_core`` bringt Benutzer-, Gruppen-, Papierkorb-, Protokoll- und
Diagnoseseiten selbst mit. Damit deren Rechtepruefungen greifen, muessen die
zugehoerigen Ressourcenschluessel im Rechtebaum der Anwendung existieren --
darum stehen sie hier und werden von beiden Apps eingebunden statt zweimal
getippt.
"""

from __future__ import annotations

from .model import Action, Area, Resource

A = Action

USERS = Resource(
    key="users",
    label="Benutzer",
    actions=(A.VIEW, A.CREATE, A.EDIT, A.DELETE),
    hint="Konten anlegen, sperren, Gruppen zuordnen",
    action_hints={
        A.EDIT: "Stammdaten, Sperre und Gruppenzuordnung aendern.",
        A.DELETE: "Konto in den Papierkorb legen (Verzeichniskonten sofort entfernen).",
    },
)

GROUPS = Resource(
    key="groups",
    label="Gruppen und Rechte",
    actions=(A.VIEW, A.CREATE, A.EDIT, A.DELETE),
    hint="Rechtematrix pflegen",
    action_hints={
        A.EDIT: "Rechte vergeben -- nur Rechte, die man selbst besitzt.",
    },
)

SETTINGS_SYSTEM = Resource(
    key="settings_system",
    label="Systemeinstellungen",
    actions=(A.VIEW, A.EDIT, A.EXECUTE),
    hint="Hostname, Zeitzone, Protokollrotation, Navigation",
    action_hints={A.EXECUTE: "Systemaktionen ausloesen (Dienste, Netzwerk uebernehmen)."},
)

SETTINGS_LICENSE = Resource(
    key="settings_license",
    label="Lizenz",
    actions=(A.VIEW, A.EDIT),
    hint="Lizenzdatei einspielen, aktivieren, deaktivieren",
)

SETTINGS_DIRECTORY = Resource(
    key="settings_directory",
    label="Verzeichnisdienst (LDAP/AD)",
    actions=(A.VIEW, A.EDIT, A.EXECUTE, A.SECRETS),
    hint="Anbindung und Gruppen-Zuordnung",
    action_hints={
        A.EXECUTE: "Verbindungstest ausfuehren.",
        A.SECRETS: "Bind-Passwort des Dienstkontos setzen.",
    },
)

SETTINGS_WEB = Resource(
    key="settings_web",
    label="Webserver und TLS",
    actions=(A.VIEW, A.EDIT, A.EXECUTE),
    hint="Domain, Zertifikat, HSTS",
    action_hints={A.EXECUTE: "Konfiguration uebernehmen, Zertifikat anfordern."},
)

SETTINGS_NETWORK = Resource(
    key="settings_network",
    label="Netzwerkeinstellungen",
    actions=(A.VIEW, A.EDIT),
    hint="IP-Adresse, Gateway, DNS des Hosts",
)

BACKUP = Resource(
    key="backup",
    label="Sicherung und Uebertragung",
    actions=(A.VIEW, A.EXECUTE, A.EXPORT, A.SECRETS),
    hint="Verschluesselter Export und Import",
    action_hints={
        A.EXECUTE: "Eine Sicherung einspielen.",
        A.EXPORT: "Sicherung erzeugen und herunterladen.",
        A.SECRETS: "Zugangsdaten in die Sicherung einschliessen.",
    },
)

TRASH = Resource(
    key="trash",
    label="Papierkorb",
    actions=(A.VIEW, A.EDIT, A.DELETE),
    hint="Geloeschtes wiederherstellen oder endgueltig entfernen",
    action_hints={
        A.EDIT: "Eintraege wiederherstellen.",
        A.DELETE: "Eintraege endgueltig entfernen.",
    },
)

DIAGNOSTICS = Resource(
    key="diagnostics",
    label="Diagnose",
    actions=(A.VIEW,),
    hint="Schemastand, Protokollintegritaet, Schluesselrechte",
)

LOGS_LIVE = Resource(
    key="logs_live",
    label="Laufendes Protokoll",
    actions=(A.VIEW,),
)

LOGS_HISTORY = Resource(
    key="logs_history",
    label="Protokollverlauf",
    actions=(A.VIEW, A.DELETE, A.EXPORT),
    hint="Rotierte und archivierte Protokolle",
    action_hints={A.DELETE: "Archivierte Tage vom Server entfernen."},
)

LOGS_AUDIT = Resource(
    key="logs_audit",
    label="Aenderungsprotokoll",
    actions=(A.VIEW, A.EXPORT),
    hint="Wer hat wann was geaendert",
)


def administration_area(*extra: Resource) -> Area:
    """Bereich "Verwaltung" -- Basis fuer beide Anwendungen."""
    return Area(
        key="administration",
        label="Verwaltung",
        icon="sliders",
        hint="Benutzer, Rechte, Systemeinstellungen. Ohne diesen Zugang bleibt der "
        "gesamte Verwaltungsbereich verborgen.",
        resources=(
            USERS,
            GROUPS,
            SETTINGS_SYSTEM,
            SETTINGS_LICENSE,
            SETTINGS_DIRECTORY,
            SETTINGS_WEB,
            SETTINGS_NETWORK,
            BACKUP,
            TRASH,
            DIAGNOSTICS,
            *extra,
        ),
    )


def observability_area(*extra: Resource) -> Area:
    """Bereich "Protokolle"."""
    return Area(
        key="observability",
        label="Protokolle",
        icon="terminal",
        resources=(LOGS_LIVE, LOGS_HISTORY, LOGS_AUDIT, *extra),
    )
