<?

/**
 * TRIBUNAL REGIONAL FEDERAL DA 4 REGIO
 *
 * 19/05/2023 - criado por sabino.colab
 *
 * Verso do Gerador de Cdigo: 1.43.2
 */

require_once dirname(__FILE__) . '/../../../SEI.php';


class MdIaRecursoRN extends InfraRN
{
    const TIME_OUT = '120000';

    public function __construct()
    {
        parent::__construct();
    }

    protected function inicializarObjInfraIBanco()
    {
        return BancoSEI::getInstance();
    }

    protected function conexaoApiRecomendacaoSimilaridadeConectado($dadosProcesso)
    {

        try {

            $urlApi = $this->retornarUrlApi();

            $urlConsulta = $urlApi["linkRecomendacaoProcesso"] . $dadosProcesso[1]->getIdProcedimento() . '?rows=' . $dadosProcesso[0]->getNumQtdProcessListagem();

            $curl = curl_init();

            // Configura
            curl_setopt_array($curl, [
                CURLOPT_RETURNTRANSFER => 1,
                CURLOPT_URL => $urlConsulta,
                CURLOPT_SSL_VERIFYPEER => false,
                CURLOPT_SSL_VERIFYHOST => 0,
                CURLOPT_TIMEOUT_MS => self::TIME_OUT
            ]);

            // Envio e armazenamento da resposta
            $response = curl_exec($curl);
            $httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
            // Fecha e limpa recursos
            curl_close($curl);
            if ($httpcode == "200") {
                return json_decode($response);
            } elseif ($httpcode == "404") {
                return $httpcode;
            } else {
                $resposta = iconv("UTF-8", "ISO-8859-1//TRANSLIT", $response);
                $log = "00001 - ERRO DE RECURSO NO SEI IA \n";
                $log .= "00002 - Processo: " . $dadosProcesso[1]->getProcedimentoFormatado() . " \n";
                $log .= "00003 - Usuario: " . SessaoSEI::getInstance()->getStrNomeUsuario() . " - Unidade: " . SessaoSEI::getInstance()->getStrSiglaUnidadeAtual() . " \n";
                $log .= "00004 - Endpoint do Recurso: " . $urlConsulta . " \n";
                $log .= "00005 - Tipo de Indisponibilidade: " . $httpcode . " \n";
                $log .= "00006 - Mensagem retornada pelo Servidor: " . $resposta . " \n";
                $log .= "00007 - Mensagem apresentada ao usurio:  O recurso especfico do SEI IA est indisponvel no momento. \n";
                $log .= "00008 - Data e hora: " . InfraData::getStrDataHoraAtual() . " \n";
                $log .= "00009 - FIM \n";
                LogSEI::getInstance()->gravar($log, InfraLog::$INFORMACAO);

                $objInfraParametro = new InfraParametro(BancoSEI::getInstance());

                $strDe = SessaoSEIExterna::getInstance()->getStrSiglaSistema() . "<" . $objInfraParametro->getValor('SEI_EMAIL_SISTEMA') . ">";
                $strPara = $objInfraParametro->getValor('SEI_EMAIL_ADMINISTRADOR');
                $strAssunto = "ERRO DE RECURSO NO SEI IA";
                $strConteudo = $log;
                InfraMail::enviarConfigurado(ConfiguracaoSEI::getInstance(), $strDe, $strPara, null, null, $strAssunto, $strConteudo);
                return null;
            }
        } catch (Exception $e) {
            throw new InfraException('Erro ao buscar recomendaes de processos.', $e);
        }
    }

