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

class Pje_model extends CI_Model {

    // ----------------------------------------------------------------
    // ADVOGADOS
    // ----------------------------------------------------------------
    public function listar_advogados() {
        return $this->db->where('ativo', 1)->get('pje_advogados')->result();
    }

    public function  advogado_por_user($user_id) {
        return $this->db->where('user_id', $user_id)->where('ativo', 1)->get('pje_advogados')->row();
    }

    public function inserir_advogado($dados) {
        return $this->db->insert('pje_advogados', $dados);
    }

    public function atualizar_advogado($id, $dados) {
        return $this->db->where('id', $id)->update('pje_advogados', $dados);
    }

    // ----------------------------------------------------------------
    // PUBLICAÇÕES / MOVIMENTAÇÕES
    // ----------------------------------------------------------------
    public function publicacao_existe($chave) {
        return $this->db->where('chave_idempotencia', $chave)->count_all_results('pje_publicacoes') > 0;
    }

    public function inserir_publicacao($dados) {
        return $this->db->insert('pje_publicacoes', $dados);
    }

    public function get_publicacao($id) {
        return $this->db
            ->select('p.*, a.nome as adv_nome, a.oab, a.uf_oab')
            ->from('pje_publicacoes p')
            ->join('pje_advogados a', 'a.id = p.advogado_id', 'left')
            ->where('p.id', $id)
            ->get()->row();
    }

    public function listar_publicacoes($filtros = []) {
        $this->db->select('p.*, a.nome as adv_nome, a.oab, a.uf_oab');
        $this->db->from('pje_publicacoes p');
        $this->db->join('pje_advogados a', 'a.id = p.advogado_id', 'left');

        $this->_aplicar_filtros($filtros);

        $this->db->order_by('p.data_publicacao', 'DESC');
        $this->db->order_by('p.created_at', 'DESC');

        if (!empty($filtros['limite'])) {
            $this->db->limit($filtros['limite'], $filtros['offset'] ?? 0);
        }

        return $this->db->get()->result();
    }

    public function contar_publicacoes($filtros = []) {
        $this->db->from('pje_publicacoes p');
        $this->db->join('pje_advogados a', 'a.id = p.advogado_id', 'left');
        $this->_aplicar_filtros($filtros);
        return $this->db->count_all_results();
    }

    public function listar_tribunais() {
        $rows = $this->db->query("SELECT DISTINCT tribunal FROM pje_publicacoes WHERE tribunal != '' ORDER BY tribunal")->result();
        return array_column(array_map('get_object_vars', $rows), 'tribunal');
    }

    public function marcar_lida($id, $user_id) {
        return $this->db->where('id', $id)->update('pje_publicacoes', [
            'lida'     => 1,
            'lida_em'  => date('Y-m-d H:i:s'),
            'lida_por' => $user_id,
        ]);
    }

    public function marcar_todas_lidas($adv_id = null, $user_id = null) {
        if ($adv_id) $this->db->where('advogado_id', $adv_id);
        $this->db->where('lida', 0);
        return $this->db->update('pje_publicacoes', [
            'lida'     => 1,
            'lida_em'  => date('Y-m-d H:i:s'),
            'lida_por' => $user_id,
        ]);
    }

    // ----------------------------------------------------------------
    private function _aplicar_filtros($filtros) {
        if (!empty($filtros['dt_ini']))   $this->db->where('p.data_publicacao >=', $filtros['dt_ini']);
        if (!empty($filtros['dt_fim']))   $this->db->where('p.data_publicacao <=', $filtros['dt_fim']);
        if (!empty($filtros['adv_id']))   $this->db->where('p.advogado_id', $filtros['adv_id']);
        if (!empty($filtros['tribunal'])) $this->db->where('p.tribunal', $filtros['tribunal']);
        if ($filtros['lida'] !== '' && $filtros['lida'] !== null) $this->db->where('p.lida', $filtros['lida']);
        if (!empty($filtros['busca'])) {
            $this->db->group_start();
            $this->db->like('p.numero_processo', $filtros['busca']);
            $this->db->or_like('p.processo_mascara', $filtros['busca']);
            $this->db->or_like('p.conteudo', $filtros['busca']);
            $this->db->group_end();
        }
    }
}