<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

/**
 * Diário Oficial / PJe Comunica
 * 
 * ARQUITETURA:
 * O servidor de hospedagem está bloqueado pelo CloudFront do PJe.
 * Solução: Make.com (gratuito) busca a API e envia via webhook para cá.
 * 
 * Fluxo Make.com:
 * 1. Trigger: Schedule (a cada hora ou manual)
 * 2. HTTP Request → comunicaapi.pje.jus.br/api/v1/comunicacao/advogado
 * 3. Webhook POST → https://sistema.brenopaiva.com.br/index.php/admin/diario_oficial/webhook_receber
 */

class diario_oficial extends MX_Controller {

    // ── Chave secreta para validar webhooks do Make.com ──────
    // TROQUE para uma string aleatória e use a mesma no Make.com
    const WEBHOOK_SECRET = 'bp_advocacia_pje_2026';

    public function __construct()
{
    parent::__construct();
    $this->auth->check_session();
    $this->load->model('diario_oficial_model');
    $this->load->helper('url');
}

    // ── PÁGINA PRINCIPAL ─────────────────────────────────────
    public function index()
{
    $advogado_id = (int)$this->input->get('advogado_id');
    $data['advogados']    = $this->diario_oficial_model->get_advogados();
    $this->db->select('p.*, a.nome AS advogado_nome, a.oab, a.uf_oab');
    $this->db->from('pje_publicacoes p');
    $this->db->join('pje_advogados a','a.id = p.advogado_id','left');
    if ($advogado_id) $this->db->where('p.advogado_id', $advogado_id);
    $this->db->order_by('p.created_at','DESC');
    $this->db->limit(50);
    $data['publicacoes']  = $this->db->get()->result();
    $data['advogado_sel'] = $advogado_id;
    $data['nao_lidas']    = $this->db->where('lida',0)->count_all_results('pje_publicacoes');
    $data['webhook_url']  = site_url('admin/diario_oficial/webhook_receber');
    $data['webhook_secret'] = self::WEBHOOK_SECRET;
    $data['page_title']   = 'Diário Oficial / PJe Comunica';
    $data['body']         = 'diario_oficial/index';
    $this->load->view('template/main', $data);
}

    // ── CADASTRO DE ADVOGADOS ─────────────────────────────────
    public function add_advogado()
    {
        if ($this->input->post('submitted')) {
            $oab  = trim($this->input->post('oab'));
            $uf   = strtoupper(trim($this->input->post('uf_oab')));
            $nome = trim($this->input->post('nome'));

            if ($this->diario_oficial_model->advogado_existe($oab, $uf)) {
                $this->session->set_flashdata('error', 'Advogado OAB ' . $oab . '/' . $uf . ' já cadastrado.');
            } else {
                $this->diario_oficial_model->salvar_advogado([
                    'nome'   => $nome,
                    'oab'    => $oab,
                    'uf_oab' => $uf,
                    'ativo'  => 1,
                ]);
                $this->session->set_flashdata('message',
                    'Advogado cadastrado. Configure o Make.com com OAB ' . $oab . '/' . $uf . '.');
            }
            redirect('admin/diario_oficial');
        }
        $data['page_title'] = 'Cadastrar Advogado';
        $data['body']       = 'diario_oficial/add_advogado';
        $this->load->view('template/main', $data);
    }

    public function delete_advogado($id = 0)
    {
        $this->db->where('id', $id)->delete('pje_advogados');
        $this->session->set_flashdata('message', 'Advogado removido.');
        redirect('admin/diario_oficial');
    }

    // ── MARCAR COMO LIDA ─────────────────────────────────────
    public function marcar_lida($id = 0)
    {
        $this->db->where('id', $id)->update('pje_publicacoes', ['lida' => 1]);
        redirect(isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : 'admin/diario_oficial');
    }

    public function marcar_todas_lidas()
    {
        $this->db->where('lida', 0)->update('pje_publicacoes', ['lida' => 1]);
        $this->session->set_flashdata('message', 'Todas marcadas como lidas.');
        redirect('admin/diario_oficial');
    }