    protected function submeteSimilaridadeConectado($dadosEnviados)
    {
        try {
            $urlApi = $this->retornarUrlApi();
            $urlOperacao = $urlApi['linkFeedbackRecomendacaoProcesso'];
            // Inicia
            $curl = curl_init();
            // Configura
            curl_setopt_array($curl, [
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_URL => $urlOperacao,
                CURLOPT_SSL_VERIFYPEER => false,
                CURLOPT_SSL_VERIFYHOST => 0,
                CURLOPT_POSTFIELDS => $dadosEnviados[0],
                CURLOPT_HTTPHEADER => array('Content-Type:application/json'),
                CURLOPT_TIMEOUT_MS => self::TIME_OUT
            ]);
            // Envio e armazenamento da resposta
            $response = curl_exec($curl);
            $httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
            // Fecha e limpa recursos
            if ($httpcode == "200") {
                return array($httpcode, json_decode($response));
            } else {
                $resposta = iconv("UTF-8", "ISO-8859-1//TRANSLIT", $response);
                $log = "00001 - ERRO DE RECURSO DE FEEDBACK DE PROCESSOS SIMILARES NO SEI IA \n";
                $log .= "00002 - Processo: " . $dadosEnviados[1]->getProcedimentoFormatado() . " \n";
                $log .= "00003 - Usuario: " . SessaoSEI::getInstance()->getStrNomeUsuario() . " - Unidade: " . SessaoSEI::getInstance()->getStrSiglaUnidadeAtual() . " \n";
                $log .= "00004 - Endpoint do Recurso: " . $urlOperacao . " \n";
                $log .= "00005 - Tipo de Indisponibilidade: " . $httpcode . " \n";
                $log .= "00006 - Mensagem retornada pelo Servidor: " . $resposta . " \n";
                $log .= "00007 - Mensagem apresentada ao usurio:  Ocorreu um erro ao realizar a Avaliao de Similaridade entre Processos. \n";
                $log .= "00008 - Data e hora: " . InfraData::getStrDataHoraAtual() . " \n";
                $log .= "00009 - JSON enviado ao Servidor: " . $dadosEnviados[0] . " \n";
                $log .= "00010 - FIM \n";
                LogSEI::getInstance()->gravar($log, InfraLog::$INFORMACAO);

                $objInfraParametro = new InfraParametro(BancoSEI::getInstance());

                $strDe = SessaoSEIExterna::getInstance()->getStrSiglaSistema() . "<" . $objInfraParametro->getValor('SEI_EMAIL_SISTEMA') . ">";
                $strPara = $objInfraParametro->getValor('SEI_EMAIL_ADMINISTRADOR');
                $strAssunto = "ERRO DE RECURSO DE FEEDBACK DE PROCESSOS SIMILARES NO SEI IA";
                $strConteudo = $log;
                InfraMail::enviarConfigurado(ConfiguracaoSEI::getInstance(), $strDe, $strPara, null, null, $strAssunto, $strConteudo);
            }
        } catch (Exception $e) {
            throw new InfraException('Erro ao submeter Feedback de Processos Similares', $e);
        }
    }

