#!/usr/bin/env python3
"""
EmeLOG - okostelefonos / reszponzív FELMÉRŐ (v51, docs/MOBIL_TERV.md 6. fejezet)

Mit csinál: valódi böngészőben (Chromium, Playwright, érintős mobil emulációval) végiglátogatja a megadott oldalakat több képernyőszélességen, és
oldalanként méri:
  - vízszintes túlcsordulás (px): az oldal szélesebb-e a képernyőnél (a cél: 0),
  - a közös fejléc magassága (px) - a cél telefonon <= 110,
  - kis érintési célpontok: hány kattintható elem kisebb 40 px-nél (a/button/input/select/textarea) / összes kattintható elem,
  - a táblázatok száma (ebből table-responsive burkolóban).
Képernyőképet is ment (--ment). A kimenet nem ellenőrzés (nem része a tests/futtat.py-nak): a szeletenkénti újramérésre való.

Függőség (csak ehhez az eszközhöz): pip install playwright && playwright install chromium

Használat (fut a szerver, pl. http://127.0.0.1:8000):
  python tools/mobil_felmeres.py --alap http://127.0.0.1:8000 --felhasznalo "cegadmin@x.hu:Jelszo123" --szelesseg 360 390 430 820
  python tools/mobil_felmeres.py --felhasznalo "admin@ceg.hu:Jelszo" --utak /rendszeradmin /rendszeradmin/cegek --ment kepek/
Több felhasználó: a --felhasznalo többször megadható; minden oldalt mindegyikkel megnéz (a nem elérhető oldal átirányítás -> a lista látszik). Alapértelmezett
oldallista: a modulok fő oldalai (l. ALAP_UTAK). A kilépési kód 1, ha bármely oldalon van túlcsordulás (CI-ben is használható).
"""
import argparse, json, os, re, sys

ALAP_UTAK = ["/login", "/valassz-modult", "/", "/lista", "/uj-gep", "/gep-kereses", "/beallitasok", "/profil", "/hasznalati-utmutato",
             "/ebk/dashboard", "/ebk", "/ebk/ugyfelek", "/ebk/ellenorzesi-tetelek", "/ebk/beallitasok",
             "/vivu/dashboard", "/vivu", "/vivu/ellenorzesi-tetelek", "/vivu/beallitasok",
             "/tuzvedelem/dashboard", "/tuzvedelem", "/tuzvedelem/beallitasok", "/tuzvedelem/telephelyek", "/tuzvedelem/uj-keszulek",
             "/rendszeradmin", "/rendszeradmin/cegek", "/felhasznalok", "/rendszeradmin/naplo"]

MERO_JS = """() => {
  const W = document.documentElement.clientWidth;
  const tulcs = document.documentElement.scrollWidth - W;
  const szeles = [...document.querySelectorAll('body *')].filter(e => { const r = e.getBoundingClientRect();
      return r.width > 0 && r.right > W + 2 && getComputedStyle(e).position !== 'fixed'; }).slice(0, 3)
      .map(e => e.tagName.toLowerCase() + '.' + String(e.className || '').slice(0, 40));
  const cel = [...document.querySelectorAll('a,button,input:not([type=hidden]),select,textarea,[role=button]')]
      .filter(e => { const r = e.getBoundingClientRect(); return r.width > 0 && r.height > 0; });
  const kicsi = cel.filter(e => { const r = e.getBoundingClientRect(); return r.height < 40 || r.width < 40; }).length;
  const fej = document.querySelector('.el-fejlec');
  return {tulcsordulas: Math.max(0, tulcs), szeles, celpont: cel.length, kicsi,
          fejlec: fej ? Math.round(fej.getBoundingClientRect().height) : 0,
          tablak: document.querySelectorAll('table').length, burkolt: document.querySelectorAll('.table-responsive table').length};
}"""


def main():
    ap = argparse.ArgumentParser(description="EmeLOG okostelefonos felmérő (l. a fájl fejlécét)")
    ap.add_argument("--alap", default="http://127.0.0.1:8000", help="a futó szerver címe")
    ap.add_argument("--felhasznalo", action="append", default=[], help='"email:jelszo" (többször is); nélküle csak a belépés nélküli oldalak')
    ap.add_argument("--szelesseg", type=int, nargs="+", default=[360, 390, 430, 820])
    ap.add_argument("--utak", nargs="+", default=ALAP_UTAK)
    ap.add_argument("--tema", choices=["dark", "light"], default="dark")
    ap.add_argument("--ment", metavar="MAPPA", help="képernyőképek mentése ebbe a mappába")
    ap.add_argument("--json", metavar="FAJL", help="az eredmény JSON-ba írása")
    a = ap.parse_args()
    try:
        from playwright.sync_api import sync_playwright
    except ImportError:
        sys.exit("Hiányzik a playwright: pip install playwright && playwright install chromium")

    felhasznalok = [tuple(f.split(":", 1)) for f in a.felhasznalo] or [(None, None)]
    eredmeny, rossz = [], 0
    with sync_playwright() as p:
        b = p.chromium.launch()
        for w in a.szelesseg:
            for email, jelszo in felhasznalok:
                ctx = b.new_context(service_workers="block", viewport={"width": w, "height": 800}, has_touch=True, is_mobile=True)
                pg = ctx.new_page()
                pg.add_init_script(f"try{{localStorage.setItem('theme','{a.tema}')}}catch(e){{}}")
                if email:
                    pg.goto(a.alap + "/login"); pg.fill("input[name=email]", email); pg.fill("input[name=password]", jelszo)
                    pg.click("button[type=submit]"); pg.wait_for_timeout(1500)
                for ut in a.utak:
                    try:
                        r = pg.goto(a.alap + ut); pg.wait_for_timeout(400)
                        d = pg.evaluate(MERO_JS); d.update(szelesseg=w, felhasznalo=email or "-", ut=ut, allapot=r.status if r else None, vegso=pg.url.replace(a.alap, ""))
                        if a.ment:
                            os.makedirs(a.ment, exist_ok=True)
                            pg.screenshot(path=os.path.join(a.ment, f"{w}_{re.sub(r'[^a-z0-9]+', '_', ut.lower()).strip('_') or 'root'}_{(email or 'anon').split('@')[0]}.png"))
                    except Exception as e:      # egy hibás oldal ne állítsa le a felmérést
                        d = {"szelesseg": w, "felhasznalo": email or "-", "ut": ut, "hiba": str(e)[:100], "tulcsordulas": 0}
                    eredmeny.append(d)
                    if d.get("tulcsordulas", 0) > 0: rossz += 1
                    print(f"{w:>4}px {str(d['felhasznalo'])[:14]:<14} {ut:<38} túlcs. {d.get('tulcsordulas', '?'):>4}  fejléc {d.get('fejlec', '?'):>4}  kicsi {d.get('kicsi', '?')}/{d.get('celpont', '?')}  táblák {d.get('burkolt', '?')}/{d.get('tablak', '?')}"
                          + (f"  szélesek: {d['szeles']}" if d.get("tulcsordulas", 0) > 0 else "") + (f"  HIBA: {d['hiba']}" if d.get("hiba") else ""))
                ctx.close()
        b.close()
    if a.json:
        with open(a.json, "w", encoding="utf-8") as f: json.dump(eredmeny, f, ensure_ascii=False, indent=1)
    print(f"\n{len(eredmeny)} mérés, ebből túlcsordulással: {rossz}")
    sys.exit(1 if rossz else 0)


if __name__ == "__main__":
    main()