    // ── WEBHOOK — recebe dados do Make.com ────────────────────
    public function webhook_receber()
    {
        // Remove session check para webhooks
        // Valida secret key
        $secret = $this->input->get('secret') ?: $this->input->server('HTTP_X_WEBHOOK_SECRET');
        if ($secret !== self::WEBHOOK_SECRET) {
            http_response_code(403);
            echo json_encode(['erro' => 'Chave inválida']);
            return;
        }

        // Aceita POST com JSON
        $raw   = file_get_contents('php://input');
        $dados = json_decode($raw, true);

        if (!$dados) {
            // Tenta como form POST
            $dados = $this->input->post();
        }

        if (!$dados) {
            http_response_code(400);
            echo json_encode(['erro' => 'Sem dados']);
            return;
        }

        $novos = $this->_processar_publicacoes($dados);

        http_response_code(200);
        echo json_encode(['sucesso' => true, 'novos' => $novos, 'timestamp' => date('Y-m-d H:i:s')]);
    }

    // ── IMPORTAÇÃO MANUAL (colar JSON do PJe) ────────────────
    public function importar_manual()
    {
        if ($this->input->post('json_dados')) {
            $raw   = $this->input->post('json_dados');
            $dados = json_decode($raw, true);

            if (!$dados) {
                $this->session->set_flashdata('error', 'JSON inválido. Verifique o conteúdo copiado.');
                redirect('admin/diario_oficial');
                return;
            }

            $novos = $this->_processar_publicacoes($dados);
            $this->session->set_flashdata('message', "$novos nova(s) publicação(ões) importada(s).");
            redirect('admin/diario_oficial');
        }
        $data['page_title'] = 'Importação Manual';
        $data['body']       = 'diario_oficial/importar_manual';
        $this->load->view('template/main', $data);
    }

    // ── VIEW PUBLICAÇÃO ───────────────────────────────────────
    public function view_publicacao($id = 0)
    {
        $pub = $this->db->where('id', $id)->get('pje_publicacoes')->row();
        if (!$pub) { redirect('admin/diario_oficial'); return; }
        $this->db->where('id', $id)->update('pje_publicacoes', ['lida' => 1]);
        $data['publicacao'] = $pub;
        $data['page_title'] = 'Publicação PJe';
        $data['body']       = 'diario_oficial/view_publicacao';
        $this->load->view('template/main', $data);
    }

    // ── PROCESSA PUBLICAÇÕES (usado pelo webhook e manual) ────
    private function _processar_publicacoes(array $dados)
    {
        // Suporta múltiplos formatos de resposta da API PJe
        $lista = [];
        if (isset($dados['content']) && is_array($dados['content'])) {
            $lista = $dados['content'];
        } elseif (isset($dados['comunicacoes']) && is_array($dados['comunicacoes'])) {
            $lista = $dados['comunicacoes'];
        } elseif (isset($dados[0])) {
            $lista = $dados; // Array direto
        } elseif (isset($dados['id'])) {
            $lista = [$dados]; // Item único
        }

        $novos = 0;
        foreach ($lista as $item) {
            // ID único da comunicação
            $cid = (string)($item['id'] ?? $item['numeroComunicacao'] ?? $item['idComunicacao'] ?? null);
            if (!$cid) continue;

            // Busca advogado vinculado
            $adv_id = null;
            if (!empty($item['numeroOab'])) {
                $adv = $this->db->where('oab', $item['numeroOab'])->get('pje_advogados')->row();
                $adv_id = $adv ? $adv->id : null;
            }
            if (!$adv_id) {
                // Usa primeiro advogado ativo
                $adv = $this->db->where('ativo', 1)->limit(1)->get('pje_advogados')->row();
                $adv_id = $adv ? $adv->id : 1;
            }

            // Verifica duplicata
            if ($this->diario_oficial_model->publicacao_existe($cid, $adv_id)) continue;

            // Data de publicação
            $dt = null;
            foreach (['dataDisponibilizacao','dataHoraDisponibilizacao','dataPublicacao','data'] as $k) {
                if (!empty($item[$k])) {
                    $dt = date('Y-m-d H:i:s', strtotime($item[$k]));
                    break;
                }
            }

            $save = [
                'advogado_id'    => $adv_id,
                'comunicacao_id' => $cid,
                'titulo'         => mb_substr($item['tipoDocumento'] ?? $item['tipo'] ?? 'Publicação PJe', 0, 200),
                'conteudo'       => $item['texto'] ?? $item['conteudo'] ?? $item['teor'] ?? '',
                'numero_processo'=> $item['numeroProcesso'] ?? $item['numero'] ?? null,
                'tribunal'       => $item['siglaOrgao'] ?? $item['tribunal'] ?? $item['orgaoJulgador'] ?? null,
                'data_publicacao'=> $dt ?? date('Y-m-d H:i:s'),
                'lida'           => 0,
                'created_at'     => date('Y-m-d H:i:s'),
            ];
            $this->diario_oficial_model->salvar_publicacao($save);
            $novos++;
        }
        return $novos;
    }