    protected function submetePesquisaDocumentoConectado($dadosEnviados)
    {
        try {

            $urlApi = $this->retornarUrlApi();
            $urlOperacao = $urlApi['linkFeedbackRecomendacaoDocumento'];
            // Inicia
            $curl = curl_init();
            // Configura
            curl_setopt_array($curl, [
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_URL => $urlOperacao,
                CURLOPT_SSL_VERIFYPEER => false,
                CURLOPT_SSL_VERIFYHOST => 0,
                CURLOPT_POSTFIELDS => $dadosEnviados[0],
                CURLOPT_HTTPHEADER => array('Content-Type:application/json'),
                CURLOPT_TIMEOUT_MS => self::TIME_OUT
            ]);
            // Envio e armazenamento da resposta
            $response = curl_exec($curl);
            $httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
            // Fecha e limpa recursos
            if ($httpcode == "200") {
                return array($httpcode, json_decode($response));
            } else {
                $resposta = iconv("UTF-8", "ISO-8859-1//TRANSLIT", $response);
                $log = "00001 - INDISPONIBILIDADE DO RECURSO DE FEEDBACK DE PESQUISA DE DOCUMENTO NO SEI IA \n";
                $log .= "00002 - Processo: " . $dadosEnviados[1]->getProcedimentoFormatado() . " \n";
                $log .= "00003 - Usuario: " . SessaoSEI::getInstance()->getStrNomeUsuario() . " - Unidade: " . SessaoSEI::getInstance()->getStrSiglaUnidadeAtual() . " \n";
                $log .= "00004 - Endpoint do Recurso: " . $urlOperacao . " \n";
                $log .= "00005 - Tipo de Indisponibilidade: " . $httpcode . " \n";
                $log .= "00006 - Mensagem retornada pelo Servidor: " . $resposta . " \n";
                $log .= "00007 - Mensagem apresentada ao usurio:  *No  apresentada mensagem ao usurio!* \n";
                $log .= "00008 - Data e hora: " . InfraData::getStrDataHoraAtual() . " \n";
                $log .= "00009 - JSON enviado ao Servidor: " . $dadosEnviados[0] . " \n";
                $log .= "00010 - FIM \n";
                LogSEI::getInstance()->gravar($log, InfraLog::$INFORMACAO);

                $objInfraParametro = new InfraParametro(BancoSEI::getInstance());

                $strDe = SessaoSEIExterna::getInstance()->getStrSiglaSistema() . "<" . $objInfraParametro->getValor('SEI_EMAIL_SISTEMA') . ">";
                $strPara = $objInfraParametro->getValor('SEI_EMAIL_ADMINISTRADOR');
                $strAssunto = "INDISPONIBILIDADE DO RECURSO DE FEEDBACK DE PESQUISA DE DOCUMENTO NO SEI IA";
                $strConteudo = $log;
                InfraMail::enviarConfigurado(ConfiguracaoSEI::getInstance(), $strDe, $strPara, null, null, $strAssunto, $strConteudo);
            }
        } catch (Exception $e) {
            throw new InfraException('Erro ao submeter Feedback de Pesquisa de Documento', $e);
        }
    }
    public function retornarUrlApi()
    {
        $idMdIaAdmIntegFuncion = 1;
        $objMdIaAdmIntegracaoDTO = new MdIaAdmIntegracaoDTO();
        $objMdIaAdmIntegracaoDTO->setNumIdMdIaAdmIntegFuncion($idMdIaAdmIntegFuncion);
        $objMdIaAdmIntegracaoDTO->retStrOperacaoWsdl();
        $objMdIaAdmIntegracaoDTO = (new MdIaAdmIntegracaoRN())->consultar($objMdIaAdmIntegracaoDTO);

        $urlsIntegracao = array();
        if ($objMdIaAdmIntegracaoDTO) {
            $urlsIntegracao['urlBase'] = $objMdIaAdmIntegracaoDTO->getStrOperacaoWsdl();
            $urlsIntegracao['linkRecomendacaoProcesso'] = $urlsIntegracao['urlBase'] . $this->consultarUrlApi($idMdIaAdmIntegFuncion, 'linkRecomendacaoProcesso');
            $urlsIntegracao['linkFeedbackRecomendacaoProcesso'] = $urlsIntegracao['urlBase'] . $this->consultarUrlApi($idMdIaAdmIntegFuncion, 'linkFeedbackRecomendacaoProcesso');
            $urlsIntegracao['linkIndexacaoProcesso'] = $urlsIntegracao['urlBase'] . $this->consultarUrlApi($idMdIaAdmIntegFuncion, 'linkIndexacaoProcesso');
            $urlsIntegracao['linkRecomendacaoDocumentos'] = $urlsIntegracao['urlBase'] . $this->consultarUrlApi($idMdIaAdmIntegFuncion, 'linkRecomendacaoDocumentos');
            $urlsIntegracao['linkFeedbackRecomendacaoDocumento'] = $urlsIntegracao['urlBase'] . $this->consultarUrlApi($idMdIaAdmIntegFuncion, 'linkFeedbackRecomendacaoDocumento');
        }
        $urlsIntegracao['linkSwagger'] = $this->consultarUrlApi($idMdIaAdmIntegFuncion, 'linkSwagger');
        $urlsIntegracao['linkConsultaDisponibilidade'] = $this->consultarUrlApi($idMdIaAdmIntegFuncion, 'linkConsultaDisponibilidade');

        return $urlsIntegracao;
    }

