"""Rechtematrix von TESM.

Bewusste Aenderungen gegenueber dem Vorgaenger (dort: R/W/E/D/X mit
bereichsabhaengiger Bedeutung):

* **Loeschen ist ein eigenes Recht.** Vorher deckte "Aendern" das Loeschen mit
  ab -- wer Geraete pflegen sollte, durfte sie zwangslaeufig auch entfernen.
* **Jede Spalte bedeutet ueberall dasselbe.** "Ausfuehren" ist immer "eine
  Aktion ausloesen", nicht mal Neustart und mal Export.
* **Geheimnisse sind ein eigenes Recht.** Wer Zugangsdaten *pflegen* darf, muss
  sie nicht im Klartext *sehen* duerfen. Zusaetzlich verlangt jede Anzeige eine
  frische Passwortbestaetigung.
* **Jede Einstellungsseite hat ihr eigenes Rechtepaar** -- im Vorgaenger lief
  die Lizenzseite ueber ``settings_system`` mit, was sich nicht getrennt
  vergeben liess.
"""

from __future__ import annotations

from tesm_core.rbac.common import (
    LOGS_HISTORY,
    LOGS_LIVE,
    administration_area,
    observability_area,
)
from tesm_core.rbac.model import Action, Area, PermissionTree, Resource, RolePreset

A = Action

DEVICES = Resource(
    key="devices",
    label="Clients",
    actions=(A.VIEW, A.CREATE, A.EDIT, A.DELETE, A.EXECUTE),
    hint="Ueberwachte PoE-Endgeraete",
    action_hints={
        A.EXECUTE: "PoE-Neustart eines Geraets manuell ausloesen. Der automatische "
        "Neustart bei Ausfall ist davon unabhaengig und laeuft immer.",
        A.DELETE: "Geraet in den Papierkorb legen.",
    },
)

SWITCHES = Resource(
    key="switches",
    label="Switche",
    actions=(A.VIEW, A.CREATE, A.EDIT, A.DELETE, A.EXECUTE),
    hint="Aruba-Switche und ihre Erreichbarkeit",
    action_hints={
        A.EXECUTE: "Browser-Terminal oeffnen und Kommandos auf dem Switch ausfuehren. "
        "Verlangt zusaetzlich eine frische Passwortbestaetigung; jede Sitzung wird "
        "vollstaendig protokolliert.",
    },
)

CREDENTIALS = Resource(
    key="credentials",
    label="Zugangsdaten",
    actions=(A.VIEW, A.CREATE, A.EDIT, A.DELETE, A.SECRETS),
    hint="Wiederverwendbare SSH-Logins",
    action_hints={
        A.VIEW: "Namen und Benutzer sehen -- nicht das Passwort.",
        A.SECRETS: "Passwort im Klartext anzeigen. Verlangt eine frische "
        "Passwortbestaetigung und wird protokolliert.",
    },
)

MAINTENANCE = Resource(
    key="maintenance",
    label="Wartung",
    actions=(A.VIEW, A.EXECUTE),
    hint="Paketaktualisierung und Neustart per SSH (lizenzpflichtiges Modul)",
    action_hints={A.EXECUTE: "Aktualisierung oder Neustart auf ausgewaehlten Geraeten starten."},
)

DHCP = Resource(
    key="dhcp",
    label="DHCP-Server",
    actions=(A.VIEW, A.EDIT, A.EXECUTE),
    hint="Kea-DHCP: Subnetze, Optionen, Reservierungen (lizenzpflichtiges Modul)",
    action_hints={
        A.EDIT: "Konfiguration aendern und schreiben.",
        A.EXECUTE: "Dienst installieren, starten oder stoppen.",
    },
)

FILESHARE = Resource(
    key="fileshare",
    label="Dateifreigaben",
    actions=(A.VIEW, A.CREATE, A.EDIT, A.DELETE),
    hint="SMB-Freigaben aus dem Verzeichnisdienst (lizenzpflichtiges Modul)",
    action_hints={
        A.CREATE: "Ordner anlegen und Dateien hochladen.",
        A.EDIT: "Umbenennen und verschieben.",
    },
)

