<?php
/**
 * OAB CRON — Sincronização automática de movimentações e busca por OAB
 * 
 * Instalar em: /home/brenopai/public_html/sistema/oab_cron.php
 * 
 * Configurar no cPanel → Cron Jobs:
 *   0 */12 * * *   /usr/bin/php /home/brenopai/public_html/sistema/oab_cron.php >> /tmp/oab_cron.log 2>&1
 * 
 * (roda a cada 12 horas — ajuste conforme configuração em settings.oab_sync_horas)
 */

define('BASEPATH', true);
define('CRON_MODE', true);
ini_set('max_execution_time', 300);
ini_set('memory_limit', '128M');

$start = microtime(true);
$log   = [];

function cron_log($msg) {
    global $log;
    $line = '[' . date('Y-m-d H:i:s') . '] ' . $msg;
    $log[] = $line;
    echo $line . PHP_EOL;
}

// Conexão com banco via config do CodeIgniter
$ci_db_config = __DIR__ . '/application/config/database.php';
if (!file_exists($ci_db_config)) {
    die('ERRO: database.php não encontrado.');
}
$db = array();
include($ci_db_config);
$conn = new mysqli(
    $db['default']['hostname'],
    $db['default']['username'],
    $db['default']['password'],
    $db['default']['database']
);
$conn->set_charset('utf8mb4');
if ($conn->connect_error) die('ERRO BD: ' . $conn->connect_error);

cron_log('=== Iniciando sincronização OAB ===');

// Ler configurações
$res      = $conn->query("SELECT * FROM settings LIMIT 1");
$settings = $res->fetch_object();
$api_key  = trim($settings->datajud_api_key ?? '');
$oab_num  = trim($settings->oab_numero ?? '');
$oab_uf   = strtoupper(trim($settings->oab_uf ?? 'PE'));
$intervalo = (int)($settings->oab_sync_horas ?? 12);
$ativo     = (int)($settings->oab_sync_ativo ?? 1);

if (!$ativo) {
    cron_log('Sincronização pausada nas configurações. Saindo.');
    exit(0);
}

// ============================================================
// PARTE 1: Sincronizar movimentações dos processos cadastrados
// ============================================================
cron_log("--- Parte 1: Movimentações ---");

$sql = "SELECT id, case_no, datajud_ultima_sync
        FROM cases
        WHERE case_no IS NOT NULL
          AND case_no != ''
          AND is_archived = 0
          AND datajud_monitorar = 1
          AND (datajud_ultima_sync IS NULL
               OR datajud_ultima_sync < NOW() - INTERVAL {$intervalo} HOUR)
        ORDER BY datajud_ultima_sync ASC
        LIMIT 50";

$result = $conn->query($sql);
$total_casos     = 0;
$total_movs_novas = 0;

