"""Tűzvédelmi modul jogszabályi konstansai: szakvizsga-kategóriák (45/2011. (XII. 7.) BM
rendelet 1. melléklete) és a tűzoltó készülékek karbantartási menetrendje (54/2014. (XII. 5.)
BM rendelet - OTSZ 18. és 16. melléklete, valamint az 50/2011. (XII. 20.) BM rendelet 9. melléklete)."""

# A 45/2011. (XII. 7.) BM rendelet 1. melléklete - tűzvédelmi szakvizsgához kötött
# foglalkozási ágak és munkakörök. Egyelőre csak a 7. kategória (TK karbantartó) aktív
# a rendszerben, a többi a modul későbbi bővítéséhez van előkészítve.
SZAKVIZSGA_KATEGORIAK = {
    1: "Hegesztők és az építőipari tevékenység során nyílt lánggal járó munkát végzők",
    2: "Fokozottan tűz- vagy robbanásveszélyes anyagok tárolását/feldolgozását végzők",
    3: "Éghető gáz lefejtését, töltését, kiszolgálását végzők",
    4: "Tűzgátló, füstgátló nyílászáró-szerkezetek beépítését, felülvizsgálatát, karbantartását végzők",
    5: "Tűzoltó-vízforrások felülvizsgálatát végzők",
    6: "Pirotechnikai szakbolti eladók, raktárkezelők, terméküzemeltetők",
    7: "Tűzoltó készülékek karbantartását végzők",
    8: "Beépített tűzjelző berendezések kivitelezését, karbantartását, felülvizsgálatát végzők",
    9: "Beépített tűzoltó berendezések kivitelezését, karbantartását, felülvizsgálatát végzők",
    10: "Beépített tűzjelző berendezéseket tervezők, üzembe helyező mérnökök",
    11: "Beépített tűzoltó berendezéseket tervezők, üzembe helyező mérnökök",
    12: "Tűzállóságot növelő bevonati rendszerek alkalmazását, karbantartását végzők",
    13: "Beépített hő- és füstelvezető rendszerek telepítését, felülvizsgálatát, karbantartását végzők",
    14: "Erősáramú berendezések időszakos felülvizsgálatát végzők",
    15: "Tűzgátló tömítések beépítését, felülvizsgálatát, karbantartását végzők",
    16: "Tűzállóságot növelő burkolatok beépítését, karbantartását végzők",
}

# Egyelőre implementált (a felhasználón kiválasztható) kategóriák - a modul bővítésekor
# egyszerűen fel kell venni ide a további kódokat.
AKTIV_SZAKVIZSGA_KATEGORIAK = [7]

# A szakvizsgák érvényességi ideje (45/2011. BM rendelet) - minden kategóriára egységesen.
SZAKVIZSGA_ERVENYESSEG_EV = 5

# --- Tűzoltó készülék gyártási szabványok - az alapkarbantartás ciklusidejét ez dönti el ---
SZABVANY_MSZ_1040 = "MSZ 1040"
SZABVANY_MSZ_EN_3 = "MSZ EN 3"
SZABVANY_MSZ_EN_1866 = "MSZ EN 1866"

GYARTASI_SZABVANYOK = [SZABVANY_MSZ_1040, SZABVANY_MSZ_EN_3, SZABVANY_MSZ_EN_1866]

OLTOANYAG_TIPUSOK = ["Por", "Víz", "Hab", "CO2", "Gáz (halon-helyettesítő)"]


def alap_karbantartas_ciklus_honap(gyartasi_szabvany: str, oltoanyag_tipus: str) -> int:
    """OTSZ 18. melléklet lábjegyzete alapján: az MSZ 1040 szerint gyártott, NEM CO2-os
    készülékek alapkarbantartása 6 havonta esedékes; minden más eset (MSZ EN 3 / MSZ EN 1866,
    illetve az MSZ 1040 szerinti CO2-os készülék) 12 havonta."""
    if gyartasi_szabvany == SZABVANY_MSZ_1040 and oltoanyag_tipus != "CO2":
        return 6
    return 12


def eletciklus_esemeny_tipusa(kor_ev: int, co2: bool) -> str:
    """Az 50/2011. BM rendelet 9. melléklete szerinti, a készülék korához (gyártástól eltelt
    egész évek száma) igazodó karbantartási menetrend: melyik esemény esedékes ebben az
    "évfordulóban" - ez helyettesíti (nem egészíti ki) az adott évi alapkarbantartást.
    A szén-dioxidos készülékeknél nincs középkarbantartás, és nincs 20 éves élettartam-korlát
    (helyette a nyomáspróba érvényessége az irányadó - lásd nyp_ervenyesseg_datuma mező)."""
    if kor_ev == 10:
        return "TELJES_KORU"
    if not co2 and kor_ev > 0 and kor_ev % 10 == 5:
        return "KOZEP"
    if not co2 and kor_ev > 0 and kor_ev % 20 == 0:
        return "ELETTARTAM_VEGE"
    return "ALAP"


