"""Tűzvédelmi modul - tűzoltó készülékek esedékesség-számítása. Az emelőgépes
compute_vizsgalati_esedekesseg (msz_logic.py) mintájára: külön-külön követett dátumok,
"lejart/hamarosan/rendben" állapot, naptár-nézethez/dashboardhoz."""

from datetime import date, timedelta

from msz_constants import add_months
from tuzvedelem_constants import (
    alap_karbantartas_ciklus_honap,
    eletciklus_esemeny_tipusa,
    ELETTARTAM_HOSSZABBITAS_EV,
    ELETTARTAM_HOSSZABBITAS_TOLTETTOMEG_HATAR_KG,
    ALAP_ELETTARTAM_EV,
)

FIGYELMEZTETO_NAPOK = 60


def _allapot(esedekes, mai_nap):
    if esedekes is None:
        return "ismeretlen"
    if esedekes < mai_nap:
        return "lejart"
    if esedekes <= mai_nap + timedelta(days=FIGYELMEZTETO_NAPOK):
        return "hamarosan"
    return "rendben"


def _eletciklus_kezdete(keszulek):
    """A készülék "korát" a gyártói ellenőrzés kezdetétől (ha van), különben a gyártás
    dátumától számítjuk."""
    if keszulek.gyartoi_ellenorzes and keszulek.gyartoi_ellenorzes_kezdete:
        return keszulek.gyartoi_ellenorzes_kezdete
    return keszulek.gyartas_datum


def _kovetkezo_evfordulo_datum(kezdete, ev: int):
    """A kezdete dátumtól számított N. évforduló naptári dátuma (hónap/nap-pontosan)."""
    return add_months(kezdete, ev * 12)


def compute_tuzoltokeszulek_esedekesseg(keszulek, mai_nap: date, hosszabbitasok=None):
    """Egységesen visszaadja egy tűzoltó készülék esedékességi állapotát: a következő
    esedékes karbantartás típusát (ALAP/KOZEP/TELJES_KORU) és dátumát, valamint - ha
    releváns - az élettartam-vége / meghosszabbítás és a CO2 nyomáspróba állapotát.
    A hosszabbitasok egy ElettartamHosszabbitas lista (a hívó tölti fel, mert külön tábla)."""
    hosszabbitasok = hosszabbitasok or []
    kezdete = _eletciklus_kezdete(keszulek)
    co2 = (keszulek.oltoanyag_tipus == "CO2")

    if not kezdete:
        return {
            "kor_ev": None, "co2": co2,
            "kovetkezo_esemeny": None, "kovetkezo_esedekesseg": None, "allapot": "ismeretlen",
            "nyp_allapot": None, "elettartam_allapot": None,
        }

    kor_ev = (mai_nap - kezdete).days // 365

    # --- CO2: nincs 20 éves élettartam-korlát, helyette a nyomáspróba érvényessége számít ---
    nyp_allapot = None
    if co2:
        nyp_allapot = {
            "ervenyesseg": keszulek.nyp_ervenyesseg_datuma,
            "allapot": _allapot(keszulek.nyp_ervenyesseg_datuma, mai_nap),
        }

    # --- Élettartam vége (nem vonatkozik CO2-re) ---
    elettartam_allapot = None
    if not co2:
        elettartam_hatarido = add_months(kezdete, ALAP_ELETTARTAM_EV * 12)
        aktiv_hosszabbitasok = sorted(
            [h for h in hosszabbitasok if h.ervenyes_meddig], key=lambda h: h.ervenyes_meddig
        )
        if aktiv_hosszabbitasok:
            elettartam_hatarido = aktiv_hosszabbitasok[-1].ervenyes_meddig

        hosszabbithato = (keszulek.toltettomeg_kg or 0) >= ELETTARTAM_HOSSZABBITAS_TOLTETTOMEG_HATAR_KG
        elettartam_allapot = {
            "hatarido": elettartam_hatarido,
            "allapot": _allapot(elettartam_hatarido, mai_nap),
            "hosszabbithato": hosszabbithato and len(aktiv_hosszabbitasok) < 2,
            "hosszabbitasok_szama": len(aktiv_hosszabbitasok),
        }

    # --- Alap karbantartás: a legutóbbi alap/közép/teljes körű eseménytől számítva
    # (a magasabb szintű munka "reseteli" az alap ciklust is) ---
    ciklus_honap = alap_karbantartas_ciklus_honap(keszulek.gyartasi_szabvany, keszulek.oltoanyag_tipus)
    utolso_datumok = [d for d in [
        keszulek.utolso_alap_karbantartas,
        keszulek.utolso_kozep_karbantartas,
        keszulek.utolso_teljes_korbe,
    ] if d]
    alap_bazis = max(utolso_datumok) if utolso_datumok else kezdete
    alap_esedekes = add_months(alap_bazis, ciklus_honap)

    # --- Közép karbantartás (nincs CO2-nél): 5, 15, 25... év, a legutóbbitól a következő pont ---
    kozep_esedekes = None
    if not co2:
        n = 5
        while True:
            jelolt = _kovetkezo_evfordulo_datum(kezdete, n)
            if not keszulek.utolso_kozep_karbantartas or jelolt > keszulek.utolso_kozep_karbantartas:
                kozep_esedekes = jelolt
                break
            n += 10

    # --- Teljes körű: a 10. évben (a jelenlegi jogszabályi menetrend csak ezt az egy
    # pontot rögzíti - életartam-hosszabbítás esetén ezt admin kézzel felülbírálhatja) ---
    teljes_koru_esedekes = None
    if not keszulek.utolso_teljes_korbe:
        teljes_koru_esedekes = _kovetkezo_evfordulo_datum(kezdete, 10)

    # A három közül a legsürgősebb (legkorábbi) adja a "következő esedékes esemény"-t
    jeloltek = [("ALAP", alap_esedekes)]
    if kozep_esedekes:
        jeloltek.append(("KOZEP", kozep_esedekes))
    if teljes_koru_esedekes:
        jeloltek.append(("TELJES_KORU", teljes_koru_esedekes))
    jeloltek = [j for j in jeloltek if j[1]]
    kovetkezo_tipus, kovetkezo_datum = min(jeloltek, key=lambda j: j[1])

    return {
        "kor_ev": kor_ev,
        "co2": co2,
        "kovetkezo_esemeny": kovetkezo_tipus,
        "kovetkezo_esedekesseg": kovetkezo_datum,
        "allapot": _allapot(kovetkezo_datum, mai_nap),
        "nyp_allapot": nyp_allapot,
        "elettartam_allapot": elettartam_allapot,
    }
