import json
import os

from fastapi import APIRouter, Request, Depends, Form
from fastapi.responses import HTMLResponse, RedirectResponse
from sqlalchemy.orm import Session
from pypdf import PdfWriter

import models
from database import get_db
from security import get_current_user, get_working_company_id, is_machine_allowed, is_company_active, sugo_engedelyezve, require_modul, sanitize_filename
from templates_env import templates
from pdf_utils import Msz16226DokumentumPDF, rajzol_tablazat
from msz16226_logic import (
    SZEMELYEK_SZERVEZETEK_MEZOK, KEZELES_MODJA_OPCIOK, MUSZAKI_CSOPORTOK,
    derive_msz16226_tulajdonos_uzemeltetto, gep_msz16226_checklist_statusz, egyeb_dokumentumtipusok_checklist,
    build_msz16226_telephely_tortenet, MEGBIZOTT_SZAKASZOK, build_msz16226_javitasi_naplo,
    build_msz16226_vizsgalat_nyilvantartas, alkalmaz_muszaki_elotoltes, gep_van_e_msz16226_szukseg
)

router = APIRouter(dependencies=[Depends(require_modul("EMELOGEP"))])

SZERKESZTHETI_ROLES = ["Admin", "Emelőgép szakértő", "Emelőgép vizsgáló", "Emelőgép ügyintéző"]


def _rovid(szoveg, maxlen=60):
    """Szabad szöveges (user által beírt) mezők rövidítése a PDF egysoros cell()
    fejléceiben - ezek nem tördelnek, egy túl hosszú érték átfedést/kilógást okozna."""
    szoveg = szoveg or ""
    return szoveg if len(szoveg) <= maxlen else szoveg[:maxlen - 1] + "…"


def _gep_lekerese(uuid: str, working_company_id: int, current_user, db: Session):
    """Közös gép-lekérdezés + jogosultság-ellenőrzés a route-oknak. None-t ad vissza,
    ha bármi miatt nem elérhető a gép ennek a felhasználónak - ilyenkor a hívó fél
    redirectel a listára."""
    gep = db.query(models.Machine).filter(
        models.Machine.uuid == uuid,
        models.Machine.company_id == working_company_id
    ).first()

    if (
        not gep or gep.statusz != "Aktív" or not is_machine_allowed(gep, current_user)
        or not gep_van_e_msz16226_szukseg(gep, db)
    ):
        return None
    return gep


@router.get("/msz16226/{uuid}", response_class=HTMLResponse)
def msz16226_urlap(
    request: Request,
    uuid: str,
    db: Session = Depends(get_db),
    current_user: models.User = Depends(get_current_user)
):
    working_company_id = get_working_company_id(current_user, request)

    if not is_company_active(working_company_id, db):
        return RedirectResponse(url="/lista?inaktiv_ceg=1")

    gep = _gep_lekerese(uuid, working_company_id, current_user, db)
    if not gep:
        return RedirectResponse(url="/lista")

    try:
        dokumentum = db.query(models.Msz16226Dokumentum).filter(
            models.Msz16226Dokumentum.machine_id == gep.id
        ).first()

        adatok = {}
        if dokumentum and dokumentum.adatok_json:
            try:
                adatok = json.loads(dokumentum.adatok_json)
            except (TypeError, ValueError):
                adatok = {}

        szemelyek = adatok.get("szemelyek_szervezetek", {})
        egyeb_dokumentum_tipusok = adatok.get("egyeb_dokumentum_tipusok", [])
        muszaki, mukodtetoenergia = alkalmaz_muszaki_elotoltes(
            gep, adatok.get("muszaki_adatok", {}), adatok.get("mukodtetoenergia", "")
        )

        return templates.TemplateResponse(
            request=request,
            name="msz16226.html",
            context={
                "user": current_user,
                "gep": gep,
                "dokumentum": dokumentum,
                "szemelyek": szemelyek,
                "tulajdonos_uzemeltetto": derive_msz16226_tulajdonos_uzemeltetto(gep),
                "kezeles_modja_opciok": KEZELES_MODJA_OPCIOK,
                "kezeles_modja": adatok.get("kezeles_modja", ""),
                "mukodtetoenergia": mukodtetoenergia,
                "muszaki_csoportok": MUSZAKI_CSOPORTOK,
                "muszaki": muszaki,
                "gyartas_eve": gep.gyartas_datum.year if gep.gyartas_datum else None,
                "tartozekok": gep.tartozekok,
                "checklist": gep_msz16226_checklist_statusz(gep),
                "egyeb_checklist": egyeb_dokumentumtipusok_checklist(gep, egyeb_dokumentum_tipusok),
                "egyeb_dokumentum_tipusok": egyeb_dokumentum_tipusok,
                "telephely_tortenet": build_msz16226_telephely_tortenet(gep, db),
                "megbizott_szakaszok": MEGBIZOTT_SZAKASZOK,
                "megbizottak": adatok.get("megbizottak", {}),
                "javitasi_naplo": build_msz16226_javitasi_naplo(gep, db),
                "vizsgalat_nyilvantartas": build_msz16226_vizsgalat_nyilvantartas(gep, db),
                "korabbi_pdfek": sorted(
                    [f for f in gep.fajlok if f.file_type == "MSZ 16226 üzemviteli dokumentum"],
                    key=lambda f: f.uploaded_at, reverse=True
                ),
                "szerkesztheti": (
                    not current_user.csak_olvasas and current_user.role in SZERKESZTHETI_ROLES
                ),
                "sugo_e": sugo_engedelyezve(working_company_id, db)
            }
        )
    except Exception:
        return RedirectResponse(url=f"/lista?msz16226_hiba={gep.id}")


