<?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();

        // Usa get_publicacoes() que já existe no model
        $filtro = ['lida' => ''];
        if ($advogado_id) $filtro['advogado_id'] = $advogado_id;
        $data['publicacoes']  = $this->diario_oficial_model->get_publicacoes($filtro);
        $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->add_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->db->insert('pje_publicacoes', $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');
    }
}
