"""TESM-eigene Protokollansichten: Kea-DHCP und Neustarts.

Die generischen Ansichten (laufend, Verlauf, Aenderungen) liegen im Kern --
sie sind in beiden Anwendungen identisch.
"""

from __future__ import annotations

from flask import Blueprint, abort, render_template, request
from tesm_core.auth.models import permission_required
from tesm_core.db import Database
from tesm_core.extension import core, db

from ..services import kea, monitor

bp = Blueprint("tesmlogs", __name__, url_prefix="/protokolle")

MAX_TAIL_LINES = 2000


@bp.get("/kea")
@permission_required("logs_dhcp.view")
def dhcp():
    extension = core()
    if extension.license is not None and not extension.license.module_active("dhcp"):
        abort(404)
    sysops = extension.sysops
    lines: list[str] = []
    error = ""
    if sysops is not None and sysops.available:
        result = sysops.read_privileged_file(kea.LOG_PATH)
        if result.ok:
            lines = result.stdout.splitlines()[-MAX_TAIL_LINES:]
        else:
            error = result.message
    else:
        error = "Systemhelfer nicht verfuegbar."
    return render_template("tesm/logs_kea.html", lines=lines, path=kea.LOG_PATH, error=error)


@bp.get("/neustarts")
@permission_required("devices.view")
def restarts():
    """Alle Neustarts -- ueber den PoE-Port und per Befehl aus der Wartung.

    Frueher hiess diese Seite "PoE-Vorgaenge" und zeigte nur die eine Haelfte.
    Ein Geraet, das die Wartung per ``reboot`` neu gestartet hatte, fehlte in
    der Neustart-Historie vollstaendig -- obwohl genau dort jemand nachsieht,
    der wissen will, warum ein Geraet weg war.
    """
    method = (request.args.get("methode") or "").strip()
    if method and method not in monitor.METHOD_LABELS:
        method = ""
    sql = (
        "SELECT e.*, d.name AS device_name FROM restart_events e "
        "LEFT JOIN devices d ON d.id = e.device_id "
    )
    params: tuple[object, ...] = ()
    if method:
        sql += "WHERE e.method = ? "
        params = (method,)
    sql += "ORDER BY e.ts DESC LIMIT 300"
    return render_template(
        "tesm/logs_restarts.html",
        rows=Database.all(db(), sql, params),
        method=method,
        methods=tuple(monitor.METHOD_LABELS.items()),
        method_labels=monitor.METHOD_LABELS,
    )