@router.post("/msz16226/{uuid}/mentes")
async def msz16226_mentese(
    request: Request,
    uuid: str,
    db: Session = Depends(get_db),
    current_user: models.User = Depends(get_current_user)
):
    working_company_id = get_working_company_id(current_user, request)

    if not is_company_active(working_company_id, db):
        return RedirectResponse(url="/lista?inaktiv_ceg=1", status_code=303)

    if current_user.csak_olvasas or current_user.role not in SZERKESZTHETI_ROLES:
        return RedirectResponse(url="/lista", status_code=303)

    gep = _gep_lekerese(uuid, working_company_id, current_user, db)
    if not gep:
        return RedirectResponse(url="/lista", status_code=303)

    form_data = await request.form()

    dokumentum = db.query(models.Msz16226Dokumentum).filter(
        models.Msz16226Dokumentum.machine_id == gep.id
    ).first()

    adatok = {}
    if dokumentum and dokumentum.adatok_json:
        try:
            adatok = json.loads(dokumentum.adatok_json)
        except (TypeError, ValueError):
            adatok = {}

    adatok["szemelyek_szervezetek"] = {
        mezo: (form_data.get(mezo) or "").strip() for mezo in SZEMELYEK_SZERVEZETEK_MEZOK
    }

    adatok["kezeles_modja"] = (form_data.get("kezeles_modja") or "").strip()
    adatok["mukodtetoenergia"] = (form_data.get("mukodtetoenergia") or "").strip()

    muszaki_adatok = {}
    for csoport in MUSZAKI_CSOPORTOK:
        csoport_ertekek = {}
        for kod, _cim, _mertekegyseg in csoport["mezok"]:
            form_name = f"muszaki__{csoport['kod']}__{kod}"
            csoport_ertekek[kod] = (form_data.get(form_name) or "").strip()
        muszaki_adatok[csoport["kod"]] = csoport_ertekek
    adatok["muszaki_adatok"] = muszaki_adatok

    egyeb_dokumentum_tipusok = [
        nev.strip() for nev in form_data.getlist("egyeb_dokumentum_tipus") if nev and nev.strip()
    ]
    adatok["egyeb_dokumentum_tipusok"] = egyeb_dokumentum_tipusok

    # 3.6/3.7 - ismétlődő-soros megbízott személyek/szervezetek. A form mezőnevek
    # indexeltek (megbizott__{csoport_kod}__{sor_index}__{mezo_kod}) - a sorok
    # számát/sorrendjét NEM feltételezzük folytonosnak, hanem a ténylegesen beküldött
    # indexekből olvassuk ki, hogy egy JS-ből eltávolított középső sor se okozzon gondot.
    megbizottak = {}
    for csoport in MEGBIZOTT_SZAKASZOK:
        prefix = f"megbizott__{csoport['kod']}__"
        indexek = set()
        for kulcs in form_data.keys():
            if kulcs.startswith(prefix):
                indexek.add(kulcs[len(prefix):].split("__", 1)[0])

        sorok = []
        for idx in sorted(indexek, key=lambda x: int(x) if x.isdigit() else 0):
            sor = {
                mezo_kod: (form_data.get(f"{prefix}{idx}__{mezo_kod}") or "").strip()
                for mezo_kod, _cim in csoport["mezok"]
            }
            if any(sor.values()):
                sorok.append(sor)
        megbizottak[csoport["kod"]] = sorok
    adatok["megbizottak"] = megbizottak

    if dokumentum:
        dokumentum.adatok_json = json.dumps(adatok, ensure_ascii=False)
        dokumentum.utolso_modosito_user_id = current_user.id
    else:
        dokumentum = models.Msz16226Dokumentum(
            machine_id=gep.id,
            adatok_json=json.dumps(adatok, ensure_ascii=False),
            letrehozo_user_id=current_user.id,
        )
        db.add(dokumentum)

    db.add(models.AuditLog(
        machine_id=gep.id,
        user_id=current_user.id,
        field_name="Üzemviteli dokumentum",
        old_value="-",
        new_value="Adatok mentve",
    ))

    db.commit()
    return RedirectResponse(url=f"/msz16226/{uuid}", status_code=303)