LOGS_DHCP = Resource(
    key="logs_dhcp",
    label="Kea-DHCP-Protokoll",
    actions=(A.VIEW,),
)

MONITORING_AREA = Area(
    key="monitoring",
    label="Ueberwachung",
    icon="cpu",
    hint="Geraete, Switche, Zugangsdaten und Wartung. Ohne diesen Zugang bleibt der "
    "gesamte Bereich verborgen.",
    resources=(DEVICES, SWITCHES, CREDENTIALS, MAINTENANCE),
)

NETWORK_AREA = Area(
    key="network",
    label="Netzwerkdienste",
    icon="network",
    resources=(DHCP,),
)

FILES_AREA = Area(
    key="files",
    label="Dateifreigaben",
    icon="folder",
    resources=(FILESHARE,),
)

PERMISSIONS = PermissionTree(
    [
        MONITORING_AREA,
        NETWORK_AREA,
        FILES_AREA,
        observability_area(LOGS_DHCP),
        administration_area(),
    ]
)


ROLE_PRESETS: tuple[RolePreset, ...] = (
    RolePreset(
        key="viewer",
        name="Benutzer",
        description="Standardgruppe: Geraete und Switche ansehen, laufendes Protokoll lesen.",
        grants=(
            ("devices", (A.VIEW,)),
            ("switches", (A.VIEW,)),
            ("logs_live", (A.VIEW,)),
        ),
        is_default=True,
    ),
    RolePreset(
        key="operations",
        name="Betrieb",
        description="Geraete und Switche pflegen, Neustarts ausloesen, Wartung fahren.",
        grants=(
            ("devices", "*"),
            ("switches", (A.VIEW, A.CREATE, A.EDIT, A.EXECUTE)),
            ("credentials", (A.VIEW,)),
            ("maintenance", "*"),
            ("logs_live", (A.VIEW,)),
            ("logs_history", (A.VIEW,)),
            ("trash", (A.VIEW, A.EDIT)),
        ),
    ),
    RolePreset(
        key="support",
        name="Support",
        description="Erste Hilfe am Telefon: Status sehen, PoE-Neustart ausloesen.",
        grants=(
            ("devices", (A.VIEW, A.EXECUTE)),
            ("switches", (A.VIEW,)),
            ("logs_live", (A.VIEW,)),
        ),
    ),
    RolePreset(
        key="network",
        name="Netzwerk",
        description="DHCP und Host-Netzwerkeinstellungen.",
        grants=(
            ("dhcp", "*"),
            ("settings_network", "*"),
            ("logs_dhcp", (A.VIEW,)),
            ("devices", (A.VIEW,)),
            ("switches", (A.VIEW,)),
        ),
    ),
    RolePreset(
        key="auditor",
        name="Revision",
        description="Nur lesen -- inklusive Aenderungsprotokoll und Diagnose.",
        grants=(
            ("devices", (A.VIEW,)),
            ("switches", (A.VIEW,)),
            ("credentials", (A.VIEW,)),
            ("dhcp", (A.VIEW,)),
            ("users", (A.VIEW,)),
            ("groups", (A.VIEW,)),
            ("logs_live", (A.VIEW,)),
            ("logs_history", (A.VIEW, A.EXPORT)),
            ("logs_audit", (A.VIEW, A.EXPORT)),
            ("diagnostics", (A.VIEW,)),
            ("trash", (A.VIEW,)),
        ),
    ),
    RolePreset(
        key="administration",
        name="Administration",
        description="Benutzer, Gruppen und Einstellungen -- ohne Admin-Kennzeichen.",
        grants=(
            ("users", "*"),
            ("groups", "*"),
            ("settings_system", "*"),
            ("settings_license", "*"),
            ("settings_directory", (A.VIEW, A.EDIT, A.EXECUTE)),
            ("settings_web", "*"),
            ("settings_network", "*"),
            ("backup", (A.VIEW, A.EXECUTE, A.EXPORT)),
            ("trash", "*"),
            ("diagnostics", (A.VIEW,)),
            ("logs_audit", (A.VIEW,)),
        ),
    ),
)

__all__ = ["PERMISSIONS", "ROLE_PRESETS", "LOGS_DHCP"]
