<?php

/**
 * Copyright 2005-2024 de Solis Soluções Livres Ltda.
 *
 * Este arquivo é parte do programa Gnuteca.
 *
 * O Gnuteca é um software de propriedade da SOLIS, sendo desenvolvido
 * e mantido exclusivamente por esta empresa.
 *
 * A licença de uso está disponível mediante aquisição exclusiva junto à
 * SOLIS. A licença é concedida sem caráter de exclusividade ao licenciado.
 * Os direitos de uso são perpétuos.
 *
 * Embora os códigos fontes sejam fornecidos, o software é de propriedade
 * da SOLIS, não sendo permitido ao adquirente da licença a sua revenda,
 * empréstimo ou cessão (onerosa ou não) à terceiros. Também não é permitido,
 * a qualquer título e tempo, promover no software qualquer tipo de alienação,
 * reprodução, distribuição, divulgação, registro, licenciamento, transferência
 * ou qualquer outro ato que prejudique ou comprometa os direitos de propriedade
 * de software, o nome e a imagem da sua proprietária e do próprio software,
 * além de configurar concorrência à SOLIS.
 *
 * O licenciado, com o acesso ao código fonte do software, terá o direito de
 * promover mudanças no respectivo código. No entanto, nas situações em que ele
 * contar com o suporte oficial prestado pela SOLIS, não poderá promover mudanças
 * no código fonte, sob pena de perda do referido suporte.
 *
 * Para conhecer em detalhes o Termo de Licenciamento do Software Gnuteca
 * leia o arquivo “LICENCA.txt” disponível junto ao código deste software.
 * 
 * 
 * 
 *
 *
 *
 *
 *
 **/

 $MIOLO->getClass('gnuteca3', 'GJWT');
class GAvaliacaoInstitucionalUnivatesService
{
    private $url;
    private $refAvaliacao;
    private $pessoa;
    private $logPath;
    private $avaliacaoSecret;

    public function __construct($pessoa)
    {
        $MIOLO = MIOLO::getInstance();

        $this->url = AVALIACAO_INSTITUCIONAL_UNIVATES_URL;
        $this->refAvaliacao = AVALIACAO_INSTITUCIONAL_UNIVATES_ID_AVALIACAO;
        $this->pessoa = $pessoa;
        $this->avaliacaoSecret = AVALIACAO_INSTITUCIONAL_UNIVATES_SECRET;

        $this->logPath = $MIOLO->getAbsolutePath() . '/var/log/gnuteca3-avaliacao-institucional.log';
    }

    /**
     * Gera o Token JWT
     * 
     * @return (text) Token JWT
     */
    private function obterAuthorization()
    {
        $payload = array(
            'expires' => strtotime('+ 30 second')
        );

        $jwt = GJWT::gerar($this->avaliacaoSecret, $payload);

        $this->log("JWT gerado: {$jwt}");

        return $jwt;
    }


    /**
     * Obtém dados da avaliação institucional (verifica se usuário respondeu)
     *  
     * @return (object) Objeto contendo dados de formulário e questões.
     */
    public function obterDadosAvaliacao()
    {
        $this->log("Verificando resposta do usuário {$this->pessoa}");
        $token = $this->obterAuthorization();

        $ch = curl_init("{$this->url}/avaliacao/buscaDadosAvaliacao?ref_avaliacao={$this->refAvaliacao}&ref_pessoa={$this->pessoa}&fl_institucional=false");
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET"); 
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Accept: application/json',
            'Content-Type: application/json',
            "Authorization: Bearer ${token}")
        );

        $response = curl_exec($ch);
        $this->log($response);
        $err = curl_error($ch);
        $info = curl_getinfo($ch);

        if ( $info['http_code'] == 200 )
        {
            $object = json_decode($response);

            $this->log($response);

            if ( ($object->status == "success" && $object->data == null ) || $object->status == 'error' || !$object )
            {
                $this->log("Usuário {$this->pessoa} não está apto para responder ou já respondeu a avaliação");
                return null;
            }
            else
            {

                $this->log("Dados de avaliação obtidos com sucesso para usuário {$this->pessoa}");
                return $object;
            }
        }
        else
        {
            $this->log("Não foi possível obter dados para usuário {$this->pessoa}");
            $this->log(var_export($response));
            $this->log(var_export($err));

            return null;
        }

        curl_close($ch);
    }

    /**
     * Envia/concluí a avaliação institucional
     * 
     * @param (object) Dados do POST.
     * @return (boolean) Retorna true/false se a avaliação foi salva com sucesso.
     */
    public function concluirAvaliacao($data)
    {
        $this->log("Concluíndo avaliação do usuário {$this->pessoa}");

        $args = new stdClass();
        $args->ref_pessoa = $this->pessoa;
        $args->ref_formulario = $data->refFormulario;
        $args->indice = $data->indice;
        $questoes = array();

        $questao1 = new stdClass();
        $questao1->id = $data->idQuestao1;
        $questao1->tipo = 5;
        $questao1->valor = $data->questao1;
        $args->questoes[] = $questao1;

        $questao2 = new stdClass();
        $questao2->id = $data->idQuestao2;
        $questao2->tipo = 1;
        $questao2->valor = $data->questao2;
        $args->questoes[] = $questao2;

        $dados = json_encode($args);

        $this->log("Dados enviados: {$dados}");
        $token = $this->obterAuthorization();

        $ch = curl_init("{$this->url}/avaliacao/gravarAvaliacao");
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); 
        curl_setopt($ch, CURLOPT_POSTFIELDS, $dados);  
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Accept: application/json',
            'Content-Type: application/json',
            "Authorization: Bearer ${token}")
        );

        $response = curl_exec($ch);
        $this->log($response);
        $err = curl_error($ch);
        $info = curl_getinfo($ch);

        if ( $info['http_code'] == 200 )
        {   
            //$this->log("Dados de avaliação obtidos com sucesso para usuário {$this->pessoa}");
            $object = json_decode($response);

            if ( $object->status == "error" )
            {
                $this->log("Não foi possível salvar a avaliação da {$this->pessoa}, erro: {$object->data}");
                return false;
            }
            else
            {
                return true;
            }
        }
        else
        {
            $this->log("Não foi possível salvar a avaliação da {$this->pessoa}");
            $this->log(var_export($err));

            return false;
        }

        return false;
    }

    /**
     * Registra log de integração com avaliação institucional.
     * 
     * @param (text) Mensagem que deve ser registrada no log.
     * @return void
     */
    public function log($mensagem)
    {
        file_put_contents($this->logPath, date('d/m/Y H:i:s'). ' - ' . $mensagem . "\n", FILE_APPEND);
    }
}

?>
