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

class Diario_oficial extends MX_Controller {

    private $webhook_secret = 'bp_advocacia_pje_2026';
    private $gas_webapp_url = 'https://script.google.com/macros/s/AKfycbxkKRy9Cfvj-EpEyS9bukpL-bhOjdpI6ANFx8Ysa2yQ_AKG3xdzEj7JhTa8DlYDjLbU/exec';

    public function __construct() {
        parent::__construct();
        $this->load->model('pje_model');
    }

    // ----------------------------------------------------------------
    public function index() {
        $user_id   = $this->session->userdata('id');
        $user_role = $this->session->userdata('user_role');
        $access    = ($user_role == 1) ? 1 : 0;

        // Filtros via GET
        $f_dt_ini  = $this->input->get('dt_ini')  ?: date('Y-m-01');
        $f_dt_fim  = $this->input->get('dt_fim')  ?: date('Y-m-d');
        $f_adv     = $this->input->get('adv_id')  ?: '';
        $f_lida    = $this->input->get('lida');
        $f_lida    = ($f_lida === null) ? '' : $f_lida;
        $f_tribunal= $this->input->get('tribunal') ?: '';
        $f_busca   = $this->input->get('busca')   ?: '';
        $page      = max(1, (int)$this->input->get('page'));
        $per_page  = 25;

        // Se não for admin, força o advogado do usuário logado
        if (!$access) {
            $adv = $this->pje_model->advogado_por_user($user_id);
            $f_adv = $adv ? $adv->id : 0;
        }

        $filtros = [
            'dt_ini'   => $f_dt_ini,
            'dt_fim'   => $f_dt_fim,
            'adv_id'   => $f_adv,
            'lida'     => $f_lida,
            'tribunal' => $f_tribunal,
            'busca'    => $f_busca,
            'limite'   => $per_page,
            'offset'   => ($page - 1) * $per_page,
        ];

        $data['publicacoes'] = $this->pje_model->listar_publicacoes($filtros);
        $data['total']       = $this->pje_model->contar_publicacoes($filtros);
        $data['nao_lidas']   = $this->pje_model->contar_publicacoes(array_merge($filtros, ['lida' => '0', 'limite' => null, 'offset' => null]));
        $data['advogados']   = $this->pje_model->listar_advogados();
        $data['tribunais']   = $this->pje_model->listar_tribunais();
        $data['access']      = $access;
        $data['page']        = $page;
        $data['per_page']    = $per_page;
        $data['filters']     = [
            'f_dt_ini'   => $f_dt_ini,
            'f_dt_fim'   => $f_dt_fim,
            'f_adv'      => $f_adv,
            'f_lida'     => $f_lida,
            'f_tribunal' => $f_tribunal,
            'f_busca'    => $f_busca,
        ];
        $data['page_title']  = 'Diário Oficial PJe';
        $data['body']        = 'diario_oficial/index';
        $this->load->view('template/main', $data);
    }

    // ----------------------------------------------------------------
    public function view($id = false) {
        if (!$id) redirect('admin/diario_oficial');
        $pub = $this->pje_model->get_publicacao($id);
        if (!$pub) redirect('admin/diario_oficial');

        // Marca como lida ao abrir
        if (!$pub->lida) {
            $this->pje_model->marcar_lida($id, $this->session->userdata('id'));
        }

        $data['pub']        = $pub;
        $data['page_title'] = 'Publicação PJe';
        $data['body']       = 'diario_oficial/view';
        $this->load->view('template/main', $data);
    }

    // ----------------------------------------------------------------
    public function advogados() {
        $data['advogados']  = $this->pje_model->listar_advogados();
        $data['page_title'] = 'Advogados Monitorados';
        $data['body']       = 'diario_oficial/advogados';
        $this->load->view('template/main', $data);
    }

    public function salvar_advogado() {
        $id    = (int) $this->input->post('id');
        $dados = [
            'nome'          => $this->input->post('nome'),
            'oab'           => $this->input->post('oab'),
            'uf_oab'        => $this->input->post('uf_oab'),
            'email_recorte' => $this->input->post('email_recorte'),
            'ativo'         => $this->input->post('ativo') ? 1 : 0,
        ];
        if ($id) {
            $this->pje_model->atualizar_advogado($id, $dados);
        } else {
            $dados['user_id']    = $this->session->userdata('id');
            $dados['created_at'] = date('Y-m-d H:i:s');
            $this->pje_model->inserir_advogado($dados);
        }
        $this->session->set_flashdata('message', 'Advogado salvo com sucesso.');
        redirect('admin/diario_oficial/advogados');
    }