# OTSZ 265. § (2): az élettartam-hosszabbítás csak a 25 kg és annál nagyobb töltettömegű
# készülékeknél lehetséges, alkalmanként 5-5 évvel, legfeljebb kétszer.
ELETTARTAM_HOSSZABBITAS_TOLTETTOMEG_HATAR_KG = 25
ELETTARTAM_HOSSZABBITAS_EV = 5
ELETTARTAM_HOSSZABBITAS_MAX_ALKALOM = 2
ALAP_ELETTARTAM_EV = 20

# --- OTSZ 16. melléklet 1. táblázat: oltóanyagegység (OE) <-> tűzosztály ---
OE_TUZOSZTALY = {
    1: "5A / 21B", 2: "8A / 34B", 3: "– / 55B", 4: "13A / 70B", 5: "– / 89B",
    6: "21A / 113B", 9: "27A / 144B", 10: "34A / –", 12: "43A / 183B", 15: "55A / 233B",
    16: "– / IB", 17: "– / IIB", 18: "– / IIIB", 19: "– / IVB",
}

# --- OTSZ 16. melléklet 2. táblázat: alapterület (m²) -> szükséges OE, általános /
# fokozottan tűz- és robbanásveszélyes besorolás szerint ---
OE_ALAPTERULET_LEPCSOK = [
    (50, 2, 6), (100, 3, 9), (200, 4, 12), (300, 5, 15), (400, 6, 18),
    (500, 7, 21), (600, 8, 24), (700, 9, 27), (800, 10, 30), (900, 11, 33), (1000, 12, 36),
]


def szukseges_oe_alapterulet_alapjan(alapterulet_m2: float, robbanasveszelyes: bool) -> int:
    """OTSZ 16. melléklet 2. táblázata: az alapterület alapján javasolt minimális OE-igény.
    1000 m² felett minden további megkezdett 250 m²-enként +2 (általános) / +6 (robbanásveszélyes)."""
    if not alapterulet_m2 or alapterulet_m2 <= 0:
        return 0
    if alapterulet_m2 <= 1000:
        for hatar, oe_alt, oe_robb in OE_ALAPTERULET_LEPCSOK:
            if alapterulet_m2 <= hatar:
                return oe_robb if robbanasveszelyes else oe_alt
        return 0
    tobblet_m2 = alapterulet_m2 - 1000
    tobblet_lepcso = -(-tobblet_m2 // 250)  # felfelé kerekítés (minden megkezdett 250 m²)
    alap_oe = 36 if robbanasveszelyes else 12
    lepcsonkenti_novekmeny = 6 if robbanasveszelyes else 2
    return int(alap_oe + tobblet_lepcso * lepcsonkenti_novekmeny)


# --- Épület szintbeállítás: pinceszintek száma / földszint-változat / emeletek száma ---
# A "földszint-változat" azért külön beállítás (nem csak egy fix "Földszint" szint), mert
# egyes épületeknél a földszint felett közvetlenül egy félemelet vagy mezzanine szint van,
# ami a készülék-elhelyezés szempontjából külön szintnek számít.
FOLDSZINT_VALTOZATOK = {
    "FOLDSZINT": "Csak földszint",
    "FOLDSZINT_FELEMELET": "Földszint + félemelet",
    "FOLDSZINT_MEZZANIN": "Földszint + mezzanine szint",
}
ALAP_FOLDSZINT_VALTOZAT = "FOLDSZINT"

_FOLDSZINT_SZINTEK = {
    "FOLDSZINT": ["Földszint"],
    "FOLDSZINT_FELEMELET": ["Földszint", "Félemelet"],
    "FOLDSZINT_MEZZANIN": ["Földszint", "Mezzanin szint"],
}


def szint_lista(pinceszintek: int, foldszint_valtozat: str, emeletek: int) -> list:
    """Az épület szintbeállításai alapján generált, sorrendben (legalulról felfelé) listázott
    szint-elnevezések - ebből épül fel a készülék felvitelekor választható "Szint" legördülő."""
    pinceszintek = pinceszintek or 0
    emeletek = emeletek or 0
    szintek = [f"Pince -{i}" for i in range(pinceszintek, 0, -1)]
    szintek += _FOLDSZINT_SZINTEK.get(foldszint_valtozat or ALAP_FOLDSZINT_VALTOZAT, _FOLDSZINT_SZINTEK[ALAP_FOLDSZINT_VALTOZAT])
    szintek += [f"Emelet {i}" for i in range(1, emeletek + 1)]
    return szintek