@router.post("/msz16226/{uuid}/jegyzokonyv-szam/{inspection_id}")
async def msz16226_jegyzokonyv_szam_mentese(
    request: Request,
    uuid: str,
    inspection_id: int,
    jegyzokonyv_szam_egyedi: str = Form(""),
    jegyzokonyv_szam: str = Form(""),
    db: Session = Depends(get_db),
    current_user: models.User = Depends(get_current_user)
):
    working_company_id = get_working_company_id(current_user, request)

    if not is_company_active(working_company_id, db):
        return RedirectResponse(url="/lista?inaktiv_ceg=1", status_code=303)

    if current_user.csak_olvasas or current_user.role not in SZERKESZTHETI_ROLES:
        return RedirectResponse(url="/lista", status_code=303)

    gep = _gep_lekerese(uuid, working_company_id, current_user, db)
    if not gep:
        return RedirectResponse(url="/lista", status_code=303)

    inspection = db.query(models.Inspection).filter(
        models.Inspection.id == inspection_id,
        models.Inspection.machine_id == gep.id
    ).first()
    if not inspection:
        return RedirectResponse(url=f"/msz16226/{uuid}", status_code=303)

    inspection.jegyzokonyv_szam_egyedi = bool(jegyzokonyv_szam_egyedi)
    inspection.jegyzokonyv_szam = jegyzokonyv_szam.strip() or None

    db.commit()
    return RedirectResponse(url=f"/msz16226/{uuid}", status_code=303)


