import json
import pytest
from pathlib import Path
from pyjuris import normalizar_processo

FIXTURES = Path(__file__).parent / "fixtures"


def load(name):
    return json.loads((FIXTURES / name).read_text())


# ---------------------------------------------------------------------------
# Fixture simples
# ---------------------------------------------------------------------------

@pytest.fixture
def result():
    return normalizar_processo(load("datajud_simples.json"), input_template="datajud")


def test_numero_cnj(result):
    assert result["numero_cnj"] == "0012345-67.2024.8.19.0001"


def test_fonte_origem(result):
    assert result["_etl"]["fonte_origem"] == "datajud"


def test_tipo_e_fase(result):
    assert result["tipo_principal"] == "ACAO_ORIGINAL"
    assert result["fase_atual"] == "PRIMEIRO_GRAU"
    assert result["status_geral"] == "ATIVO"


def test_total_instancias(result):
    assert result["total_instancias"] == 1


def test_sigilo_publico(result):
    assert result["segredo_justica"] is False
    assert result["nivel_sigilo"] == 0


def test_datas(result):
    assert result["data_inicio"] == "2024-03-10"
    assert result["data_ultima_movimentacao"] == "2024-09-05"
    assert result["ano_inicio"] == 2024


def test_polos_ausentes(result):
    # DataJud público não tem partes
    assert result["polo_ativo"] is None
    assert result["polo_passivo"] is None


def test_sem_fenomenos(result):
    assert result["fenomenos_detectados"] == []


# ---------------------------------------------------------------------------
# Instância
# ---------------------------------------------------------------------------

@pytest.fixture
def inst(result):
    return result["instancias"][0]


def test_grau(inst):
    assert inst["grau"] == 1
    assert inst["grau_formatado"] == "Primeiro Grau"


def test_tribunal(inst):
    assert inst["tribunal"]["sigla"] == "TJRJ"
    assert inst["tribunal"]["sistema"] == "PJe"
    assert inst["tribunal"]["nome"] is None  # DataJud não retorna nome por extenso


def test_classe(inst):
    assert inst["classe"] == "PROCEDIMENTO COMUM CÍVEL"
    assert inst["classe_raw"] == "Procedimento Comum Cível"
    assert inst["classe_codigo"] == 436


def test_assuntos(inst):
    assert len(inst["assuntos"]) == 2
    assert inst["assunto_principal"] == "Bancários"
    assert inst["assuntos"][0] == {"id": 4945, "nome": "Bancários", "path": None}


def test_orgao_julgador(inst):
    assert inst["orgao_julgador"] == "10ª Vara Cível da Comarca da Capital"
    assert inst["orgao_julgador_codigo"] == 2301
    assert inst["orgao_julgador_municipio_ibge"] == 3304557


def test_orgao_julgador_info(inst):
    info = inst["orgao_julgador_info"]
    assert info["tipo"] == "VARA"
    assert info["numero"] == 10
    assert info["especialidade"] == "CIVEL"


def test_partes_vazias(inst):
    assert inst["partes"] == []


def test_movimentos(inst):
    movs = inst["movimentos"]
    assert len(movs) == 2
    assert movs[0]["codigo"] == 26
    assert movs[0]["nome"] == "Distribuição"
    assert movs[0]["data_hora"] == "2024-03-10T14:22:00"
    assert movs[1]["complementos"][0]["valor"] == "Julgamento"


# ---------------------------------------------------------------------------
# Envelope Elasticsearch (_source)
# ---------------------------------------------------------------------------

def test_unwrap_envelope():
    payload = load("datajud_simples.json")
    envelope = {"_source": payload, "_index": "tjrj", "_id": "abc"}
    result = normalizar_processo(envelope, input_template="datajud")
    assert result["numero_cnj"] == "0012345-67.2024.8.19.0001"


# ---------------------------------------------------------------------------
# Casos extremos
# ---------------------------------------------------------------------------

def test_cnj_invalido_gera_fenomeno():
    payload = load("datajud_simples.json")
    payload["numeroProcesso"] = "INVALIDO"
    result = normalizar_processo(payload, input_template="datajud")
    assert "cnj_invalido" in result["fenomenos_detectados"]


def test_nivel_sigilo_ativo():
    payload = load("datajud_simples.json")
    payload["nivelSigilo"] = 2
    result = normalizar_processo(payload, input_template="datajud")
    assert result["segredo_justica"] is True
    assert result["nivel_sigilo"] == 2


def test_grau_g2():
    payload = load("datajud_simples.json")
    payload["grau"] = "G2"
    result = normalizar_processo(payload, input_template="datajud")
    assert result["instancias"][0]["grau"] == 2
    assert result["fase_atual"] == "SEGUNDO_GRAU"


def test_grau_je_mapeia_para_primeiro():
    payload = load("datajud_simples.json")
    payload["grau"] = "JE"
    result = normalizar_processo(payload, input_template="datajud")
    assert result["instancias"][0]["grau"] == 1


def test_sem_movimentos_data_ultima_mov_none():
    payload = load("datajud_simples.json")
    payload["movimentos"] = []
    result = normalizar_processo(payload, input_template="datajud")
    assert result["data_ultima_movimentacao"] is None


def test_input_template_invalido():
    with pytest.raises(ValueError, match="não registrado"):
        normalizar_processo({}, input_template="fonte_inexistente")