while ($case = $result->fetch_object()) {
    $numero_digits = preg_replace('/[^0-9]/', '', $case->case_no);
    $tribunal      = identificar_tribunal($numero_digits, $case->case_no);
    $indice        = strtolower($tribunal);

    if (!$indice) {
        cron_log("  SKIP #{$case->id} — tribunal não identificado: {$case->case_no}");
        continue;
    }

    $movs_novas = sincronizar_movimentacoes($conn, $case, $numero_digits, $indice, $api_key);

    if ($movs_novas >= 0) {
        $conn->query("UPDATE cases SET
            datajud_ultima_sync = NOW(),
            datajud_total_movs = datajud_total_movs + {$movs_novas}
            WHERE id = {$case->id}");

        $total_casos++;
        $total_movs_novas += $movs_novas;

        if ($movs_novas > 0) {
            cron_log("  Case #{$case->id} ({$case->case_no}): {$movs_novas} novas movimentações");
        }

        // Log na tabela
        $stmt = $conn->prepare("INSERT INTO oab_sync_log (tipo, case_id, case_no, status, movs_novas, origem)
                                VALUES ('movimentacao', ?, ?, 'ok', ?, 'cron')");
        $stmt->bind_param('isi', $case->id, $case->case_no, $movs_novas);
        $stmt->execute();
    } else {
        cron_log("  ERRO Case #{$case->id} ({$case->case_no})");
        $stmt = $conn->prepare("INSERT INTO oab_sync_log (tipo, case_id, case_no, status, mensagem, origem)
                                VALUES ('movimentacao', ?, ?, 'erro', 'Falha na API', 'cron')");
        $stmt->bind_param('is', $case->id, $case->case_no);
        $stmt->execute();
    }

    usleep(300000); // 300ms entre requests para não sobrecarregar a API
}

cron_log("Parte 1 concluída: {$total_casos} processos sincronizados, {$total_movs_novas} novas movimentações.");

// ============================================================
// PARTE 2: Buscar novos processos por OAB
// ============================================================
cron_log("--- Parte 2: Busca por OAB ---");

if (empty($oab_num)) {
    cron_log("OAB não configurada nas configurações gerais. Pulando Parte 2.");
} else {
    $processos_novos = buscar_processos_oab($conn, $oab_num, $oab_uf, $api_key);
    cron_log("Parte 2 concluída: {$processos_novos} novos processos encontrados e salvos para análise.");

    $stmt = $conn->prepare("INSERT INTO oab_sync_log (tipo, oab_numero, status, processos_novos, origem)
                            VALUES ('oab_busca', ?, 'ok', ?, 'cron')");
    $stmt->bind_param('si', $oab_num, $processos_novos);
    $stmt->execute();
}

$elapsed = round(microtime(true) - $start, 2);
cron_log("=== Sincronização concluída em {$elapsed}s ===");


// ============================================================
// FUNÇÕES AUXILIARES
// ============================================================

function identificar_tribunal($numero_digits, $numero_fmt) {
    if (preg_match('/^(\d{7})(\d{2})(\d{4})(\d{1})(\d{2})(\d{4})$/', $numero_digits, $m)) {
        $j  = (int)$m[4];
        $tt = (int)$m[5];
        if ($j == 8) {
            $tj = [1=>'tjac',2=>'tjal',3=>'tjap',4=>'tjam',5=>'tjba',6=>'tjce',7=>'tjdf',
                   8=>'tjes',9=>'tjgo',10=>'tjma',11=>'tjmt',12=>'tjms',13=>'tjmg',14=>'tjpa',
                   15=>'tjpb',16=>'tjpr',17=>'tjpe',18=>'tjpi',19=>'tjrj',20=>'tjrn',
                   21=>'tjrs',22=>'tjro',23=>'tjrr',24=>'tjsc',25=>'tjse',26=>'tjsp',27=>'tjto'];
            return $tj[$tt] ?? null;
        }
        if ($j == 5) {
            return 'trt' . $tt;
        }
        if ($j == 4) {
            return 'trf' . $tt;
        }
    }
    return null;
}

function datajud_request($endpoint, $payload, $api_key) {
    $ch = curl_init($endpoint);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT        => 30,
        CURLOPT_CONNECTTIMEOUT => 10,
        CURLOPT_POST           => true,
        CURLOPT_POSTFIELDS     => $payload,
        CURLOPT_HTTPHEADER     => [
            'Content-Type: application/json',
            'Authorization: APIKey ' . $api_key,
        ],
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_SSL_VERIFYHOST => false,
        CURLOPT_USERAGENT      => 'Mozilla/5.0 (compatible; LawSystem/1.0)',
    ]);
    $resp = curl_exec($ch);
    $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    return [$resp, $code];
}

function sincronizar_movimentacoes($conn, $case, $numero_digits, $indice, $api_key) {
    $endpoint = "https://api-publica.datajud.cnj.jus.br/api_publica_{$indice}/_search";
    $payload  = json_encode(['query' => ['term' => ['numeroProcesso.keyword' => $numero_digits]]]);

    [$resp, $code] = datajud_request($endpoint, $payload, $api_key);
    if ($code !== 200 || !$resp) return -1;

    $data = json_decode($resp, true);
    $hits = $data['hits']['hits'] ?? [];
    if (empty($hits)) return 0;

    $proc       = $hits[0]['_source'] ?? [];
    $movimentos = $proc['movimentos'] ?? [];
    $inseridos  = 0;

    foreach ($movimentos as $mov) {
        $data_hora = $mov['dataHora'] ?? '';
        if (empty($data_hora)) continue;

        $data  = date('Y-m-d', strtotime($data_hora));
        $nome  = trim($mov['nome'] ?? '');
        $comp  = !empty($mov['complementosTabelados'][0]['nome'])
                 ? ' — ' . $mov['complementosTabelados'][0]['nome'] : '';
        $orgao = trim($mov['orgaoJulgador']['nome'] ?? '');
        $note  = $nome . $comp . ($orgao ? ' [' . $orgao . ']' : '');

        // Verifica duplicata
        $check = $conn->prepare("SELECT id FROM extended_case WHERE case_id=? AND next_date=? AND note=? LIMIT 1");
        $check->bind_param('iss', $case->id, $data, $note);
        $check->execute();
        if ($check->get_result()->num_rows > 0) continue;

        $ins = $conn->prepare("INSERT INTO extended_case (case_id, next_date, last_date, note, document, is_view, is_view_client) VALUES (?,?,?,?,0,0,0)");
        $ins->bind_param('isss', $case->id, $data, $data, $note);
        $ins->execute();
        $inseridos++;
    }

    return $inseridos;
}

function buscar_processos_oab($conn, $oab_num, $oab_uf, $api_key) {
    // DataJud: busca por representante/advogado com número OAB
    // Usa busca multi-índice (todos os tribunais de uma UF)
    $tribunais_pe = ['tjpe', 'trt6', 'trf5'];  // principais para PE
    $novos = 0;

    foreach ($tribunais_pe as $indice) {
        $endpoint = "https://api-publica.datajud.cnj.jus.br/api_publica_{$indice}/_search";
        $payload  = json_encode([
            'size'  => 100,
            'query' => [
                'nested' => [
                    'path'  => 'partes',
                    'query' => [
                        'nested' => [
                            'path'  => 'partes.advogados',
                            'query' => [
                                'match' => [
                                    'partes.advogados.numeroOAB' => $oab_num
                                ]
                            ]
                        ]
                    ]
                ]
            ]
        ]);

        [$resp, $code] = datajud_request($endpoint, $payload, $api_key);
        if ($code !== 200 || !$resp) {
            cron_log("  ERRO busca OAB em {$indice}: HTTP {$code}");
            continue;
        }

        $data = json_decode($resp, true);
        $hits = $data['hits']['hits'] ?? [];
        cron_log("  {$indice}: " . count($hits) . " processos encontrados");

        foreach ($hits as $hit) {
            $proc      = $hit['_source'] ?? [];
            $numero    = $proc['numeroProcesso'] ?? '';
            if (empty($numero)) continue;

            // Verifica se já está cadastrado no sistema
            $chk = $conn->prepare("SELECT id FROM cases WHERE case_no LIKE ? OR case_no = ? LIMIT 1");
            $like = '%' . $numero . '%';
            $chk->bind_param('ss', $like, $numero);
            $chk->execute();
            if ($chk->get_result()->num_rows > 0) continue;

            // Verifica se já está na fila de pendentes
            $chk2 = $conn->prepare("SELECT id FROM oab_processos_pendentes WHERE numero_cnj = ? LIMIT 1");
            $chk2->bind_param('s', $numero);
            $chk2->execute();
            if ($chk2->get_result()->num_rows > 0) continue;

            // Formata número CNJ
            $numero_fmt = '';
            if (preg_match('/^(\d{7})(\d{2})(\d{4})(\d{1})(\d{2})(\d{4})$/', $numero, $m)) {
                $numero_fmt = "{$m[1]}-{$m[2]}.{$m[3]}.{$m[4]}.{$m[5]}.{$m[6]}";
            }

            // Extrai dados básicos
            $classe       = $proc['classe']['nome'] ?? '';
            $assunto      = !empty($proc['assuntos']) ? ($proc['assuntos'][0]['nome'] ?? '') : '';
            $orgao        = $proc['orgaoJulgador']['nome'] ?? '';
            $grau         = $proc['grau'] ?? '';
            $valor        = (float)($proc['valorCausa'] ?? 0);
            $data_raw     = $proc['dataAjuizamento'] ?? '';
            $data_inicio  = '';
            if ($data_raw && preg_match('/^\d{14}$/', $data_raw)) {
                $data_inicio = substr($data_raw,0,4).'-'.substr($data_raw,4,2).'-'.substr($data_raw,6,2);
            } elseif ($data_raw) {
                $data_inicio = date('Y-m-d', strtotime($data_raw));
            }

            $polo_ativo   = [];
            $polo_passivo = [];
            foreach ($proc['partes'] ?? [] as $parte) {
                $polo = strtoupper(trim($parte['polo'] ?? ''));
                $nome = trim($parte['nome'] ?? '');
                if (in_array($polo, ['AT','ATIVO','REQUERENTE','RECLAMANTE','AUTOR'])) $polo_ativo[] = $nome;
                if (in_array($polo, ['PA','PASSIVO','REQUERIDO','RECLAMADO','REU','RÉU'])) $polo_passivo[] = $nome;
            }

            $dados_json = json_encode($proc);

            $ins = $conn->prepare("INSERT INTO oab_processos_pendentes
                (numero_cnj, tribunal, classe, assunto, data_inicio, orgao, polo_ativo, polo_passivo, valor_causa, grau, dados_json)
                VALUES (?,?,?,?,?,?,?,?,?,?,?)");
            $pa = implode('; ', $polo_ativo);
            $pp = implode('; ', $polo_passivo);
            $tri = strtoupper($indice);
            $ins->bind_param('ssssssssdss',
                $numero_fmt ?: $numero, $tri, $classe, $assunto,
                $data_inicio, $orgao, $pa, $pp, $valor, $grau, $dados_json
            );
            $ins->execute();
            $novos++;
        }

        usleep(500000); // 500ms entre tribunais
    }

    return $novos;
}
