"""
Gépfotók tömeges importálása gyári szám alapján.

Felismert fájlnév-formátum:  <gyári_szám>_<sorszám>.<jpg|jpeg|png>
    pl.: 29106_04.JPG  ->  gyári szám: "29106"

Használat (a szerveren, a projekt gyökeréből futtatva, ahol a database.py
automatikusan a MariaDB-hez kapcsolódik):

    python foto_bulk_import.py <fotók_mappája>                     -> PRÓBAFUTÁS (semmi nem íródik)
    python foto_bulk_import.py <fotók_mappája> --commit             -> tényleges feltöltés
    python foto_bulk_import.py <fotók_mappája> --company-id 2 --commit
                                                                     -> egy adott cégre szűkítve keres
                                                                        (ajánlott, ha több cégnél is
                                                                        előfordulhat azonos gyári szám)

A szkript mindig előbb próbafutásként fusson le (a --commit kapcsoló nélkül),
hogy a kihagyott/nem egyértelmű fájlokat még a tényleges mentés előtt át lehessen nézni!
"""
import argparse
import os
import re
import shutil
import sys

from database import SessionLocal
import models
from security import sanitize_filename

FAJLNEV_MINTA = re.compile(r"^(?P<gyari_szam>.+?)_\d+\.(jpg|jpeg|png)$", re.IGNORECASE)


def main():
    parser = argparse.ArgumentParser(description="Gépfotók tömeges importálása gyári szám alapján.")
    parser.add_argument("forras_mappa", help="A fotókat tartalmazó mappa elérési útja.")
    parser.add_argument("--company-id", type=int, default=None,
                         help="Csak ezen a cégen (company_id) belül keressen gyári szám egyezést.")
    parser.add_argument("--commit", action="store_true",
                         help="Tényleges mentés. Enélkül a szkript csak próbafutás (dry-run).")
    args = parser.parse_args()

    if not os.path.isdir(args.forras_mappa):
        print(f"HIBA: a megadott mappa nem létezik: {args.forras_mappa}")
        sys.exit(1)

    db = SessionLocal()

    fajlok = sorted(os.listdir(args.forras_mappa))
    sikeres = 0
    kihagyva = []

    for fajlnev in fajlok:
        illeszkedes = FAJLNEV_MINTA.match(fajlnev)
        if not illeszkedes:
            kihagyva.append((fajlnev, "A fájlnév nem illeszkedik a <gyariszam>_<sorszam>.jpg mintára"))
            continue

        gyari_szam = illeszkedes.group("gyari_szam").strip()

        query = db.query(models.Machine).filter(models.Machine.gyari_szam == gyari_szam)
        if args.company_id:
            query = query.filter(models.Machine.company_id == args.company_id)
        talalatok = query.all()

        if len(talalatok) == 0:
            kihagyva.append((fajlnev, f"Nincs gép ezzel a gyári számmal: '{gyari_szam}'"))
            continue

        if len(talalatok) > 1:
            reszletek = ", ".join(f"cég={m.company_id}/gép_id={m.id}" for m in talalatok)
            kihagyva.append((fajlnev, f"Több gép is illeszkedik a(z) '{gyari_szam}' gyári számra ({reszletek}) "
                                       f"- add meg a --company-id kapcsolót az egyértelműsítéshez!"))
            continue

        gep = talalatok[0]
        celmappa = f"uploads/{gep.company_id}/{gep.id}"
        safe_filename = sanitize_filename(fajlnev)
        cel_utvonal = f"{celmappa}/{safe_filename}"
        db_utvonal = "/" + cel_utvonal

        mar_letezik = db.query(models.File).filter(
            models.File.machine_id == gep.id,
            models.File.file_path == db_utvonal
        ).first()
        if mar_letezik:
            kihagyva.append((fajlnev, f"Már fel van töltve ehhez a géphez (gép id={gep.id}) - kihagyva, nincs duplikálás"))
            continue

        cimke = "[MENTVE]" if args.commit else "[PRÓBAFUTÁS]"
        print(f"{cimke} {fajlnev} -> gép id={gep.id} (gyári szám: '{gyari_szam}', cég id={gep.company_id}) -> {cel_utvonal}")

        if args.commit:
            os.makedirs(celmappa, exist_ok=True)
            forras_fajl = os.path.join(args.forras_mappa, fajlnev)
            shutil.copyfile(forras_fajl, cel_utvonal)

            uj_fajl = models.File(
                machine_id=gep.id,
                file_path=db_utvonal,
                file_type="Fénykép"
            )
            db.add(uj_fajl)

            log = models.AuditLog(
                machine_id=gep.id,
                user_id=None,
                field_name="DOKUMENTUM FELTÖLTÉS",
                old_value="-",
                new_value=f"Feltöltött dokumentum: Fénykép (tömeges import: {fajlnev})"
            )
            db.add(log)

            db.commit()

        sikeres += 1

    print("\n--- ÖSSZEGZÉS ---")
    ige = "feltöltve" if args.commit else "azonosítva (próbafutás - nincs mentve)"
    print(f"Sikeresen {ige}: {sikeres} db")
    print(f"Kihagyva: {len(kihagyva)} db")
    for fajlnev, ok in kihagyva:
        print(f"  - {fajlnev}: {ok}")

    if not args.commit and sikeres > 0:
        print("\nEz csak próbafutás volt, SEMMI nem került mentésre!")
        print("Ha az eredmény rendben van, futtasd újra a --commit kapcsolóval.")

    db.close()


if __name__ == "__main__":
    main()
