"""
Validação do dígito verificador do número CNJ.

Formato: NNNNNNN-DD.AAAA.J.TR.OOOO
    NNNNNNN  número sequencial do processo, por unidade de origem e por ano
    DD       dígito verificador
    AAAA     ano do ajuizamento
    J        segmento do Judiciário (8 = Justiça dos Estados)
    TR       tribunal (19 = TJRJ)
    OOOO     unidade de origem

Regra (Res. CNJ 65/2008, mod 97 base 10 — ISO 7064):
    concatene NNNNNNN + AAAA + J + TR + OOOO + DD e o resto por 97 deve ser 1.

Serve para uma coisa muito específica e muito útil: um número de processo
inventado por um LLM quase sempre falha aqui. O modelo aprendeu o formato,
não a aritmética.

Não confunda com existência: um número pode ser válido e não corresponder a
processo nenhum. Isto é uma triagem barata, não uma verificação.

Rode com:
    python exemplos\validar_cnj.py
"""

import re

PADRAO = re.compile(r"^(\d{7})-(\d{2})\.(\d{4})\.(\d)\.(\d{2})\.(\d{4})$")


def validar_cnj(numero: str) -> bool:
    """Diz se o dígito verificador do número CNJ confere."""
    m = PADRAO.match(numero.strip())
    if not m:
        return False
    seq, dv, ano, segmento, tribunal, origem = m.groups()
    return int(seq + ano + segmento + tribunal + origem + dv) % 97 == 1


if __name__ == "__main__":
    # Os três primeiros foram inventados por um LLM; os dois últimos vieram da base.
    casos = [
        "0000123-45.2026.8.19.0002",
        "0000122-45.2026.8.19.0001",
        "0000121-45.2026.8.19.0003",
        "0000184-40.2026.8.19.0001",
        "0000116-27.2025.8.19.0001",
    ]
    for numero in casos:
        print("%s -> %s" % (numero, validar_cnj(numero)))