    private function consultarUrlApi($IdMdIaAdmIntegFuncion, $referencia)
    {
        $objMdIaAdmUrlIntegracaoDTO = new MdIaAdmUrlIntegracaoDTO();
        $objMdIaAdmUrlIntegracaoDTO->setStrReferencia($referencia);
        $objMdIaAdmUrlIntegracaoDTO->setNumIdAdmIaAdmIntegracao($IdMdIaAdmIntegFuncion);
        $objMdIaAdmUrlIntegracaoDTO->retStrUrl();
        $objMdIaAdmUrlIntegracaoDTO->setNumMaxRegistrosRetorno(1);
        $objMdIaAdmUrlIntegracaoDTO = (new MdIaAdmUrlIntegracaoRN)->consultar($objMdIaAdmUrlIntegracaoDTO);

        return $objMdIaAdmUrlIntegracaoDTO->getStrUrl();
    }

    public function enviaPostPesquisaDocumento($dadosConsulta)
    {

        try {
            $urlOperacao = $dadosConsulta[0];
            $curl = curl_init();

            // Configura
            curl_setopt_array($curl, [
                CURLOPT_RETURNTRANSFER => 1,
                CURLOPT_URL => $urlOperacao,
                CURLOPT_SSL_VERIFYPEER => false,
                CURLOPT_SSL_VERIFYHOST => 0,
                CURLOPT_TIMEOUT_MS => self::TIME_OUT
            ]);

            // Envio e armazenamento da resposta
            $response = curl_exec($curl);

            $httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
            // Fecha e limpa recursos
            curl_close($curl);
            if ($httpcode == "200") {
                return $response;
            } else {
                $resposta = iconv("UTF-8", "ISO-8859-1//TRANSLIT", $response);
                $log = "00001 - ERRO DE RECURSO NO SEI IA \n";
                $log .= "00002 - Processo: " . $dadosConsulta[1]->getProcedimentoFormatado() . " \n";
                $log .= "00003 - Usuario: " . SessaoSEI::getInstance()->getStrNomeUsuario() . " - Unidade: " . SessaoSEI::getInstance()->getStrSiglaUnidadeAtual() . " \n";
                $log .= "00004 - Endpoint do Recurso: " . $urlOperacao . " \n";
                $log .= "00005 - Tipo de Indisponibilidade: " . $httpcode . " \n";
                $log .= "00006 - Mensagem retornada pelo Servidor: " . $resposta . " \n";
                $log .= "00007 - Mensagem apresentada ao usurio:  Ocorreu um erro ao consultar a API de recomendao de documentos. \n";
                $log .= "00008 - Data e hora: " . InfraData::getStrDataHoraAtual() . " \n";
                $log .= "00009 - FIM \n";
                LogSEI::getInstance()->gravar($log, InfraLog::$INFORMACAO);

                $objInfraParametro = new InfraParametro(BancoSEI::getInstance());

                $strDe = SessaoSEIExterna::getInstance()->getStrSiglaSistema() . "<" . $objInfraParametro->getValor('SEI_EMAIL_SISTEMA') . ">";
                $strPara = $objInfraParametro->getValor('SEI_EMAIL_ADMINISTRADOR');
                $strAssunto = "ERRO DE RECURSO NO SEI IA";
                $strConteudo = $log;
                InfraMail::enviarConfigurado(ConfiguracaoSEI::getInstance(), $strDe, $strPara, null, null, $strAssunto, $strConteudo);
                return null;
            }
        } catch (Exception $e) {
            throw new InfraException('Erro retornando Pesquisa Documentos.', $e);
        }
    }

