<?php


namespace App\DAO;

use App\DAO\DAOResponse\DAOResponse;
use App\DAO\DAOResponse\DAOResponseInterface;
use App\DAO\Pagination\Pagination;
use App\Entities\DocumentoAnexo\DocumentoAnexo;
use App\Mappers\DocumentoAnexoMapper;
use App\Models\DocumentoAnexoModel;
use App\Services\EncryptService;
use App\Utils\Collections\QueryFilterCollection;
use App\Utils\Collections\QueryOrderCollection;
use App\ViewModels\DocumentoAnexo\DocumentoAnexoRegistrationViewModel\DocumentoAnexoRegistrationViewModel;
use CodeIgniter\Model;
use Exception;

class DocumentoAnexoDAO extends DAO
{
    public function persistDocumentoAnexoRegistrationVM (DocumentoAnexoRegistrationViewModel $arquivo_registration_vm) : DAOResponse {
        $dao_response = new DAOResponse();
        try {
            $galeria = $this->persistDocumentoAnexo($arquivo_registration_vm);
            $error = $this->db->error();
            if ($error && $error['code']) {
                $status_persistence = $error['code'];
                $dao_response_errors = [];
                if (strpos($error['message'],'fk_documentos_anexados_id_pet') !== false) {
                    $dao_response_errors['id_tipo_procedimento'] = 'O pet selecionado não existe';
                }
                if (strpos($error['message'],'fk_documentos_anexados_id_cliente') !== false) {
                    $dao_response_errors['criado_por'] = 'Esse cliente não existe.';
                }
                $dao_response->setErrors($dao_response_errors);
                log_message('error', json_encode($error));
            } else {
                $status_persistence = !!$galeria->getId()
                    ? DAOResponseInterface::SUCESS
                    : DAOResponseInterface::DATABASE_CONNECTION_ERROR;
            }
        } catch (Exception $exception) {
            log_message('error', json_encode($this->db->error()));
            $status_persistence = DAOResponseInterface::DATABASE_CONNECTION_ERROR;
            $galeria = null;
        }
        $this->db->close();
        $dao_response->setStatus($status_persistence);
        if ($status_persistence === DAOResponseInterface::SUCESS) {
            $dao_response->setData($galeria);
        }
        return $dao_response;
    }

    private function persistDocumentoAnexo (DocumentoAnexoRegistrationViewModel $arquivo_registration_vm) : DocumentoAnexo {
        $arquivo_model = new DocumentoAnexoModel ();
        $galeria = DocumentoAnexoMapper::getDocumentoAnexoFromDocumentoAnexoRegistrationVM($arquivo_registration_vm);
        $arquivo_model->registerDocumentoAnexo($galeria);
        return $galeria;
    }

#----------------------------------------------------------------------------------------------------------------#

    public function getDocumentoAnexoList (?Pagination $pagination, ?QueryFilterCollection $query_filter_collection, ?QueryOrderCollection $query_order_collection = null) : DAOResponse {
        $sql = '
            SELECT 
                documentos_anexados.id as id,
                documentos_anexados.id_cliente as id_cliente,
                documentos_anexados.id_pet as id_pet,
                documentos_anexados.url as url,
                documentos_anexados.descricao as descricao,
                documentos_anexados.criado_em as criado_em
            FROM 
                documentos_anexados
        ';
        return $this->getDAOResponseFromPaginatedSelect([], $pagination, $query_filter_collection, $query_order_collection, $sql, function (array $result_array) {
            return DocumentoAnexoMapper::getDocumentoAnexoListVMCollectionFromArray($result_array);
        });
    }

#--------------------------------------------------------------------------------------------------------------------#

    public function getDocumentoAnexo (QueryFilterCollection $query_filter_collection) : DAOResponse {
        $sql = '
            SELECT 
                documentos_anexados.id as id,
                documentos_anexados.id_cliente as id_cliente,
                documentos_anexados.id_pet as id_pet,
                documentos_anexados.url as url,
                documentos_anexados.descricao as descricao,
                documentos_anexados.criado_em as criado_em
            FROM 
                documentos_anexados
        ';
        $binds = [];
        return $this->getDAOResponseFromUniqueRowSelect($binds, $query_filter_collection, $sql, function (array $result_array) {
            $key = "HLuM5EYw5cd0vdJR9yLlM6wt2vte5iniQBqE70nZuhK=";
            $get_file = file_get_contents($result_array[0]["url"]);
            $encrypt = new EncryptService();

            $msg_decrypted = $encrypt->my_decrypt($get_file, $key);
            $base64 = base64_encode($msg_decrypted);

            return DocumentoAnexoMapper::getDocumentoAnexoDetailsVMFromArray($result_array[0], $base64);
        });
    }

# -------------------------------------------------------------------------------------------------------------------------#

    public function getDocumentoAnexoId (int $id_arquivo) {
        $sql = '
            SELECT 
                documentos_anexados.id as id,
                documentos_anexados.id_cliente as id_cliente,
                documentos_anexados.id_pet as id_pet,
                documentos_anexados.url as url,
                documentos_anexados.descricao as descricao,
                documentos_anexados.criado_em as criado_em
            FROM 
                documentos_anexados
            WHERE
                documentos_anexados.id = :id_arquivo:
        ';
        $binds = ['id_arquivo' => $id_arquivo];
        $query = $this->db->query($sql, $binds);
        $result_array = $query->getResultArray();
        return ($result_array[0]['arquivo']);
    }

    public function deleteDocumentoAnexo (int $id_galeria) : DAOResponse {
        $arquivo_model = new DocumentoAnexoModel ();
        $dao_response = $this->getDAOResponseForDeletion($arquivo_model, $id_galeria);
        return $dao_response;
    }

}