    // ── CONFIGURAÇÕES Make.com ────────────────────────────────
    public function config_make()
    {
        $data['advogados']      = $this->diario_oficial_model->get_advogados();
        $data['webhook_url']    = site_url('admin/diario_oficial/webhook_receber') . '?secret=' . self::WEBHOOK_SECRET;
        $data['webhook_secret'] = self::WEBHOOK_SECRET;
        $data['page_title']     = 'Configurar Make.com';
        $data['body']           = 'diario_oficial/config_make';
        $this->load->view('template/main', $data);
    }

    // ── SYNC ALL (mantido para compatibilidade) ───────────────
    public function sync_all()
    {
        $this->session->set_flashdata('error',
            'Sincronização direta bloqueada pelo servidor PJe. Use o Make.com ou a importação manual.');
        redirect('admin/diario_oficial');
    }

    public function consultar($advogado_id = 0)
    {
        $this->session->set_flashdata('error',
            'API do PJe bloqueada para este servidor. Configure o Make.com na aba "Configurar".');
        redirect('admin/diario_oficial');
    }

    public function config_cookies()
    {
        if($this->input->post('submitted')) {
            $pcp  = trim($this->input->post('pcp_session'));
            $xsrf = trim($this->input->post('xsrf_token'));
            $exp  = $this->input->post('expires_at');
            $db   = $this->db;
            $exists = $db->get('pje_config')->num_rows();
            if($exists > 0) {
                $db->update('pje_config',['pcp_session'=>$pcp,'xsrf_token'=>$xsrf,'expires_at'=>$exp]);
            } else {
                $db->insert('pje_config',['pcp_session'=>$pcp,'xsrf_token'=>$xsrf,'expires_at'=>$exp]);
            }
            // Test the new cookies via Worker
            $worker = $this->db->get('pje_config')->row();
            $this->session->set_flashdata('message','Cookies atualizados! Teste o cron para verificar.');
            redirect('admin/diario_oficial/config_cookies');
        }
        $r = @$this->db->get('pje_config')->row();
        $data['config']     = $r;
        $data['page_title'] = 'PJe — Renovar Cookies';
        $data['body']       = 'diario_oficial/config_cookies';
        $this->load->view('template/main', $data);
    }

    public function testar_cookies()
    {
        $cfg = $this->db->get('pje_config')->row();
        if(!$cfg) { echo json_encode(['success'=>false,'error'=>'Sem cookies']); return; }

        $worker_url = 'https://pje-proxy-final.breno-augusto.workers.dev';
        $url = $worker_url.'?action=comunicacoes&secret=bp_advocacia_pje_2026&oab=31577&uf=PE&pagina=1&tamanho=5'
             .'&pcp='.urlencode($cfg->pcp_session).'&xsrf='.urlencode($cfg->xsrf_token);

        $ch = curl_init($url);
        curl_setopt_array($ch,[CURLOPT_RETURNTRANSFER=>true,CURLOPT_TIMEOUT=>20,CURLOPT_SSL_VERIFYPEER=>false]);
        $resp = curl_exec($ch);
        curl_close($ch);

        $data = json_decode($resp,true);
        echo json_encode([
            'success'   => $data['success']??false,
            'status'    => $data['status']??0,
            'total'     => $data['total']??0,
            'message'   => $data['success'] ? "✓ Cookies válidos! {$data['total']} publicações encontradas." : "✗ Cookies inválidos ou expirados.",
        ]);
    }
}
