from datetime import date

from sqlalchemy.orm import Session
from sqlalchemy import func

import models
from tuzvedelem_constants import OLTOANYAG_TIPUSOK, GYARTASI_SZABVANYOK
from excel_import_utils import import_datum_parszolas

TUZVEDELEM_IMPORT_MEZOK = [
    ("telephely", "Telephely"),
    ("epulet", "Épület"),
    ("szint", "Szint"),
    ("hely_leiras", "Helyszín (készenléti hely leírása)"),
    ("gyarto", "Gyártó"),
    ("tipus_nev", "Típus"),
    ("gyari_szam", "Gyári szám / Tételszám"),
    ("gyartasi_szabvany", "Gyártási szabvány"),
    ("oltoanyag_tipus", "Oltóanyag típusa"),
    ("oe_ertek", "Oltásteljesítmény (OE)"),
    ("toltettomeg_kg", "Töltettömeg (kg)"),
    ("gyartas_datum", "Gyártás dátuma"),
    ("statusz", "Státusz"),
]

ERVENYES_KESZULEK_STATUSZOK = ["Aktív", "Elszállítva karbantartásra", "Raktáron", "Selejtezve"]


def import_keszulek_statusz_parszolas(ertek):
    if not ertek:
        return "Aktív"
    szoveg = str(ertek).strip().lower()
    for s in ERVENYES_KESZULEK_STATUSZOK:
        if s.lower() == szoveg:
            return s
    return "Aktív"


def import_gyartasi_szabvany_parszolas(ertek):
    if not ertek:
        return None
    szoveg = str(ertek).strip()
    for sz in GYARTASI_SZABVANYOK:
        if sz.lower() == szoveg.lower():
            return sz
    return szoveg


def import_oltoanyag_tipus_parszolas(ertek):
    if not ertek:
        return None
    szoveg = str(ertek).strip()
    for o in OLTOANYAG_TIPUSOK:
        if o.lower() == szoveg.lower():
            return o
    return szoveg


def import_telephely_keresese(company_id, nev, db: Session):
    if not nev or not str(nev).strip():
        return None
    return db.query(models.TuzvedelmiTelephely).filter(
        models.TuzvedelmiTelephely.company_id == company_id,
        models.TuzvedelmiTelephely.nev.ilike(str(nev).strip())
    ).first()


def import_epulet_keresese(telephely, nev, db: Session):
    if not telephely or not nev or not str(nev).strip():
        return None
    return db.query(models.TuzvedelmiEpulet).filter(
        models.TuzvedelmiEpulet.telephely_id == telephely.id,
        models.TuzvedelmiEpulet.nev.ilike(str(nev).strip())
    ).first()


def import_hely_keresese_vagy_letrehozasa(company_id, telephely, epulet, szint, hely_leiras, db: Session):
    """A gép-importtól eltérően itt a helyet (ha megvan a telephely+épület, és van
    helyleírás) létre is hozzuk, ha még nem létezik - egy Excel-alapú tömeges felvitelnél
    nem várható el, hogy minden készenléti pont előre fel legyen véve kézzel."""
    if not telephely or not epulet or not hely_leiras or not str(hely_leiras).strip():
        return None

    szint_ertek = str(szint).strip() if szint and str(szint).strip() else None
    hely_leiras_tiszta = str(hely_leiras).strip()

    hely = db.query(models.KeszenletiHely).filter(
        models.KeszenletiHely.epulet_id == epulet.id,
        models.KeszenletiHely.company_id == company_id,
        models.KeszenletiHely.aktiv == True,
        func.lower(models.KeszenletiHely.hely_leiras) == hely_leiras_tiszta.lower(),
        models.KeszenletiHely.szint == szint_ertek,
    ).first()
    if hely:
        return hely

    hely = models.KeszenletiHely(
        company_id=company_id, telephely_id=telephely.id, epulet_id=epulet.id,
        szint=szint_ertek, hely_leiras=hely_leiras_tiszta,
    )
    db.add(hely)
    db.flush()
    return hely


