"""php -l em todos os arquivos PHP proprios do accia, dentro de um container."""
import argparse
import json
import subprocess

from config import SAIDA

EXCLUIR_DIRS = ["vendor", "runtime", "web/assets", ".git", "node_modules", ".superpowers"]


def rodar(container: str, raiz_container: str) -> list:
    prune = " -o ".join(f"-path './{d}'" for d in EXCLUIR_DIRS)
    script = (
        rf"cd {raiz_container} && find . \( {prune} \) -prune -o -name '*.php' -print0 "
        "| xargs -0 -n1 -P8 sh -c 'php -l \"$0\" >/dev/null 2>/tmp/lint.$$ || { printf \"%s\t\" \"$0\"; tr \"\n\" \" \" </tmp/lint.$$; echo; }; rm -f /tmp/lint.$$'"
    )
    total = subprocess.run(
        ["docker", "exec", container, "sh", "-c",
         rf"cd {raiz_container} && find . \( {prune} \) -prune -o -name '*.php' -print | wc -l"],
        capture_output=True, text=True, check=True).stdout.strip()
    saida = subprocess.run(["docker", "exec", container, "sh", "-c", script], capture_output=True, text=True).stdout
    erros = []
    for linha in saida.splitlines():
        if "\t" in linha:
            arquivo, erro = linha.split("\t", 1)
            erros.append({"arquivo": arquivo, "erro": erro.strip()})
    return [{"total_arquivos": int(total)}] + erros


if __name__ == "__main__":
    ap = argparse.ArgumentParser()
    ap.add_argument("container")
    ap.add_argument("raiz", help="raiz do codigo dentro do container, ex. /var/www/html/accia")
    ap.add_argument("--rotulo", required=True)
    a = ap.parse_args()
    r = rodar(a.container, a.raiz)
    SAIDA.mkdir(parents=True, exist_ok=True)
    (SAIDA / f"02-lint-{a.rotulo}.json").write_text(json.dumps(r, ensure_ascii=False, indent=1), encoding="utf8")
    print(f"arquivos={r[0]['total_arquivos']} erros={len(r) - 1}")
    for e in r[1:20]:
        print(e["arquivo"], "|", e["erro"][:200])