    public function exibeFuncionalidade($bolConsideraChatIa)
    {

        $bolAcaoRecursoIa = SessaoSEI::getInstance()->verificarPermissao('md_ia_recurso');

        $bolExibirFuncionalidade = false;

        if ($bolAcaoRecursoIa) {
            $objMdIaAdmConfigSimilarDTO = new MdIaAdmConfigSimilarDTO();
            $objMdIaAdmConfigSimilarDTO->retStrSinExibirFuncionalidade();
            $objMdIaAdmConfigSimilarRN = new MdIaAdmConfigSimilarRN();
            $objMdIaAdmConfigSimilarDTO = $objMdIaAdmConfigSimilarRN->consultar($objMdIaAdmConfigSimilarDTO);

            if ($objMdIaAdmConfigSimilarDTO->getStrSinExibirFuncionalidade() == "S") {
                $bolExibirFuncionalidade = true;
                return $bolExibirFuncionalidade;
            }

            $objMdIaAdmPesqDocDTO = new MdIaAdmPesqDocDTO();
            $objMdIaAdmPesqDocDTO->setNumIdMdIaAdmPesqDoc(1);
            $objMdIaAdmPesqDocDTO->retStrSinExibirFuncionalidade();
            $objMdIaAdmPesqDocRN = new MdIaAdmPesqDocRN();
            $objMdIaAdmPesqDocDTO = $objMdIaAdmPesqDocRN->consultar($objMdIaAdmPesqDocDTO);

            if ($objMdIaAdmPesqDocDTO) {
                if ($objMdIaAdmPesqDocDTO->getStrSinExibirFuncionalidade() == "S") {
                    $bolExibirFuncionalidade = true;
                    return $bolExibirFuncionalidade;
                }
            }

            $objMdIaAdmOdsOnuDTO = new MdIaAdmOdsOnuDTO();
            $objMdIaAdmOdsOnuDTO->retStrSinExibirFuncionalidade();
            $objMdIaAdmOdsOnuRN = new MdIaAdmOdsOnuRN();
            $objMdIaAdmOdsOnuDTO = $objMdIaAdmOdsOnuRN->consultar($objMdIaAdmOdsOnuDTO);

            if ($objMdIaAdmOdsOnuDTO) {
                if ($objMdIaAdmOdsOnuDTO->getStrSinExibirFuncionalidade() == "S") {
                    $bolExibirFuncionalidade = true;
                    return $bolExibirFuncionalidade;
                }
            }
        }
        $bolAcaoChatIa = SessaoSEI::getInstance()->verificarPermissao('md_ia_adm_config_assist_ia_consultar');

        if ($bolConsideraChatIa && $bolAcaoChatIa) {
            $objMdIaAdmConfigAssistIADTO = new MdIaAdmConfigAssistIADTO();
            $objMdIaAdmConfigAssistIADTO->retStrSinExibirFuncionalidade();
            $objMdIaAdmConfigAssistIARN = new MdIaAdmConfigAssistIARN();
            $objMdIaAdmConfigAssistIADTO = $objMdIaAdmConfigAssistIARN->consultar($objMdIaAdmConfigAssistIADTO);

            if ($objMdIaAdmConfigAssistIADTO) {
                if ($objMdIaAdmConfigAssistIADTO->getStrSinExibirFuncionalidade() == "S") {
                    $bolExibirFuncionalidade = true;
                    return $bolExibirFuncionalidade;
                }
            }
        }
    }

