﻿"""Compara respostas HTTP (7.4 x 8.3) do martinelli: mesmo codigo, mesmo banco.

Nao segue redirecionamentos (para comparar o status real da rota).
"""
import re
import urllib.error
import urllib.request
from html.parser import HTMLParser

PORTA74 = 8094
PORTA83 = 8093
HOST = "martinelli.localhost"

URLS = [
    "/site/login",
    "/site/index",
    "/site/landing",
    "/site/landing-mobile",
    "/site/politica-cookies",
    "/site/lista-cidade",
    "/site/termos-uso",
    "/licenca/index",
    "/licenca/notificacao",
    "/campanha/index",
    "/log/index",
    "/log-url/index",
    "/contrato/index",
    "/contrato/dashboard1",
    "/contrato/dashboard2",
    "/financial/default/index",
    "/financial/tipo/index",
    "/financial/bp-tipo/index",
    "/financial/dre-tipo/index",
    "/financial/default/dre",
    "/financial/default/fluxo-caixa",
    "/inventario-dados/index",
    "/inventario-pergunta/index",
    "/inventario-resposta/index",
    "/inventario-categoria/index",
    "/operational/ocorrencias/index",
    "/operational/dashboard/index",
    "/performance/aplicacao/index",
    "/performance/cliente/index",
    "/performance/contexto/index",
    "/performance/coleta/index",
    "/performance/vertical/index",
    "/performance/plano-acao/index",
    "/performance/parecer-tecnico-coleta/index",
    "/performance/anexo/index",
    "/risk/risco-cenario/index",
    "/risk/risco-modelo/index",
    "/task/task/index",
    "/user/index",
    "/template/index",
    "/versionamento/index",
    "/wildcard/index",
    "/termos-uso/index",
    "/gpslgpd/index",
    "/sabine5/index",
    "/helper/index",
    "/parceiro/index",
]


class NoRedirect(urllib.request.HTTPRedirectHandler):
    def redirect_request(self, req, fp, code, msg, headers, newurl):
        return None


OPENER = urllib.request.build_opener(NoRedirect)


def get(port, path):
    req = urllib.request.Request(f"http://localhost:{port}{path}", headers={"Host": HOST})
    try:
        with OPENER.open(req, timeout=60) as r:
            return r.status, r.read().decode("utf-8", errors="replace")
    except urllib.error.HTTPError as e:
        return e.code, e.read().decode("utf-8", errors="replace")
    except Exception as e:
        return 0, f"ERRO {type(e).__name__}: {e}"


class Norm(HTMLParser):
    def __init__(self):
        super().__init__()
        self.partes = []

    def handle_starttag(self, tag, attrs):
        d = {k: (v or "") for k, v in attrs}
        for k in ("value", "content", "name"):
            d.pop(k, None)
        self.partes.append(f"<{tag} {sorted(d.items())}>")

    def handle_data(self, data):
        s = " ".join(data.split())
        if s:
            self.partes.append(s)


def norm(html):
    p = Norm()
    try:
        p.feed(html)
    except Exception:
        pass
    txt = " ".join(p.partes)
    txt = re.sub(r"\d{2}/\d{2}/\d{4}[ T]?\d{0,2}:?\d{0,2}", "DATA", txt)
    txt = re.sub(r"\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}(:\d{2})?", "DATA", txt)
    return txt


def main():
    iguais = dif = 0
    for u in URLS:
        s74, b74 = get(PORTA74, u)
        s83, b83 = get(PORTA83, u)
        n74, n83 = norm(b74), norm(b83)
        if s74 == s83 and n74 == n83:
            iguais += 1
            print(f"OK   {s74:3d}/{s83:3d}  {u}", flush=True)
        else:
            dif += 1
            print(f"DIF  {s74:3d}/{s83:3d}  {u}  (len {len(n74)} vs {len(n83)})", flush=True)
            if n74[:160] != n83[:160]:
                print(f"     74: {n74[:150]}")
                print(f"     83: {n83[:150]}")
    print(f"\niguais={iguais} diferentes={dif} total={len(URLS)}")


if __name__ == "__main__":
    main()
