"""Navigationsbaum von TESM.

Sichtbarkeit steht am Eintrag selbst -- nicht in einer zentralen if/elif-Kette
wie im Vorgaenger. Lizenzpflichtige Vollmodule verschwinden vollstaendig aus der
Navigation; die zugehoerigen Routen pruefen dasselbe zusaetzlich serverseitig
(ein direkter Aufruf per URL wird ebenso abgewiesen).
"""

from __future__ import annotations

from typing import Any

from tesm_core.extension import core
from tesm_core.nav import NavItem, NavTree


def _module(name: str):
    """Bedingung: Vollmodul lizenziert?"""

    def check(_user: Any) -> bool:
        manager = core().license
        return manager is None or manager.module_active(name)

    return check


def _has_fileshare_mounts(user: Any) -> bool:
    """Dateifreigaben erscheinen, wenn es etwas zu sehen oder zu tun gibt.

    Zu sehen: eingebundene Freigaben dieses Benutzers. Zu tun: die Verwaltung
    der Zuordnungen. Der zweite Fall fehlte -- damit war die einzige Seite, auf
    der Zuordnungen entstehen, nur ueber die Adresszeile erreichbar, und wer sie
    nicht kannte, hielt die Funktion fuer nicht vorhanden.
    """
    if not user.is_authenticated:
        return False
    if not _module("fileshare")(user):
        return False
    if user.has("fileshare.edit"):
        return True
    from .services import fileshare

    return fileshare.has_mounts(user.id)


NAVIGATION = NavTree(
    [
        NavItem(key="index", label="Statusuebersicht", icon="grid", endpoint="dashboard.index"),
        NavItem(
            key="monitoring",
            label="Ueberwachung",
            icon="cpu",
            children=(
                NavItem(
                    key="devices",
                    label="Clients",
                    icon="cpu",
                    endpoint="devices.overview",
                    permissions=("devices.view",),
                ),
                NavItem(
                    key="switches",
                    label="Switche",
                    icon="switch",
                    endpoint="switches.overview",
                    permissions=("switches.view",),
                ),
                NavItem(
                    key="credentials",
                    label="Zugangsdaten",
                    icon="key",
                    endpoint="credentials.overview",
                    permissions=("credentials.view",),
                ),
                NavItem(
                    key="hostkeys",
                    label="Host-Schluessel",
                    icon="shield",
                    endpoint="hostkeys.overview",
                    permissions=("devices.view", "switches.view"),
                ),
                NavItem(
                    key="maintenance",
                    label="Wartung",
                    icon="wrench",
                    endpoint="maintenance.overview",
                    permissions=("maintenance.view", "maintenance.execute"),
                    condition=_module("maintenance"),
                ),
            ),
        ),
        NavItem(
            key="dhcp",
            label="DHCP-Server",
            icon="network",
            endpoint="dhcp.overview",
            permissions=("dhcp.view", "dhcp.edit", "dhcp.execute"),
            condition=_module("dhcp"),
        ),
        NavItem(
            key="fileshare",
            label="Dateifreigaben",
            icon="folder",
            condition=_has_fileshare_mounts,
            children=(
                NavItem(
                    key="fileshare_browse",
                    label="Meine Freigaben",
                    icon="folder",
                    endpoint="fileshare.browse",
                    permissions=("fileshare.view",),
                ),
                NavItem(
                    key="fileshare_mappings",
                    label="Zuordnungen",
                    icon="link",
                    endpoint="fileshare.mappings",
                    permissions=("fileshare.edit",),
                ),
            ),
        ),
        NavItem(
            key="observability",
            label="Protokolle",
            icon="terminal",
            children=(
                NavItem(
                    key="logs_live",
                    label="Laufend",
                    icon="terminal",
                    endpoint="logs.live",
                    permissions=("logs_live.view",),
                ),
                NavItem(
                    key="logs_history",
                    label="Verlauf",
                    icon="clock",
                    endpoint="logs.history",
                    permissions=("logs_history.view", "logs_history.export"),
                ),
                NavItem(
                    key="logs_audit",
                    label="Aenderungen",
                    icon="history",
                    endpoint="logs.audit_view",
                    permissions=("logs_audit.view", "logs_audit.export"),
                ),
                NavItem(
                    key="logs_dhcp",
                    label="Kea-DHCP",
                    icon="network",
                    endpoint="tesmlogs.dhcp",
                    permissions=("logs_dhcp.view",),
                    condition=_module("dhcp"),
                ),
                NavItem(
                    key="restarts",
                    label="Neustarts",
                    icon="power",
                    endpoint="tesmlogs.restarts",
                    permissions=("devices.view",),
                ),
            ),
        ),
        NavItem(
            key="administration",
            label="Verwaltung",
            icon="sliders",
            children=(
                NavItem(
                    key="users",
                    label="Benutzer",
                    icon="users",
                    endpoint="admin.users",
                    permissions=("users.view",),
                ),
                NavItem(
                    key="groups",
                    label="Gruppen und Rechte",
                    icon="shield-users",
                    endpoint="admin.groups",
                    permissions=("groups.view",),
                ),
                NavItem(
                    key="settings_system",
                    label="System",
                    icon="sliders",
                    endpoint="settings.system",
                    permissions=("settings_system.view",),
                ),
                NavItem(
                    key="settings_network",
                    label="Netzwerk",
                    icon="network",
                    endpoint="hostsettings.network",
                    permissions=("settings_network.view",),
                ),
                NavItem(
                    key="settings_web",
                    label="Webserver und TLS",
                    icon="server",
                    endpoint="hostsettings.web",
                    permissions=("settings_web.view",),
                ),
                NavItem(
                    key="settings_directory",
                    label="Verzeichnisdienst",
                    icon="users",
                    endpoint="hostsettings.directory_settings",
                    permissions=("settings_directory.view",),
                ),
                NavItem(
                    key="settings_license",
                    label="Lizenz",
                    icon="key",
                    endpoint="license.overview",
                    # Bewusst immer erreichbar, auch ohne gueltige Lizenz --
                    # sonst liesse sich eine neue Lizenz nie einspielen.
                    permissions=("settings_license.view",),
                ),
                NavItem(
                    key="backup",
                    label="Sicherung",
                    icon="transfer",
                    endpoint="backup.overview",
                    permissions=("backup.view", "backup.export", "backup.execute"),
                ),
                NavItem(
                    key="trash",
                    label="Papierkorb",
                    icon="trash",
                    endpoint="trash.overview",
                    permissions=("trash.view",),
                ),
                NavItem(
                    key="diagnostics",
                    label="Diagnose",
                    icon="info",
                    endpoint="diagnostics.overview",
                    permissions=("diagnostics.view",),
                ),
            ),
        ),
    ]
)
