import re
from datetime import date, datetime

from sqlalchemy.orm import Session

import models
from msz_logic import recompute_msz_classification

IMPORT_MEZOK = [
    ("telephely", "Telephely"),
    ("helyszin", "Helyszín"),
    ("gyarto", "Gyártó"),
    ("tipus", "Típus"),
    ("gyari_szam", "Gyári szám"),
    ("geptipus", "Géptípus"),
    ("uzemora", "Üzemóra"),
    ("leltari_szam", "Leltári szám"),
    ("teherbiras", "Teherbírás"),
    ("gyartas_datum", "Gyártás dátuma"),
    ("uzembe_helyezes_datum", "Üzembe helyezés dátuma"),
    ("statusz", "Státusz"),
    ("megjegyzes", "Megjegyzés"),
]

ERVENYES_STATUSZOK = [
    "Aktív", "Kivonva (javításra vár)", "Átszállítva másik telephelyre",
    "Végleg kivonva/Selejtezve", "Eladva", "Bérleti idő lejárt / Visszaadva"
]


def import_datum_parszolas(ertek):
    """Rugalmas dátum-értelmezés: valódi dátum objektum, szöveges dátum, vagy csak évszám is lehet."""
    if ertek is None or str(ertek).strip() == "":
        return None
    if isinstance(ertek, datetime):
        return ertek.date()
    if isinstance(ertek, date):
        return ertek
    szoveg = str(ertek).strip()
    for fmt in ("%Y-%m-%d", "%Y.%m.%d", "%Y.%m.%d.", "%d.%m.%Y", "%Y/%m/%d"):
        try:
            return datetime.strptime(szoveg, fmt).date()
        except ValueError:
            continue
    if re.fullmatch(r"\d{4}", szoveg):
        return date(int(szoveg), 1, 1)
    return None


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 import_statusz_parszolas(ertek):
    if not ertek:
        return "Aktív"
    szoveg = str(ertek).strip().lower()
    for s in ERVENYES_STATUSZOK:
        if s.lower() == szoveg:
            return s
    return "Aktív"


def import_site_keresese(company_id, nev, db: Session):
    if not nev or not str(nev).strip():
        return None
    return db.query(models.Site).filter(
        models.Site.company_id == company_id,
        models.Site.nev.ilike(str(nev).strip())
    ).first()


def import_szotar_bovites(company_id, kategoria, ertek, db: Session):
    if ertek and str(ertek).strip():
        tiszta = str(ertek).strip()
        letezo = db.query(models.Dictionary).filter(
            models.Dictionary.company_id == company_id,
            models.Dictionary.kategoria == kategoria,
            models.Dictionary.ertek.ilike(tiszta)
        ).first()
        if not letezo:
            db.add(models.Dictionary(company_id=company_id, kategoria=kategoria, ertek=tiszta))


def letrehoz_uj_gepet_importbol(adat, company_id, db: Session, current_user):
    site = import_site_keresese(company_id, adat.get("site_nev"), db)

    uj_gep = models.Machine(
        company_id=company_id,
        site_id=site.id if site else None,
        megnevezes=(adat.get("megnevezes") or None),
        gyarto=(adat.get("gyarto") or None),
        tipus=(adat.get("tipus") or None),
        gyari_szam=(adat.get("gyari_szam") or None),
        geptipus=(adat.get("geptipus") or None),
        leltari_szam=(adat.get("leltari_szam") or None),
        teherbiras=(adat.get("teherbiras") or None),
        uzemora=import_szam_parszolas(adat.get("uzemora")) or 0.0,
        gyartas_datum=import_datum_parszolas(adat.get("gyartas_datum")),
        uzembe_helyezes_datum=import_datum_parszolas(adat.get("uzembe_helyezes_datum")),
        statusz=import_statusz_parszolas(adat.get("statusz")),
        alapadat_megjegyzes=(adat.get("megjegyzes") or None),
    )
    db.add(uj_gep)
    db.flush()

    # A Csoportszámot sosem importáljuk - a meglévő logika számolja ki (Tervezett napi átlag + Terhelésfokozat alapján)
    recompute_msz_classification(uj_gep, {})

    import_szotar_bovites(company_id, "Gyarto", adat.get("gyarto"), db)
    import_szotar_bovites(company_id, "Tipus", adat.get("geptipus"), db)

    db.add(models.AuditLog(
        machine_id=uj_gep.id,
        user_id=current_user.id,
        field_name="ÚJ GÉP (Excel import)",
        old_value="-",
        new_value=f"Importálva Excelből. Gyári szám: {uj_gep.gyari_szam or '-'}"
    ))
    return uj_gep


def frissit_meglevo_gepet_importbol(gep, 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."""
    site = import_site_keresese(company_id, adat.get("site_nev"), db)
    if site:
        gep.site_id = site.id
    if adat.get("megnevezes"):
        gep.megnevezes = adat["megnevezes"]
    if adat.get("gyarto"):
        gep.gyarto = adat["gyarto"]
    if adat.get("tipus"):
        gep.tipus = adat["tipus"]
    if adat.get("geptipus"):
        gep.geptipus = adat["geptipus"]
    if adat.get("leltari_szam"):
        gep.leltari_szam = adat["leltari_szam"]
    if adat.get("teherbiras"):
        gep.teherbiras = adat["teherbiras"]

    uzemora_ertek = import_szam_parszolas(adat.get("uzemora"))
    if uzemora_ertek is not None:
        gep.uzemora = uzemora_ertek

    gyartas_datum = import_datum_parszolas(adat.get("gyartas_datum"))
    if gyartas_datum:
        gep.gyartas_datum = gyartas_datum

    uzembe_datum = import_datum_parszolas(adat.get("uzembe_helyezes_datum"))
    if uzembe_datum:
        gep.uzembe_helyezes_datum = uzembe_datum

    if adat.get("statusz"):
        gep.statusz = import_statusz_parszolas(adat["statusz"])

    if adat.get("megjegyzes"):
        gep.alapadat_megjegyzes = adat["megjegyzes"]

    import_szotar_bovites(company_id, "Gyarto", adat.get("gyarto"), db)
    import_szotar_bovites(company_id, "Tipus", adat.get("geptipus"), db)

    db.add(models.AuditLog(
        machine_id=gep.id,
        user_id=current_user.id,
        field_name="GÉP FRISSÍTVE (Excel import - felülírás)",
        old_value="-",
        new_value=f"Excel import alapján felülírva/kiegészítve. Gyári szám: {gep.gyari_szam or '-'}"
    ))