def import_szam_parszolas(ertek):
    if ertek is None or str(ertek).strip() == "":
        return None
    try:
        return float(str(ertek).replace(",", "."))
    except ValueError:
        return None


def _hely_azonositasa(adat, company_id, db: Session):
    telephely = import_telephely_keresese(company_id, adat.get("telephely"), db)
    epulet = import_epulet_keresese(telephely, adat.get("epulet"), db) if telephely else None
    hely = import_hely_keresese_vagy_letrehozasa(
        company_id, telephely, epulet, adat.get("szint"), adat.get("hely_leiras"), db
    ) if epulet else None
    return hely


def letrehoz_uj_keszuleket_importbol(adat, company_id, db: Session, current_user):
    hely = _hely_azonositasa(adat, company_id, db)
    gyartas_datum = import_datum_parszolas(adat.get("gyartas_datum"))

    uj_keszulek = models.TuzoltoKeszulek(
        company_id=company_id,
        jelenlegi_hely_id=hely.id if hely else None,
        gyarto=(adat.get("gyarto") or None),
        tipus_nev=(adat.get("tipus_nev") or None),
        gyari_szam=(adat.get("gyari_szam") or None),
        gyartasi_szabvany=import_gyartasi_szabvany_parszolas(adat.get("gyartasi_szabvany")),
        oltoanyag_tipus=import_oltoanyag_tipus_parszolas(adat.get("oltoanyag_tipus")),
        oe_ertek=(adat.get("oe_ertek") or None),
        toltettomeg_kg=import_szam_parszolas(adat.get("toltettomeg_kg")),
        gyartas_datum=gyartas_datum,
        statusz=import_keszulek_statusz_parszolas(adat.get("statusz")),
        jovahagyva=True,
        letrehozo_user_id=current_user.id,
    )
    db.add(uj_keszulek)
    db.flush()

    if uj_keszulek.jelenlegi_hely_id:
        db.add(models.KeszulekTortenet(
            keszenleti_hely_id=uj_keszulek.jelenlegi_hely_id, keszulek_id=uj_keszulek.id, kezdete=date.today()
        ))

    return uj_keszulek


def frissit_meglevo_keszuleket_importbol(keszulek, adat, company_id, db: Session, current_user):
    """Felülírás: csak azokat a mezőket írja át, amikhez az Excel sorban tényleges érték tartozott."""
    hely = _hely_azonositasa(adat, company_id, db)
    if hely and hely.id != keszulek.jelenlegi_hely_id:
        keszulek.jelenlegi_hely_id = hely.id
        db.add(models.KeszulekTortenet(keszenleti_hely_id=hely.id, keszulek_id=keszulek.id, kezdete=date.today()))

    if adat.get("gyarto"):
        keszulek.gyarto = adat["gyarto"]
    if adat.get("tipus_nev"):
        keszulek.tipus_nev = adat["tipus_nev"]
    if adat.get("gyartasi_szabvany"):
        keszulek.gyartasi_szabvany = import_gyartasi_szabvany_parszolas(adat["gyartasi_szabvany"])
    if adat.get("oltoanyag_tipus"):
        keszulek.oltoanyag_tipus = import_oltoanyag_tipus_parszolas(adat["oltoanyag_tipus"])
    if adat.get("oe_ertek"):
        keszulek.oe_ertek = adat["oe_ertek"]

    toltettomeg_ertek = import_szam_parszolas(adat.get("toltettomeg_kg"))
    if toltettomeg_ertek is not None:
        keszulek.toltettomeg_kg = toltettomeg_ertek

    gyartas_datum = import_datum_parszolas(adat.get("gyartas_datum"))
    if gyartas_datum:
        keszulek.gyartas_datum = gyartas_datum

    if adat.get("statusz"):
        keszulek.statusz = import_keszulek_statusz_parszolas(adat["statusz"])