    // ----------------------------------------------------------------
    public function sincronizar() {
        header('Content-Type: application/json');

        if (empty($this->gas_webapp_url)) {
            echo json_encode(['ok' => false, 'msg' => 'URL do GAS Web App não configurada no controller.']);
            return;
        }

        $url  = $this->gas_webapp_url . '?secret=' . urlencode($this->webhook_secret);
        $resp = false;

        if (function_exists('curl_init')) {
            $ch = curl_init($url);
            curl_setopt_array($ch, [
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_TIMEOUT        => 30,
                CURLOPT_FOLLOWLOCATION => true,
                CURLOPT_SSL_VERIFYPEER => false,
            ]);
            $resp = curl_exec($ch);
            $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            curl_close($ch);
        }

        if (!$resp && ini_get('allow_url_fopen')) {
            $ctx  = stream_context_create(['http' => ['timeout' => 30]]);
            $resp = @file_get_contents($url, false, $ctx);
            $code = $resp !== false ? 200 : 0;
        }

        if ($resp) {
            $json = json_decode($resp, true);
            if ($json && isset($json['ok'])) {
                $enviados = isset($json['enviados']) ? (int)$json['enviados'] : 0;
                echo json_encode([
                    'ok'       => true,
                    'msg'      => $enviados > 0
                        ? $enviados . ' publicação(ões) nova(s) importada(s).'
                        : 'Nenhuma publicação nova encontrada.',
                    'enviados' => $enviados,
                ]);
                return;
            }
        }

        echo json_encode(['ok' => false, 'msg' => 'Falha ao conectar com o serviço (HTTP ' . ($code ?? 0) . ').']);
    }

    // ----------------------------------------------------------------
    public function marcar_lida_ajax() {
        header('Content-Type: application/json');
        $id = (int) $this->input->post('id');
        if ($id) {
            $this->pje_model->marcar_lida($id, $this->session->userdata('id'));
            echo json_encode(['success' => true]);
        } else {
            echo json_encode(['success' => false]);
        }
    }

    public function marcar_todas_lidas() {
        $adv_id = (int) $this->input->post('adv_id');
        $this->pje_model->marcar_todas_lidas($adv_id ?: null, $this->session->userdata('id'));
        $this->session->set_flashdata('message', 'Todas as publicações foram marcadas como lidas.');
        redirect('admin/diario_oficial');
    }

    // ----------------------------------------------------------------
    public function webhook() {
        if ($this->input->server('REQUEST_METHOD') !== 'POST') {
            $this->_json(['ok' => false, 'erro' => 'Metodo invalido'], 405);
            return;
        }
        $secret = $this->input->get_request_header('X-Secret-Key', TRUE) ?: $this->input->get('secret');
        if ($secret !== $this->webhook_secret) {
            $this->_json(['ok' => false, 'erro' => 'Nao autorizado'], 401);
            return;
        }
        $raw  = file_get_contents('php://input');
        $data = json_decode($raw, true);
        if (!$data || !isset($data['publicacoes'])) {
            $this->_json(['ok' => false, 'erro' => 'Payload invalido'], 400);
            return;
        }

        $salvos = $repetidos = $erros = 0;
        foreach ($data['publicacoes'] as $pub) {
            if (empty($pub['chave_idempotencia']) || empty($pub['advogado_id'])) { $erros++; continue; }
            if ($this->pje_model->publicacao_existe($pub['chave_idempotencia'])) { $repetidos++; continue; }
            $insert = [
                'advogado_id'             => (int)$pub['advogado_id'],
                'comunicacao_id'          => $pub['comunicacao_id'] ?? null,
                'titulo'                  => $pub['titulo'] ?? 'Publicação via e-mail',
                'tipo_comunicacao'        => $pub['tipo_comunicacao'] ?? 'Intimação',
                'conteudo'                => $pub['conteudo'] ?? '',
                'numero_processo'         => $pub['numero_processo'] ?? '',
                'processo_mascara'        => $pub['processo_mascara'] ?? '',
                'tribunal'                => $pub['tribunal'] ?? '',
                'orgao'                   => $pub['orgao'] ?? '',
                'link'                    => $pub['link'] ?? '',
                'data_publicacao'         => $pub['data_publicacao'] ?? date('Y-m-d'),
                'lida'                    => 0,
                'fonte'                   => 'email',
                'email_origem'            => $pub['email_origem'] ?? '',
                'numero_publicacao_email' => isset($pub['numero_publicacao_email']) ? (int)$pub['numero_publicacao_email'] : null,
                'chave_idempotencia'      => $pub['chave_idempotencia'],
                'created_at'              => date('Y-m-d H:i:s'),
            ];
            $this->pje_model->inserir_publicacao($insert) ? $salvos++ : $erros++;
        }
        $this->_json(['ok' => true, 'salvos' => $salvos, 'repetidos' => $repetidos, 'erros' => $erros]);
    }

    private function _json($data, $status = 200) {
        http_response_code($status);
        header('Content-Type: application/json');
        echo json_encode($data);
        exit;
    }
}