@router.post("/msz16226/{uuid}/telephely-megjegyzes")
async def msz16226_telephely_megjegyzes_mentese(
    request: Request,
    uuid: str,
    audit_log_id: str = Form(""),
    mukodesi_terulet_megnevezese: str = Form(""),
    felelos_szervezet_nev: str = Form(""),
    felelos_szervezet_vezetoje: str = Form(""),
    megjegyzes: str = Form(""),
    db: Session = Depends(get_db),
    current_user: models.User = Depends(get_current_user)
):
    working_company_id = get_working_company_id(current_user, request)

    if not is_company_active(working_company_id, db):
        return RedirectResponse(url="/lista?inaktiv_ceg=1", status_code=303)

    if current_user.csak_olvasas or current_user.role not in SZERKESZTHETI_ROLES:
        return RedirectResponse(url="/lista", status_code=303)

    gep = _gep_lekerese(uuid, working_company_id, current_user, db)
    if not gep:
        return RedirectResponse(url="/lista", status_code=303)

    audit_log_id_val = int(audit_log_id) if audit_log_id else None

    # Biztonsági ellenőrzés: ha kaptunk audit_log_id-t, az tényleg ehhez a géphez
    # tartozó site_id-változás legyen - más gép AuditLog sorára ne lehessen hivatkozni.
    if audit_log_id_val is not None:
        tartozo_log = db.query(models.AuditLog).filter(
            models.AuditLog.id == audit_log_id_val,
            models.AuditLog.machine_id == gep.id,
            models.AuditLog.field_name == "site_id"
        ).first()
        if not tartozo_log:
            return RedirectResponse(url=f"/msz16226/{uuid}", status_code=303)

    letezo = db.query(models.MszTelephelyMegjegyzes).filter(
        models.MszTelephelyMegjegyzes.machine_id == gep.id,
        models.MszTelephelyMegjegyzes.audit_log_id == audit_log_id_val
    ).first()

    if letezo:
        letezo.mukodesi_terulet_megnevezese = mukodesi_terulet_megnevezese
        letezo.felelos_szervezet_nev = felelos_szervezet_nev
        letezo.felelos_szervezet_vezetoje = felelos_szervezet_vezetoje
        letezo.megjegyzes = megjegyzes
    else:
        db.add(models.MszTelephelyMegjegyzes(
            machine_id=gep.id,
            audit_log_id=audit_log_id_val,
            mukodesi_terulet_megnevezese=mukodesi_terulet_megnevezese,
            felelos_szervezet_nev=felelos_szervezet_nev,
            felelos_szervezet_vezetoje=felelos_szervezet_vezetoje,
            megjegyzes=megjegyzes,
        ))

    db.commit()
    return RedirectResponse(url=f"/msz16226/{uuid}", status_code=303)


