"""RENDSZERNAPLÓ oldal (v37) - csak a rendszeradminisztrátornak. Leírás: docs/RENDSZERNAPLO.md

    GET /rendszeradmin/naplo          - az összes cég összes eseménye, cégre / felhasználóra / kategóriára / dátumra / szövegre szűrhetően, 50 soros lapokkal
    GET /rendszeradmin/naplo/export   - a szűrt találatok CSV-je (legfeljebb EXPORT_MAX sor)

Mindkettő CSAK OLVAS (a GET nem írhat). A szűrők a lekérdezési szövegben vannak (a lapozás megőrzi őket); az érvénytelen érték nem hiba-oldal, hanem figyelmeztetés
és a szűrő figyelmen kívül marad. A logika a rendszernaplo_utils.py-ban van.
"""
import math
from datetime import datetime, timezone
from typing import Optional
from urllib.parse import urlencode

from fastapi import APIRouter, Depends, Request
from fastapi.responses import HTMLResponse, RedirectResponse, Response
from sqlalchemy.orm import Session

import models
import rendszernaplo_utils as rn
from database import get_db
from security import get_current_user, is_rendszeradminisztrator
from templates_env import templates

router = APIRouter()

MAX_AZONOSITO = 2147483647


def _azonosito(ertek: Optional[str]):
    """A szűrő-érték: egész azonosító, vagy 'nincs'; üres / érvénytelen -> (None, hiba)."""
    ertek = (ertek or "").strip()
    if not ertek:
        return None, None
    if ertek == "nincs":
        return "nincs", None
    try:
        n = int(ertek)
        if n < 0 or n > MAX_AZONOSITO:      # az adatbázis egész-oszlopa 32 bites: egy ennél nagyobb szám OverflowError-t (500-as hibát) okozna
            raise ValueError
        return n, None
    except ValueError:
        return None, True


def _szurok(ceg: str, felhasznalo: str, kategoria: str, tol: str, ig: str, q: str):
    """(szűrők szótára a lekérdezéshez, figyelmeztetések listája, a beírt értékek az űrlaphoz)."""
    figyelmeztetesek = []
    ceg_id, hiba = _azonosito(ceg)
    if hiba:
        figyelmeztetesek.append("Érvénytelen cég-szűrő, figyelmen kívül hagytuk.")
    user_id, hiba = _azonosito(felhasznalo)
    if hiba:
        figyelmeztetesek.append("Érvénytelen felhasználó-szűrő, figyelmen kívül hagytuk.")
    kat = kategoria if kategoria in rn.KATEGORIA_KODOK else None
    if kategoria and kat is None:
        figyelmeztetesek.append("Ismeretlen kategória, figyelmen kívül hagytuk.")
    tol_d, hiba = rn.datum(tol)
    if hiba:
        figyelmeztetesek.append(hiba + " (a '-tól' szűrő nem érvényes)")
    ig_d, hiba = rn.datum(ig)
    if hiba:
        figyelmeztetesek.append(hiba + " (az '-ig' szűrő nem érvényes)")
    if tol_d and ig_d and tol_d > ig_d:
        figyelmeztetesek.append("A '-tól' dátum későbbi, mint az '-ig': nincs találat.")
    kereses = (q or "").strip()[:rn.KERESES_MAX_HOSSZ]
    szurok = {"ceg": ceg_id, "felhasznalo": user_id, "kategoria": kat, "tol": tol_d, "ig": ig_d, "kereses": kereses}
    urlap = {"ceg": "" if ceg_id is None else str(ceg_id), "felhasznalo": "" if user_id is None else str(user_id), "kategoria": kat or "",
             "tol": tol_d.isoformat() if tol_d else "", "ig": ig_d.isoformat() if ig_d else "", "q": kereses}
    return szurok, figyelmeztetesek, urlap


@router.get("/rendszeradmin/naplo", response_class=HTMLResponse)
def naplo_oldal(
    request: Request,
    ceg: str = "", felhasznalo: str = "", kategoria: str = "", tol: str = "", ig: str = "", q: str = "", oldal: str = "1",
    db: Session = Depends(get_db),
    current_user: models.User = Depends(get_current_user)
):
    if not is_rendszeradminisztrator(current_user):
        return RedirectResponse(url="/valassz-modult", status_code=303)
    szurok, figyelmeztetesek, urlap = _szurok(ceg, felhasznalo, kategoria, tol, ig, q)
    lekerdezes = rn.szurt_lekerdezes(db, **szurok)
    osszes = lekerdezes.order_by(None).count()
    lapok = max(1, math.ceil(osszes / rn.LAP_MERET))
    try:
        lap = min(max(1, int(oldal)), lapok)
    except ValueError:
        lap = 1
    sorok = [rn.sor_adat(a) for a in lekerdezes.offset((lap - 1) * rn.LAP_MERET).limit(rn.LAP_MERET).all()]
    szuro_szoveg = urlencode({k: v for k, v in urlap.items() if v})
    return templates.TemplateResponse(
        request=request,
        name="rendszeradmin_naplo.html",
        context={
            "user": current_user, "sorok": sorok, "osszes": osszes, "lap": lap, "lapok": lapok, "lap_meret": rn.LAP_MERET,
            "urlap": urlap, "figyelmeztetesek": figyelmeztetesek, "szuro_szoveg": szuro_szoveg,
            "van_szuro": any(urlap.values()),
            "cegek": rn.cegek_listaja(db), "felhasznalok": rn.felhasznalok_listaja(db), "kategoriak": rn.KATEGORIAK,
            "export_max": rn.EXPORT_MAX,
        },
        headers={"Cache-Control": "no-store"},
    )


@router.get("/rendszeradmin/naplo/export")
def naplo_export(
    request: Request,
    ceg: str = "", felhasznalo: str = "", kategoria: str = "", tol: str = "", ig: str = "", q: str = "",
    db: Session = Depends(get_db),
    current_user: models.User = Depends(get_current_user)
):
    """A szűrt találatok CSV-je (pontosvesszős, UTF-8 BOM-mal; legfeljebb EXPORT_MAX sor, a legfrissebbektől)."""
    if not is_rendszeradminisztrator(current_user):
        return RedirectResponse(url="/valassz-modult", status_code=303)
    szurok, _, _ = _szurok(ceg, felhasznalo, kategoria, tol, ig, q)
    sorok = [rn.sor_adat(a) for a in rn.szurt_lekerdezes(db, **szurok).limit(rn.EXPORT_MAX).all()]
    fajlnev = "rendszernaplo_" + datetime.now(timezone.utc).strftime("%Y%m%d_%H%M") + ".csv"
    return Response(content=rn.csv_szoveg(sorok).encode("utf-8"), media_type="text/csv; charset=utf-8",
                    headers={"Content-Disposition": f'attachment; filename="{fajlnev}"', "Cache-Control": "private, no-store"})