    public static function verificarSelecaoDocumentoAlvo(DocumentoDTO $objDocumentoDTO)
    {
        try {

            $objProtocoloDTO = new ProtocoloDTO();
            $objProtocoloDTO->retStrStaProtocolo();
            $objProtocoloDTO->retDblIdProtocolo();
            $objProtocoloDTO->retDblIdProtocolo();
            $objProtocoloDTO->retStrStaNivelAcessoGlobal();
            $objProtocoloDTO->retStrStaNivelAcessoLocal();
            $objProtocoloDTO->retDblIdProcedimentoDocumento();
            $objProtocoloDTO->setDblIdProtocolo($objDocumentoDTO->getDblIdDocumento());
            $objProtocoloDTO = (new ProtocoloRN())->consultarRN0186($objProtocoloDTO);

            if ($objProtocoloDTO->getStrStaNivelAcessoGlobal() != ProtocoloRN::$NA_SIGILOSO) {
                $objEntradaConsultarDocumentoAPI = new EntradaConsultarDocumentoAPI();
                $objEntradaConsultarDocumentoAPI->setIdDocumento($objDocumentoDTO->getDblIdDocumento());

                $objSeiRN = new SeiRN();
                $objSaidaConsultarDocumentoAPI = new SaidaConsultarDocumentoAPI();
                $objSaidaConsultarDocumentoAPI = $objSeiRN->consultarDocumento($objEntradaConsultarDocumentoAPI);
            } else {

                $objProtocoloRN = new ProtocoloRN();
                $objPesquisaProtocoloDTO = new PesquisaProtocoloDTO();

                $objPesquisaProtocoloDTO->setStrStaTipo(ProtocoloRN::$TPP_DOCUMENTOS);
                $objPesquisaProtocoloDTO->setStrStaAcesso(ProtocoloRN::$TAP_TODOS);
                $objPesquisaProtocoloDTO->setDblIdProtocolo($objDocumentoDTO->getDblIdDocumento());

                $objProtocoloDTO = $objProtocoloRN->pesquisarRN0967($objPesquisaProtocoloDTO);
                return ($objDocumentoDTO->getStrStaEstadoProtocolo() != ProtocoloRN::$TE_DOCUMENTO_CANCELADO
                    &&
                    ($objDocumentoDTO->getNumIdUnidadeGeradoraProtocolo() == SessaoSEI::getInstance()->getNumIdUnidadeAtual() || $objDocumentoDTO->getStrSinPublicado() == 'S' || $objDocumentoDTO->getStrSinAssinado() == 'S' || $objProtocoloDTO[0]->getStrSinAcessoAssinaturaBloco() == 'S' || $objProtocoloDTO[0]->getStrSinAcessoRascunhoBloco() == 'S')
                );
            }
            return true;
        } catch (Exception $exception) {
            return false;
        }
    }

    protected function verificarExistenciaTipoDocumentoConectado($params)
    {
        $arrObjSerieAPI = $params;

        $arrIds = array();
        foreach ($arrObjSerieAPI as $objSerie) {
            $arrIds[] = $objSerie->getIdSerie();
        }

        $objMdIaAdmDocRelevRN = new MdIaAdmDocRelevRN();

        $objMdIaAdmDocRelevDTO = new MdIaAdmDocRelevDTO();
        $objMdIaAdmDocRelevDTO->setNumIdSerie($arrIds, InfraDTO::$OPER_IN);
        $objMdIaAdmDocRelevDTO->retStrNomeSerie();
        $objMdIaAdmDocRelevDTO->setNumMaxRegistrosRetorno(1);
        $tipoDocumento = $objMdIaAdmDocRelevRN->consultar($objMdIaAdmDocRelevDTO);
        $msg = "";
        if ($tipoDocumento) {
            $msg .= "No  permitido excluir o Tipo de Documento " . $tipoDocumento->getStrNomeSerie() . ", pois ele  utilizado pelo Mdulo de Inteligncia Artificial. \n";
            $msg .= "Verifique as parametrizaes no menu Administrao > Inteligncia Artificial > Documentos Relevantes.";
        }
        return $msg;
    }

    protected function verificarExistenciaTipoProcessoConectado($params)
    {
        $arrObjTpProcAPI = $params;

        $arrIds = array();
        foreach ($arrObjTpProcAPI as $objSerie) {
            $arrIds[] = $objSerie->getIdTipoProcedimento();
        }

        $objMdIaAdmDocRelevRN = new MdIaAdmDocRelevRN();

        $objMdIaAdmDocRelevDTO = new MdIaAdmDocRelevDTO();
        $objMdIaAdmDocRelevDTO->retStrNomeTipoProcedimento();
        $objMdIaAdmDocRelevDTO->setNumIdTipoProcedimento($arrIds, InfraDTO::$OPER_IN);
        $objMdIaAdmDocRelevDTO->setNumMaxRegistrosRetorno(1);
        $tipoProcesso = $objMdIaAdmDocRelevRN->consultar($objMdIaAdmDocRelevDTO);

        $msg = "";
        if ($tipoProcesso) {
            $msg .= "No  permitido excluir o Tipo de Processo " . $tipoProcesso->getStrNomeTipoProcedimento() . ", pois ele  utilizado  pelo Mdulo de Inteligncia Artificial. \n";
            $msg .= " Verifique as parametrizaes no menu Administrao > Inteligncia Artificial > Documentos Relevantes.";
        }
        return $msg;
    }
}
