"""QR code: qrcode-library 3.x (8.3, SvgWriter) gera o mesmo conteudo que a 1.x (7.4, PNG) no navegador e no PDF."""
import json
import subprocess
import unittest
from pathlib import Path

RAIZ = Path(__file__).resolve().parents[3]
TMP = RAIZ / ".superpowers"
SCRIPT = "/var/www/html/accia-php83/tools/migracao-php83/php/qr.php"
URL = "http://localhost/performance/formulario-resposta/create-arvore?arvore_id=123"


def _sh(*args):
    return subprocess.run(args, capture_output=True, text=True, encoding="utf8")


def _gera(container, raiz, nome):
    r = _sh("docker", "exec", container, "php", "-d", "display_errors=stderr", SCRIPT, raiz, "/tmp/" + nome, URL)
    meta = json.loads((r.stdout.strip().splitlines() or ["{}"])[-1])
    for ext in ("html", "pdf"):
        _sh("docker", "cp", f"{container}:/tmp/{nome}.{ext}", str(TMP / f"{nome}.{ext}"))
    return meta


def _decodifica_png(png: Path) -> str:
    _sh("docker", "cp", str(png), f"php83_apache:/tmp/{png.name}")
    return _sh("docker", "exec", "php83_apache", "zbarimg", "-q", "--raw", "/tmp/" + png.name).stdout.strip()


def _qr_no_navegador(html: Path) -> str:
    from playwright.sync_api import sync_playwright
    png = html.with_suffix(".nav.png")
    with sync_playwright() as p:
        nav = p.chromium.launch()
        pag = nav.new_page()
        pag.goto(html.as_uri())
        pag.locator("#qr").screenshot(path=str(png))
        nav.close()
    return _decodifica_png(png)


def _qr_no_pdf(pdf: Path) -> str:
    _sh("docker", "cp", str(pdf), f"php83_apache:/tmp/{pdf.name}")
    _sh("docker", "exec", "php83_apache", "pdftoppm", "-r", "150", "-png", "-singlefile", "/tmp/" + pdf.name, "/tmp/" + pdf.stem + "_pdf")
    return _sh("docker", "exec", "php83_apache", "zbarimg", "-q", "--raw", f"/tmp/{pdf.stem}_pdf.png").stdout.strip()


class QrCodeTest(unittest.TestCase):
    def test_codigo_ativo_sem_api_1x(self):
        for rel in ("modules/performance/controllers/ArvoreController.php",
                    "modules/performance/controllers/DefaultController.php"):
            self.assertFalse("useForegroundColor(" in (RAIZ / rel).read_text(encoding="utf8", errors="replace"), rel)

    def test_navegador_e_pdf_iguais_ao_74(self):
        _gera("php74_val", "/var/www/html/accia", "qr_base")
        meta = _gera("php83_apache", "/var/www/html/accia-php83", "qr_alvo")
        self.assertEqual(meta.get("mime"), "image/svg+xml")
        self.assertEqual(_qr_no_navegador(TMP / "qr_base.html"), URL)
        self.assertEqual(_qr_no_navegador(TMP / "qr_alvo.html"), URL)
        self.assertEqual(_qr_no_pdf(TMP / "qr_base.pdf"), URL)
        self.assertEqual(_qr_no_pdf(TMP / "qr_alvo.pdf"), URL)


if __name__ == "__main__":
    unittest.main()
