import io

from PIL import Image, ImageOps

# Kép-dekompressziós bomba elleni védelem (2026-09-24-i külső audit találata): alapból a PIL
# gyakorlatilag korlátlan méretű képet enged dekódolni - egy kis fájlméretű, de extrém nagy
# felbontású (pl. PNG) kép dekódolása memória-kimerítést okozhat. ~40 megapixel fölött a PIL
# DecompressionBombError-t dob, amit a tomorit_kepet() már meglévő except Exception ága elkap,
# és None-t ad vissza (a hívó elutasítja a feltöltést).
Image.MAX_IMAGE_PIXELS = 40_000_000

KEP_KITERJESZTESEK = {".jpg", ".jpeg", ".png", ".gif", ".webp"}


def kep_e(fajlnev: str) -> bool:
    """Eldönti a fájlnév kiterjesztése alapján, hogy a feltöltött fájl fénykép-e
    (szemben a PDF/DOCX/XLSX dokumentumokkal, amikhez nem nyúlunk)."""
    if not fajlnev or "." not in fajlnev:
        return False
    kiterjesztes = "." + fajlnev.rsplit(".", 1)[-1].lower()
    return kiterjesztes in KEP_KITERJESZTESEK


def tomorit_kepet(kep_bytes: bytes, max_meret_px: int = 2000, minoseg: int = 85) -> bytes | None:
    """Lekicsinyíti (max_meret_px a hosszabb oldalon) és JPEG-ként újratömöríti a képet.
    Az EXIF forgatási adatot a tényleges pixelekbe égeti, mielőtt az EXIF-et eldobná,
    így a telefonos fotók nem fordulnak el a tömörítés után.

    Ha a bemenet nem értelmezhető képként (sérült fájl VAGY tetszőleges más bináris tartalom
    .jpg/.png stb. néven feltöltve), None-t ad vissza - KORÁBBAN (2026-09-24-i külső biztonsági
    audit találata) ilyenkor az EREDETI, ellenőrizetlen bájtokat mentette volna el változatlanul,
    így tetszőleges tartalom kép gyanánt kerülhetett volna a feltöltők közé. Minden hívónak
    kötelező ellenőriznie a None visszatérési értéket, és elutasítania a feltöltést."""
    try:
        kep = Image.open(io.BytesIO(kep_bytes))
        kep = ImageOps.exif_transpose(kep)

        if kep.mode in ("RGBA", "P", "LA"):
            kep = kep.convert("RGB")

        szelesseg, magassag = kep.size
        if max(szelesseg, magassag) > max_meret_px:
            kep.thumbnail((max_meret_px, max_meret_px), Image.LANCZOS)

        kimenet = io.BytesIO()
        kep.save(kimenet, format="JPEG", quality=minoseg, optimize=True)
        return kimenet.getvalue()
    except Exception:
        return None
