"""
Output template: canonical dict → DataJud CNJ format

Serializa o canonical para o formato oficial da API pública DataJud (CNJ).
Documentação: https://datajud-wiki.cnj.jus.br/api-publica/

Diferença estrutural crítica:
    DataJud é um documento por instância judicial.
    Processos com múltiplas instâncias (ex: 1º + 2º grau) geram
    uma lista com um documento por instância.

Uso:
    result = normalizar_processo(payload, output_template="datajud")
    # → list[dict]  (um dict por instância)

Limitações por sentido de conversão:
    Escavador → DataJud: perde valor_causa quando não há orgao_julgador_codigo
                          (campo não existe no Escavador, só no DataJud nativo)
    DataJud → DataJud:   round-trip quase perfeito (campos extras preservados)
"""

_GRAU_INT_TO_STR: dict[int, str] = {
    1: "G1",
    2: "G2",
    3: "G3",
}


def serialize(canonical: dict, etl_version: str) -> list[dict]:
    """
    Canonical dict → lista de documentos DataJud (um por instância).

    Retorna lista porque DataJud é um documento por instância judicial,
    enquanto o canonical pode conter múltiplas instâncias.
    """
    fonte_origem = canonical.get("_fonte_origem", "desconhecido")
    nivel_sigilo = canonical.get("nivel_sigilo")
    if nivel_sigilo is None:
        nivel_sigilo = 1 if canonical.get("segredo_justica") else 0

    documentos = []
    for inst in canonical.get("instancias", []):
        grau_int = inst.get("grau", 1)
        grau_str = _GRAU_INT_TO_STR.get(grau_int, f"G{grau_int}")

        # Classe
        classe_obj: dict = {}
        if inst.get("classe_raw") or inst.get("classe"):
            classe_obj["nome"] = inst.get("classe_raw") or inst.get("classe")
        if inst.get("classe_codigo"):
            classe_obj["codigo"] = inst["classe_codigo"]

        # Assuntos
        assuntos = [
            {k: v for k, v in {
                "codigo": a.get("id") or a.get("codigo"),
                "nome": a.get("nome"),
            }.items() if v is not None}
            for a in inst.get("assuntos", [])
        ]

        # Órgão julgador
        orgao_obj: dict = {}
        if inst.get("orgao_julgador"):
            orgao_obj["nome"] = inst["orgao_julgador"]
        if inst.get("orgao_julgador_codigo"):
            orgao_obj["codigo"] = inst["orgao_julgador_codigo"]
        if inst.get("orgao_julgador_municipio_ibge"):
            orgao_obj["codigoMunicipioIBGE"] = inst["orgao_julgador_municipio_ibge"]

        # Sistema processual
        sistema_obj: dict = {}
        if inst.get("tribunal", {}).get("sistema"):
            sistema_obj["nome"] = inst["tribunal"]["sistema"]

        # Movimentos
        movimentos = [
            {k: v for k, v in {
                "codigo": m.get("codigo"),
                "nome": m.get("nome"),
                "dataHora": m.get("data_hora"),
                "complementosTabelados": [
                    {k2: v2 for k2, v2 in {
                        "codigo": c.get("codigo"),
                        "nome": c.get("nome"),
                        "valor": c.get("valor"),
                    }.items() if v2 is not None}
                    for c in m.get("complementos", [])
                ] or None,
                "orgaoJulgador": {"nome": m["orgao_julgador"]} if m.get("orgao_julgador") else None,
            }.items() if v is not None}
            for m in inst.get("movimentos", [])
        ]

        doc: dict = {
            "numeroProcesso": canonical.get("numero_cnj"),
            "tribunal": (inst.get("tribunal") or {}).get("sigla"),
            "grau": grau_str,
            "dataAjuizamento": inst.get("data_inicio") or canonical.get("data_inicio"),
            "nivelSigilo": nivel_sigilo,
        }

        if sistema_obj:
            doc["sistema"] = sistema_obj
        if classe_obj:
            doc["classe"] = classe_obj
        if assuntos:
            doc["assuntos"] = assuntos
        if orgao_obj:
            doc["orgaoJulgador"] = orgao_obj
        if movimentos:
            doc["movimentos"] = movimentos

        # Rastreabilidade: campos extras que DataJud não tem nativamente
        doc["_etl"] = {
            "fonte_origem": fonte_origem,
            "versao_etl": etl_version,
            "fenomenos_detectados": canonical.get("fenomenos_detectados", []),
        }

        documentos.append(doc)

    return documentos
