#!/usr/bin/env python3
"""
scraper_execucao.py — FRENTE 6: Execução e Localização de Bens
Busca decisões (2023-2026) no DataJud CNJ onde:
- Devedor tentou ocultar bens e falhou (fraude à execução)
- Bens de PF/cônjuge foram bloqueados
- Desconsideração da personalidade jurídica atingiu sócios
- Confusão patrimonial revelada
- SISBAJUD/RENAJUD travou bens
Editorial: mostrar o que o ICP deve fazer para se PROTEGER legitimamente
"""

import json, os, time, re
from pathlib import Path
from dotenv import load_dotenv
import requests

load_dotenv(os.path.expanduser("~/meus-projetos/.env"))
DATAJUD_KEY = os.getenv("DATAJUD_KEY", "")
BASE = Path(__file__).parent
OUT_JSON = BASE / "decisoes_execucao.json"

TRIBUNAIS = ["stj", "trf1", "trf2", "trf3", "trf4", "trf5", "tjsp", "tjmg", "tjrs", "tjrj"]

QUERIES = [
    # Fraude à execução - devedor alienou após citação
    {
        "tema": "fraude_execucao_alienacao",
        "label": "Fraude à Execução — Alienação Após Citação",
        "query": "fraude execução alienação bem imóvel citado devedor"
    },
    # Desconsideração - sócio atingido pessoalmente
    {
        "tema": "desconsideracao_personalidade",
        "label": "Patrimônio do Sócio Alcançado — Confusão Patrimonial",
        "query": "desconsideração personalidade jurídica confusão patrimonial sócio penhora"
    },
    # Cônjuge/meação bloqueada
    {
        "tema": "penhora_conjuge_meacao",
        "label": "Meação do Cônjuge Atingida por Dívida do Sócio",
        "query": "penhora meação cônjuge devedor dívida empresarial bloqueio"
    },
    # Bem de família não protege - exceções
    {
        "tema": "bem_familia_excecao",
        "label": "Bem de Família Não Protegido — Exceções à Lei 8.009",
        "query": "bem família impenhorável exceção penhora devedor fiador"
    },
    # Dissolução irregular
    {
        "tema": "dissolucao_irregular",
        "label": "Dissolução Irregular — Sócio Responde Pessoalmente",
        "query": "dissolução irregular sociedade sócio responsabilidade dívida execução"
    },
    # SISBAJUD bloqueou conta
    {
        "tema": "sisbajud_bloqueio",
        "label": "SISBAJUD — Conta Bloqueada em Processo de Execução",
        "query": "SISBAJUD bloqueio conta bancária execução devedor penhora online"
    },
    # Extensão falência / consolidação patrimonial
    {
        "tema": "extensao_falencia",
        "label": "Falência Estendida ao Grupo Econômico",
        "query": "extensão falência grupo econômico consolidação patrimonial confusão"
    },
    # Fraude contra credores - antes do processo
    {
        "tema": "fraude_credores",
        "label": "Fraude Contra Credores — Alienação Antes do Processo",
        "query": "fraude credores pauliana anulação alienação insolvência devedor"
    },
    # Imóvel transferido para laranja / terceiro
    {
        "tema": "transferencia_fraudulenta",
        "label": "Transferência Fraudulenta Para Terceiro / Familiar",
        "query": "fraude execução transferência imóvel terceiro familiar simulação"
    },
    # Herança e patrimônio do devedor
    {
        "tema": "heranca_devedor",
        "label": "Herança Bloqueada Para Pagar Dívida do Falecido",
        "query": "herança espólio penhora dívida falecido execução bloqueio"
    },
]

def buscar_datajud(tribunal: str, query_text: str, size: int = 5) -> list:
    url = f"https://api-publica.datajud.cnj.jus.br/api_publica_{tribunal}/_search"
    headers = {
        "Authorization": f"APIKey {DATAJUD_KEY}",
        "Content-Type": "application/json"
    }
    body = {
        "size": size,
        "query": {
            "bool": {
                "must": [
                    {"multi_match": {
                        "query": query_text,
                        "fields": ["ementa^3", "decisao^2", "assuntos.nome"],
                        "type": "best_fields"
                    }}
                ],
                "filter": [
                    {"range": {"dataJulgamento": {"gte": "2023-01-01", "lte": "2026-12-31"}}}
                ]
            }
        },
        "sort": [{"dataJulgamento": {"order": "desc"}}]
    }
    try:
        r = requests.post(url, headers=headers, json=body, timeout=25)
        r.raise_for_status()
        hits = r.json().get("hits", {}).get("hits", [])
        return [h["_source"] for h in hits]
    except Exception as e:
        print(f"  ✗ {tribunal.upper()}: {e}")
        return []

def extrair_campos(doc: dict, tema: str, label: str, tribunal: str) -> dict:
    ementa = doc.get("ementa", "") or doc.get("decisao", "") or ""
    numero = doc.get("numeroProcesso", "") or doc.get("numero", "") or "N/D"
    data   = (doc.get("dataJulgamento") or doc.get("dataDecisao") or "")[:10]
    orgao  = doc.get("orgaoJulgador", {})
    orgao_nome = orgao.get("nome", "") if isinstance(orgao, dict) else str(orgao)
    relator = doc.get("relator", {})
    relator_nome = relator.get("nome", "") if isinstance(relator, dict) else str(relator)
    assuntos = doc.get("assuntos", [])
    assunto_txt = ", ".join(a.get("nome", "") for a in assuntos if isinstance(a, dict))[:120]

    return {
        "tema": tema,
        "label": label,
        "tribunal": tribunal.upper(),
        "numero": numero,
        "data": data,
        "orgao": orgao_nome,
        "relator": relator_nome,
        "assunto": assunto_txt,
        "ementa": ementa[:2000],
    }

def main():
    print("=" * 60)
    print("  FRENTE 6 — EXECUÇÃO E LOCALIZAÇÃO DE BENS")
    print("  Buscando decisões 2023-2026 no DataJud CNJ")
    print("=" * 60)

    todos = []
    por_tema = {}

    for q in QUERIES:
        tema = q["tema"]
        label = q["label"]
        query_text = q["query"]
        por_tema[tema] = []
        print(f"\n[{label}]")

        for tribunal in TRIBUNAIS:
            time.sleep(0.4)
            resultados = buscar_datajud(tribunal, query_text, size=3)
            for doc in resultados:
                item = extrair_campos(doc, tema, label, tribunal)
                if item["ementa"] and len(item["ementa"]) > 100:
                    todos.append(item)
                    por_tema[tema].append(item)
                    print(f"  ✓ {tribunal.upper()} | {item['numero'][:30]} | {item['data']}")

    # Salva JSON completo
    OUT_JSON.write_text(json.dumps(todos, ensure_ascii=False, indent=2), encoding="utf-8")
    print(f"\n{'='*60}")
    print(f"  Total de decisões coletadas: {len(todos)}")
    for tema, itens in por_tema.items():
        print(f"  {tema:<35} {len(itens):>3} decisões")
    print(f"  Salvo em: {OUT_JSON}")
    print("=" * 60)

if __name__ == "__main__":
    main()