@router.post("/msz16226/{uuid}/pdf")
def msz16226_pdf(
    request: Request,
    uuid: str,
    db: Session = Depends(get_db),
    current_user: models.User = Depends(get_current_user)
):
    # KRITIKUS (2026-10-03-i külső biztonsági audit, 2. kör): korábban GET volt és nem volt
    # szerepkör-ellenőrzése, miközben fájlt/AuditLog-ot ír és PDF-et generál a diszkre minden
    # hívásra - ez CSRF-fel (pl. <img src="...">) bárki nevében kiváltható mellékhatás volt.
    # Most POST + ugyanaz a jogosultság-ellenőrzés, mint a /mentes végpontnál.
    working_company_id = get_working_company_id(current_user, request)

    if not is_company_active(working_company_id, db):
        return RedirectResponse(url="/lista?inaktiv_ceg=1", status_code=303)

    if current_user.csak_olvasas or current_user.role not in SZERKESZTHETI_ROLES:
        return RedirectResponse(url="/lista", status_code=303)

    gep = _gep_lekerese(uuid, working_company_id, current_user, db)
    if not gep:
        return RedirectResponse(url="/lista", status_code=303)

    try:
        dokumentum = db.query(models.Msz16226Dokumentum).filter(
            models.Msz16226Dokumentum.machine_id == gep.id
        ).first()

        adatok = {}
        if dokumentum and dokumentum.adatok_json:
            try:
                adatok = json.loads(dokumentum.adatok_json)
            except (TypeError, ValueError):
                adatok = {}

        szemelyek = adatok.get("szemelyek_szervezetek", {})
        megbizottak = adatok.get("megbizottak", {})
        egyeb_dokumentum_tipusok = adatok.get("egyeb_dokumentum_tipusok", [])
        muszaki, mukodtetoenergia = alkalmaz_muszaki_elotoltes(
            gep, adatok.get("muszaki_adatok", {}), adatok.get("mukodtetoenergia", "")
        )
        tulaj = derive_msz16226_tulajdonos_uzemeltetto(gep)
        checklist = gep_msz16226_checklist_statusz(gep) + egyeb_dokumentumtipusok_checklist(gep, egyeb_dokumentum_tipusok)
        telephely_tortenet = build_msz16226_telephely_tortenet(gep, db)
        javitasi_naplo = build_msz16226_javitasi_naplo(gep, db)
        vizsgalat_nyilvantartas = build_msz16226_vizsgalat_nyilvantartas(gep, db)

        arculat_sorok = db.query(models.Dictionary).filter(
            models.Dictionary.company_id == working_company_id,
            models.Dictionary.kategoria.in_(["JegyzokonyvLogoUtvonal", "JegyzokonyvFejlecSzoveg"])
        ).all()
        arculat = {}
        for sor in arculat_sorok:
            if sor.kategoria == "JegyzokonyvLogoUtvonal":
                arculat["logo_utvonal"] = sor.ertek
            elif sor.kategoria == "JegyzokonyvFejlecSzoveg":
                arculat["fejlec_szoveg"] = sor.ertek

        pdf = Msz16226DokumentumPDF(gep, current_user.ceg, arculat=arculat)
        pdf.alias_nb_pages()
        pdf.add_page()

        # 1) Azonosítási adatok
        pdf.set_font("DejaVu", "B", 11)
        pdf.cell(0, 8, "Azonosítási adatok", ln=True)
        pdf.set_font("DejaVu", "", 9)
        pdf.cell(0, 6, f"Gyártó: {_rovid(gep.gyarto) or '-'} | Típusjelzés: {_rovid(gep.tipus) or '-'} | Gyári szám: {_rovid(gep.gyari_szam) or '-'}", ln=True)
        pdf.cell(0, 6, f"Első üzembehelyezés: {gep.uzembe_helyezes_datum or '-'} | Targonca típusa: {gep.geptipus or '-'}", ln=True)
        pdf.ln(3)

        # 2) Üzemeltetéssel kapcsolatos személyek, szervezetek
        pdf.set_font("DejaVu", "B", 11)
        pdf.cell(0, 8, "Üzemeltetéssel kapcsolatos személyek, szervezetek", ln=True)
        pdf.set_font("DejaVu", "", 9)
        pdf.cell(0, 6, f"Tulajdonos: {_rovid(tulaj['tulajdonos_nev'])} ({_rovid(tulaj['tulajdonos_elerhetoseg'])})", ln=True)
        if not tulaj["azonos"]:
            pdf.cell(0, 6, f"Üzemeltető: {_rovid(tulaj['uzemeltetto_nev'])} ({_rovid(tulaj['uzemeltetto_cim']) or '-'})", ln=True)
        pdf.cell(0, 6, f"Üzemeltetésért felelős: {_rovid(szemelyek.get('uzemeltetesert_felelos_nev')) or '-'} ({_rovid(szemelyek.get('uzemeltetesert_felelos_beosztas')) or '-'})", ln=True)
        pdf.cell(0, 6, f"Karbantartásért felelős: {_rovid(szemelyek.get('karbantartasert_felelos_nev')) or '-'} ({_rovid(szemelyek.get('karbantartasert_felelos_beosztas')) or '-'})", ln=True)
        pdf.cell(0, 6, f"Emelőgép-ügyintéző: {_rovid(szemelyek.get('emelogep_ugyintezo_nev')) or '-'} | {_rovid(szemelyek.get('emelogep_ugyintezo_beosztasi_hely')) or '-'} | {_rovid(szemelyek.get('emelogep_ugyintezo_elerhetoseg')) or '-'}", ln=True)
        pdf.ln(3)

        for csoport in MEGBIZOTT_SZAKASZOK:
            sorok = megbizottak.get(csoport["kod"], [])
            if not sorok:
                continue
            pdf.set_font("DejaVu", "B", 10)
            pdf.cell(0, 7, csoport["cim"], ln=True)
            oszlop_szel = [190 // len(csoport["mezok"])] * len(csoport["mezok"])
            rajzol_tablazat(pdf, oszlop_szel, [cim for _kod, cim in csoport["mezok"]],
                             [[sor.get(kod, "") for kod, _cim in csoport["mezok"]] for sor in sorok])
            pdf.ln(3)

        # 3) Műszaki jellemzők + tartozékok
        if pdf.get_y() > 240:
            pdf.add_page()
        pdf.set_font("DejaVu", "B", 11)
        pdf.cell(0, 8, "Műszaki jellemzők", ln=True)
        pdf.set_font("DejaVu", "", 9)
        pdf.cell(0, 6, f"Kezelés módja: {adatok.get('kezeles_modja') or '-'} | Működtetőenergia: {mukodtetoenergia or '-'}", ln=True)
        kezelo_magassag = f"{gep.kezeloi_munkahely_magassaga} mm" if gep.kezeloi_munkahely_magassaga else "-"
        pdf.cell(0, 6, f"Kezelő együtt emelkedik a kocsival/munkahellyel (EBSZ 7.2.10.): {'Igen' if gep.kezelo_egyutt_emelkedik else 'Nem'} | Kezelői munkahely magassága: {kezelo_magassag}", ln=True)
        pdf.ln(1)
        for csoport in MUSZAKI_CSOPORTOK:
            csoport_ertekek = muszaki.get(csoport["kod"], {})
            kitoltott = [(cim, csoport_ertekek.get(kod), mertekegyseg) for kod, cim, mertekegyseg in csoport["mezok"] if csoport_ertekek.get(kod)]
            if not kitoltott:
                continue
            pdf.set_font("DejaVu", "B", 9)
            pdf.cell(0, 6, csoport["cim"], ln=True)
            pdf.set_font("DejaVu", "", 8)
            for cim, ertek, mertekegyseg in kitoltott:
                pdf.cell(0, 5, f"{cim}: {ertek}{' ' + mertekegyseg if mertekegyseg else ''}", ln=True)
        if gep.tartozekok:
            pdf.ln(1)
            pdf.set_font("DejaVu", "B", 9)
            pdf.cell(0, 6, "Rendszeresített adapterek", ln=True)
            rajzol_tablazat(
                pdf, [70, 60, 60], ["Megnevezés", "Típus", "Gyári szám"],
                [[t.megnevezes, t.tipus, t.gyari_szam] for t in gep.tartozekok]
            )
        pdf.ln(3)

        # 4) Üzembe helyezés dokumentumai (checklist)
        if pdf.get_y() > 230:
            pdf.add_page()
        pdf.set_font("DejaVu", "B", 11)
        pdf.cell(0, 8, "Üzembe helyezés dokumentumai", ln=True)
        checklist_sorok = []
        for tetel in checklist:
            if tetel["forras"] == "deferred":
                statusz = "Külön kezelve"
            elif tetel["megvan"]:
                statusz = "Megvan"
            else:
                statusz = "Hiányzik"
            checklist_sorok.append([tetel["cim"], statusz, tetel.get("forras_reszlet") or "-"])
        rajzol_tablazat(pdf, [90, 25, 75], ["Dokumentum", "Státusz", "Forrás / megjegyzés"], checklist_sorok, align_lista=["L", "C", "L"])
        pdf.ln(3)

        # 5) Telephely-történet
        if pdf.get_y() > 230:
            pdf.add_page()
        pdf.set_font("DejaVu", "B", 11)
        pdf.cell(0, 8, "Üzemeltetésre vonatkozó adatok (telephely-történet)", ln=True)
        telephely_sorok = [
            [sor["site_nev"], sor["datum"], sor.get("mukodesi_terulet_megnevezese") or "-",
             sor.get("felelos_szervezet_nev") or "-", sor.get("megjegyzes") or "-"]
            for sor in telephely_tortenet
        ]
        rajzol_tablazat(pdf, [45, 25, 40, 40, 40], ["Telephely", "Dátum", "Működési terület", "Felelős szervezet", "Megjegyzés"], telephely_sorok)
        pdf.ln(3)

        # 6) Javítások, cserék
        if pdf.get_y() > 230:
            pdf.add_page()
        pdf.set_font("DejaVu", "B", 11)
        pdf.cell(0, 8, "Javítások, cserék (napló)", ln=True)
        javitas_sorok = [
            [e["idopont"].strftime("%Y-%m-%d"), e["cim"], e["reszletek"], e.get("user") or "-"]
            for e in javitasi_naplo
        ]
        rajzol_tablazat(pdf, [25, 45, 90, 30], ["Dátum", "Típus", "Leírás", "Rögzítette"], javitas_sorok)
        pdf.ln(3)

        # 7) Időszakos vizsgálatok nyilvántartása (3.10) - a 3.9 (Időszakos vizsgálatok
        # rendje) szándékosan nincs itt, azt külön kezeljük.
        if pdf.get_y() > 220:
            pdf.add_page()
        pdf.set_font("DejaVu", "B", 11)
        pdf.cell(0, 8, "Időszakos vizsgálatok nyilvántartása", ln=True)
        vizsgalat_sorok = [
            [sor["datum"], sor["tipus"], sor["uzemora"] if sor["uzemora"] is not None else "-",
             sor["eredmeny"], sor["vegzo_neve"], sor["jegyzokonyv_szam"]]
            for sor in vizsgalat_nyilvantartas
        ]
        rajzol_tablazat(
            pdf, [22, 35, 20, 40, 33, 30],
            ["Dátum", "Típus", "Üzemóra", "Minősítés", "Végezte", "Jkv. szám"],
            vizsgalat_sorok, align_lista=["C", "L", "C", "L", "L", "C"]
        )

        mappa = f"uploads/{working_company_id}/{gep.id}"
        os.makedirs(mappa, exist_ok=True)
        biztonsagos_azonosito = sanitize_filename(gep.gyari_szam or str(gep.id))
        alap_pdf_path = f"{mappa}/MSZ16226_Uzemviteli_dokumentum_{biztonsagos_azonosito}.pdf"
        pdf.output(alap_pdf_path)

        # Szkennelt dokumentumok beillesztése a végleges PDF-be (a checklist "megvan"
        # tételei közül azok, amiknek a kielégítő fájlja ténylegesen PDF - ugyanaz a
        # pypdf.PdfWriter-es minta, mint a general_jegyzokonyv()-ben a vizsgálói
        # bizonyítvány csatolásánál).
        vegso_pdf_path = alap_pdf_path
        beillesztendo_fajlok = []
        for tetel in checklist:
            if tetel.get("megvan") and tetel.get("fajlok"):
                legujabb = max(tetel["fajlok"], key=lambda f: f.uploaded_at)
                fizikai_ut = legujabb.file_path.lstrip("/")
                if fizikai_ut.lower().endswith(".pdf") and os.path.exists(fizikai_ut):
                    beillesztendo_fajlok.append(fizikai_ut)

        if beillesztendo_fajlok:
            vegso_pdf_path = f"{mappa}/Teljes_MSZ16226_dokumentum_{biztonsagos_azonosito}.pdf"
            merger = PdfWriter()
            merger.append(alap_pdf_path)
            for fizikai_ut in beillesztendo_fajlok:
                try:
                    merger.append(fizikai_ut)
                except Exception:
                    # Egy sérült/nem-szabványos PDF ne akassza meg a teljes összeállítást.
                    continue
            merger.write(vegso_pdf_path)
            merger.close()
            os.remove(alap_pdf_path)

        db.add(models.File(
            machine_id=gep.id,
            file_path="/" + vegso_pdf_path,
            file_type="MSZ 16226 üzemviteli dokumentum"
        ))
        db.add(models.AuditLog(
            machine_id=gep.id,
            user_id=current_user.id,
            field_name="MSZ 16226 ÜZEMVITELI DOKUMENTUM (PDF)",
            old_value="-",
            new_value="Legenerálva"
        ))
        db.commit()
    except Exception as e:
        db.rollback()
        print(f"❌ Hiba az MSZ 16226 dokumentum PDF generálása közben: {type(e).__name__}: {e}")
        return RedirectResponse(url=f"/msz16226/{uuid}", status_code=303)

    return RedirectResponse(url=f"/msz16226/{uuid}", status_code=303)
