from datetime import date, timedelta

from fastapi import APIRouter, Request, Depends
from fastapi.responses import HTMLResponse, RedirectResponse
from sqlalchemy.orm import Session

import models
from database import get_db
from security import (
    get_current_user, get_working_company_id, apply_user_data_scope_filter,
    is_machine_allowed, get_allowed_companies_list, safe_json_for_script, require_modul,
    van_e_tobb_modulja, sugo_engedelyezve
)
from msz_constants import compute_vizsgalati_esedekesseg
from msz_logic import (
    get_uzemora_beallitasok, build_naptar_esemenyek, build_diagram_adatok,
    get_vizsgalati_datum_kotelezo_mod
)
from templates_env import templates

router = APIRouter(dependencies=[Depends(require_modul("EMELOGEP"))])


def dashboard(
    request: Request,
    db: Session,
    current_user: models.User
):
    """A "/" útvonalat SZÁNDÉKOSAN nem ez a router szolgálja ki - a valódi route a main.py-ban
    van (lásd "gyoker_oldal"), mert a bejelentkezetlen látogatóknak a marketing kezdőlapot kell
    mutatnia, a bejelentkezetteknek pedig ezt a vezérlőpultot - ehhez a "/" elérésének a
    bejelentkezést kötelezővé tévő require_modul("EMELOGEP") router-szintű függősége ALÁ nem
    eshet. Ez a függvény innen, plain Python hívásként kerül meghívásra, feloldott
    request/db/current_user paraméterekkel."""
    working_company_id = get_working_company_id(current_user, request)

    is_master_company = False
    if working_company_id == 1 and current_user.role == "Admin":
        is_master_company = True

    lejart_gepek = []
    hamarosan_lejaro = []
    rendben_levo = []

    if not is_master_company:
        query = db.query(models.Machine).filter(
            models.Machine.company_id == working_company_id,
            models.Machine.statusz == "Aktív"
        )
        query = apply_user_data_scope_filter(query, current_user)
        gepek = query.all()

        mai_nap = date.today()
        figyelmezteto_hatar = mai_nap + timedelta(days=30)

        configs_by_geptipus = {
            c.geptipus: c for c in
            db.query(models.MachineTypeConfig).filter(models.MachineTypeConfig.company_id == working_company_id).all()
        }
        datum_kotelezo_mod = get_vizsgalati_datum_kotelezo_mod(working_company_id, db)

        for gep in gepek:
            gep.alerts = []
            config = configs_by_geptipus.get(gep.geptipus)
            rejtett_mezok = set(
                m.strip() for m in (config.rejtett_mezok or "").split(",") if m.strip()
            ) if config else set()

            gep.is_lejart = False
            gep.is_hamarosan = False

            kornyezet_valtozott = getattr(gep, 'kornyezet_megvaltozott', False)
            if kornyezet_valtozott:
                gep.alerts.append((
                    "Rendkívüli vizsgálat és ismételt üzembe helyezési eljárás szükséges (Környezetváltozás / Telephely átszállítás)!",
                    "danger"
                ))
                gep.is_lejart = True

            # --- SZIGORÚ DÁTUM ELLENŐRZÉS (A "Hiányzó dátum" anomália javítása) ---

            # 1. Üzembe helyezés - csak akkor jelzünk, ha ez a dátum nincs a géptípusnál "rejtett"-nek jelölve.
            if "uzembe_helyezes_datum" not in rejtett_mezok and not gep.uzembe_helyezes_datum:
                gep.alerts.append(("Hiányzik az Üzembe helyezés dátuma! A gép hivatalosan nem üzemeltethető.", "danger"))
                gep.is_lejart = True

            # 2. Szerkezeti/Fő-/Biztonsági felülvizsgálat esedékessége - a naptár/PDF/email-
            # riporttal közös MSZ 9750 / EBSZ számítással (hónap ÉS üzemóra alapján, amelyik
            # előbb bekövetkezik - l. compute_vizsgalati_esedekesseg).
            for e in compute_vizsgalati_esedekesseg(gep, mai_nap, config, datum_kotelezo_mod):
                cimke = {
                    "Szerkezeti vizsgálat": "Szerkezeti vizsgálat",
                    "Fővizsgálat": "Fővizsgálat",
                    "Időszakos biztonsági felülvizsgálat (EBSZ)": "Időszakos Bizt. felülvizsgálat",
                }.get(e["tipus"], e["tipus"])
                if e["allapot"] == "hianyzik":
                    gep.alerts.append((f"Nincs rögzítve {cimke} dátuma!", "danger"))
                    gep.is_lejart = True
                elif e["allapot"] == "lejart":
                    gep.alerts.append((f"Lejárt {cimke} ({e['esedekes']})", "danger"))
                    gep.is_lejart = True
                elif e["allapot"] == "hamarosan":
                    gep.alerts.append((f"Közeledő {cimke} ({e['esedekes']})", "warning"))
                    gep.is_hamarosan = True

            # --- ÚJ: KÖZÚTI FORGALOM (MŰSZAKI VIZSGA) FIGYELÉSE ---
            if getattr(gep, 'kozuti_forgalom', False):
                muszaki_datum = getattr(gep, 'kozuti_vizsga_datum', None)
                if muszaki_datum:
                    if muszaki_datum < mai_nap:
                        gep.alerts.append((f"Lejárt Műszaki vizsga ({muszaki_datum.strftime('%Y-%m-%d')})", "danger"))
                        gep.is_lejart = True
                    elif muszaki_datum <= figyelmezteto_hatar:
                        gep.alerts.append((f"Közeledő Műszaki vizsga érvényesség ({muszaki_datum.strftime('%Y-%m-%d')})", "warning"))
                        gep.is_hamarosan = True
                else:
                    gep.alerts.append(("Közúti forgalomban részt vesz, de hiányzik a Műszaki vizsga érvényességi dátuma!", "secondary"))
                    gep.is_lejart = True
            # ------------------------------------------------------

            # Csoportosítás a megjelenítéshez
            if gep.is_lejart:
                lejart_gepek.append(gep)
            elif gep.is_hamarosan:
                hamarosan_lejaro.append(gep)
            else:
                rendben_levo.append(gep)

    # --- ÚJ: DASHBOARD WIDGETEK (eseménynaptár + diagramok) - cégenként ki/bekapcsolható ---
    naptar_beallitas = db.query(models.Dictionary).filter(
        models.Dictionary.company_id == working_company_id,
        models.Dictionary.kategoria == "DashboardNaptarAktiv"
    ).first()
    naptar_aktiv = (naptar_beallitas.ertek == "True") if naptar_beallitas else True

    diagramok_beallitas = db.query(models.Dictionary).filter(
        models.Dictionary.company_id == working_company_id,
        models.Dictionary.kategoria == "DashboardDiagramokAktiv"
    ).first()
    diagramok_aktiv = (diagramok_beallitas.ertek == "True") if diagramok_beallitas else True

    diagram_tipusok_beallitas = db.query(models.Dictionary).filter(
        models.Dictionary.company_id == working_company_id,
        models.Dictionary.kategoria == "DashboardDiagramTipusok"
    ).first()
    if diagram_tipusok_beallitas:
        valasztott_diagramok = [t.strip() for t in diagram_tipusok_beallitas.ertek.split(",") if t.strip()]
    else:
        valasztott_diagramok = ["statusz", "gyarto", "geptipus", "kor"]

    naptar_esemenyek = {}
    diagram_adatok = {}
    if not is_master_company:
        if naptar_aktiv:
            naptar_esemenyek = build_naptar_esemenyek(gepek, date.today(), configs_by_geptipus, datum_kotelezo_mod)
        if diagramok_aktiv:
            diagram_adatok = build_diagram_adatok(
                gepek, valasztott_diagramok, date.today(),
                len(lejart_gepek), len(hamarosan_lejaro), len(rendben_levo)
            )
    # ------------------------------------------------------------------------------------

    cegek = get_allowed_companies_list(current_user, db, "EMELOGEP")

    # --- ÚJ: Napi csekklista kérdések lekérése ---
    napi_kerdesek = db.query(models.DailyCheckQuestion).filter(
        models.DailyCheckQuestion.company_id == working_company_id
    ).all()

    # --- ÚJ: Nyitott hibajegyek (Ticketek) lekérdezése a Dashboardra ---
    nyitott_ticketek = []
    if current_user.role in ["Admin", "Emelőgép ügyintéző", "Emelőgép szakértő", "Emelőgép vizsgáló"]:
        all_open_tickets = db.query(models.MaintenanceTicket).join(models.Machine).filter(
            models.Machine.company_id == working_company_id,
            models.MaintenanceTicket.statusz == "Nyitott"
        ).all()

        # Jogosultság szűrése (IDOR védelem), hogy mindenki csak a saját gépét lássa
        for t in all_open_tickets:
            if is_machine_allowed(t.machine, current_user):
                nyitott_ticketek.append(t)
    # -------------------------------------------------------------------

    # --- ÚJ: VIZSGÁN MEGBUKOTT (Korlátozással alkalmas / Nem alkalmas minősítés miatt
    # automatikusan kivont) gépek - a "Lejárt/Közeledő" listákból ezek kimaradnak, mert azok csak
    # az Aktív gépeket nézik, ezért itt külön, jól látható szekcióban jelezzük az EÜI-nek. ---
    vizsgan_megbukott_gepek = []
    if not is_master_company and current_user.role in ["Admin", "Emelőgép ügyintéző", "Emelőgép szakértő", "Emelőgép vizsgáló"]:
        osszes_megbukott = db.query(models.Machine).filter(
            models.Machine.company_id == working_company_id,
            models.Machine.statusz == "Kivonva (vizsgán nem megfelelés miatt)"
        ).all()
        vizsgan_megbukott_gepek = [g for g in osszes_megbukott if is_machine_allowed(g, current_user)]
    # -------------------------------------------------------------------

    # --- ÚJ: HR (GÉPKEZELŐK ÉS VIZSGÁLÓK) LEJÁRATOK FIGYELÉSE ---
    lejart_hr = []
    hamarosan_lejaro_hr = []

    # Csak azok lássák a HR riasztásokat, akiknek van joguk hozzá
    if current_user.role in ["Admin", "Emelőgép ügyintéző"]:
        dolgozok = db.query(models.User).filter(
            models.User.company_id == working_company_id,
            models.User.role.in_(["Felhasználó", "Emelőgép ügyintéző", "Emelőgép szakértő", "Emelőgép vizsgáló"])
        ).all()

        for d in dolgozok:
            # Orvosi alkalmassági
            if d.orvosi_alkalmassag_ervenyesseg:
                if d.orvosi_alkalmassag_ervenyesseg < mai_nap:
                    lejart_hr.append({"nev": d.username, "tipus": "Orvosi alkalmassági", "datum": d.orvosi_alkalmassag_ervenyesseg.strftime('%Y-%m-%d')})
                elif d.orvosi_alkalmassag_ervenyesseg <= figyelmezteto_hatar:
                    hamarosan_lejaro_hr.append({"nev": d.username, "tipus": "Orvosi alkalmassági", "datum": d.orvosi_alkalmassag_ervenyesseg.strftime('%Y-%m-%d')})

            # Jogosítvány
            if d.jogositvany_ervenyesseg:
                if d.jogositvany_ervenyesseg < mai_nap:
                    lejart_hr.append({"nev": d.username, "tipus": "Jogosítvány", "datum": d.jogositvany_ervenyesseg.strftime('%Y-%m-%d')})
                elif d.jogositvany_ervenyesseg <= figyelmezteto_hatar:
                    hamarosan_lejaro_hr.append({"nev": d.username, "tipus": "Jogosítvány", "datum": d.jogositvany_ervenyesseg.strftime('%Y-%m-%d')})

    # --- ÚJ: ÜZEMÓRA-ELTÉRÉS RIASZTÁSOK (MSZ 9750 mátrix drift) ---
    uzemora_riasztasok = []
    if not is_master_company:
        uzemora_mod, _ = get_uzemora_beallitasok(working_company_id, db)
        gepek_riasztassal = db.query(models.Machine).filter(
            models.Machine.company_id == working_company_id,
            models.Machine.statusz == "Aktív",
            models.Machine.uzemora_riasztas_szint != None
        ).all()
        for g in gepek_riasztassal:
            uzemora_riasztasok.append({
                "nev": g.megnevezes or "Ismeretlen gép",
                "gyari_szam": g.gyari_szam or "-",
                "uuid": g.uuid,
                "szint": g.uzemora_riasztas_szint,
                "automatikus": uzemora_mod == "AutomatikusModositas"
            })

    # --- ÚJ: SAJÁT CÉGES HASZNÁLATI STATISZTIKA (halkan, a rendszeradmin cégek-nézetéhez
    # hasonlóan) - hány eszköz és hány felhasználó van nyilvántartva ennél a cégnél. ---
    gepek_szama = 0
    gepek_licenc_max = None
    felhasznalok_szama_osszesen = 0
    felhasznalok_szama_szerepkorok = {}
    if not is_master_company:
        gepek_szama = db.query(models.Machine).filter(models.Machine.company_id == working_company_id).count()
        ceg = db.query(models.Company).filter(models.Company.id == working_company_id).first()
        gepek_licenc_max = ceg.licenc_max_gep if ceg else None
        ceges_dolgozok = db.query(models.User).filter(models.User.company_id == working_company_id).all()
        felhasznalok_szama_osszesen = len(ceges_dolgozok)
        for d in ceges_dolgozok:
            felhasznalok_szama_szerepkorok[d.role] = felhasznalok_szama_szerepkorok.get(d.role, 0) + 1

    return templates.TemplateResponse(
        request=request,
        name="dashboard.html",
        context={
            "user": current_user,
            "lejart": lejart_gepek,
            "hamarosan": hamarosan_lejaro,
            "rendben": rendben_levo,
            "working_company_id": working_company_id,
            "cegek": cegek,
            "is_master_company": is_master_company,
            "napi_kerdesek": napi_kerdesek,
            "nyitott_ticketek": nyitott_ticketek,
            "vizsgan_megbukott_gepek": vizsgan_megbukott_gepek,
            "lejart_hr": lejart_hr,
            "hamarosan_lejaro_hr": hamarosan_lejaro_hr,
            "uzemora_riasztasok": uzemora_riasztasok,
            "naptar_aktiv": naptar_aktiv,
            "diagramok_aktiv": diagramok_aktiv,
            "valasztott_diagramok": valasztott_diagramok,
            "naptar_esemenyek_json": safe_json_for_script(naptar_esemenyek),
            "diagram_adatok_json": safe_json_for_script(diagram_adatok),
            "gepek_szama": gepek_szama,
            "gepek_licenc_max": gepek_licenc_max,
            "felhasznalok_szama_osszesen": felhasznalok_szama_osszesen,
            "felhasznalok_szama_szerepkorok": felhasznalok_szama_szerepkorok,
            "tobb_modul_van": van_e_tobb_modulja(current_user, db),
            "sugo_e": sugo_engedelyezve(working_company_id, db),
        }
    )


@router.get("/hasznalati-utmutato", response_class=HTMLResponse)
def hasznalati_utmutato(
    request: Request,
    db: Session = Depends(get_db),
    current_user: models.User = Depends(get_current_user)
):
    """Az Emelőgép modul írott használati útmutatója - cégenként, a rendszeradmin által
    ki/bekapcsolható (lásd security.sugo_engedelyezve), ha a cég nem kéri, az oldal
    egyáltalán nem érhető el."""
    working_company_id = get_working_company_id(current_user, request)
    if not sugo_engedelyezve(working_company_id, db):
        return RedirectResponse(url="/", status_code=303)

    return templates.TemplateResponse(
        request=request,
        name="hasznalati_utmutato.html",
        context={
            "user": current_user,
            "working_company_id": working_company_id,
            "tobb_modul_van": van_e_tobb_modulja(current_user, db),
        }
    )
