<?php namespace App\Services;

use App\DAO\DAOResponse\DAOResponseInterface;
use App\DAO\DocumentoAnexoDAO;
use App\DAO\Filter\QueryFilter;
use App\DAO\Pagination\Pagination;
use App\Mappers\DocumentoAnexoMapper;
use App\Services\ServiceResponse\ServiceResponse;
use App\Services\ServiceResponse\ServiceResponseInterface;
use App\Utils\Collections\QueryFilterCollection;
use App\Utils\Collections\QueryOrderCollection;
use App\Utils\ResponseException;
use CodeIgniter\Model;
use Config\Paths;

class DocumentoAnexoService extends Service
{

    public function registerDocumentoAnexo (array $data) : ServiceResponse {

        if(isset($_FILES['arquivo'])) {
            $ext = "." . pathinfo($_FILES['arquivo']['name'], PATHINFO_EXTENSION);
            //$ext2 = strtolower(substr($_FILES['arquivo']['name'],-4)); //Pegando extensão do arquivo
            $new_name = date("Y.m.d-H.i.s") . $ext; //Definindo um novo nome para o arquivo

            $dir = '../writable/uploads/'. $data['id_cliente'] . '/';
            if(!is_dir($dir)) {mkdir($dir);}
            $dir = $dir.$data['id_pet'].'/';
            if(!is_dir($dir)) {mkdir($dir);}

            move_uploaded_file($_FILES['arquivo']['tmp_name'], $dir.$new_name); //Fazer upload do arquivo

            $key = "HLuM5EYw5cd0vdJR9yLlM6wt2vte5iniQBqE70nZuhK=";
            $msg = file_get_contents($dir.$new_name);
            $encrypt = new EncryptService();
            $msg_encrypted = $encrypt->my_encrypt($msg, $key);
            $file = fopen($dir.$new_name, "wb");
            fwrite($file, $msg_encrypted);
            fclose($file);
        }

        $galeria_registration_vm = DocumentoAnexoMapper::getDocumentoAnexoRegistrationVMFromArray($data, $dir.$new_name);
        $galeria_dao = new DocumentoAnexoDAO();
        $dao_response = $galeria_dao->persistDocumentoAnexoRegistrationVM($galeria_registration_vm);
        $service_response = new ServiceResponse();
        switch ($dao_response->getStatus()) {
            case DAOResponseInterface::SUCESS:
                $data = [
                    'id_arquivo' => $dao_response->getData()->getId()
                ];
                $service_response->setStatus(ServiceResponseInterface::SUCESS);
                $service_response->setData($data);
                break;
            case DAOResponseInterface::FOREIGN_KEY_DONT_EXISTS:
                unlink($dir.$new_name);
                break;
            case DAOResponseInterface::DUPLICATED_UNIQUE_KEY:
                unlink($dir.$new_name);
                $service_response->setStatus(ServiceResponseInterface::VALIDATION_PARAMS_ERROR);
                $service_response->setErrors($dao_response->getErrors());
                break;
            case DAOResponseInterface::DATABASE_CONNECTION_ERROR:
                unlink($dir.$new_name);
                $service_response->setStatus(ServiceResponseInterface::DATABASE_CONNECTION_ERROR);
                break;
        }
        return $service_response;
    }

    public function getDocumentoAnexoList (?Pagination $pagination, ?QueryFilterCollection $query_filter_collection, ?QueryOrderCollection $query_order_collection) : ServiceResponse{
        $galeria_dao = new DocumentoAnexoDAO();
        $dao_response = $galeria_dao->getDocumentoAnexoList($pagination, $query_filter_collection, $query_order_collection);
        switch ($dao_response->getStatus()) {
            case DAOResponseInterface::SUCESS:
                $service_response_status = ServiceResponseInterface::SUCESS;
                break;
            case DAOResponseInterface::RECORD_NOT_FOUND:
                $service_response_status = ServiceResponseInterface::RECORD_NOT_FOUND;
                break;
            case DAOResponseInterface::DATABASE_CONNECTION_ERROR:
                $service_response_status = ServiceResponseInterface::DATABASE_CONNECTION_ERROR;
                break;
        }
        $service_response = ServiceResponse::builder()
            ->setStatus($service_response_status)
            ->build();
        if ($service_response_status === DAOResponseInterface::SUCESS) {
            $dao_response_data = $dao_response->getData();
            $procedimento_details_array = DocumentoAnexoMapper::getDocumentoAnexoDetailsArrayFromProcedimentoDetailsVMCollection($dao_response_data);
            $pagination = $dao_response->getPagination();
            $data = [
                'arquivo' => $procedimento_details_array,
                'pagination' => $pagination ? $pagination->toResponseArray() : null
            ];
            $service_response->setData($data);
        }
        return $service_response;
    }


    public function getDocumentoAnexo (QueryFilter $query_filter) : ServiceResponse {
        $exame_dao = new DocumentoAnexoDAO();
        $query_filter_collection = new QueryFilterCollection();
        $query_filter_collection->push($query_filter);
        $dao_response = $exame_dao->getDocumentoAnexo($query_filter_collection);
        $service_response_status = [
            DAOResponseInterface::SUCESS => ServiceResponseInterface::SUCESS,
            DAOResponseInterface::RECORD_NOT_FOUND => ServiceResponseInterface::RECORD_NOT_FOUND,
            DAOResponseInterface::DATABASE_CONNECTION_ERROR => ServiceResponseInterface::DATABASE_CONNECTION_ERROR,
        ][$dao_response->getStatus()];
        $service_response = ServiceResponse::builder()
            ->setStatus($service_response_status ?? ServiceResponseInterface::UNKNOWN_ERROR)
            ->build();
        if ($service_response_status === ServiceResponseInterface::SUCESS) {
            $service_response->setData($dao_response->getData()->toArray());
        }
        return $service_response;
    }

    public function deleteDocumentoAnexo (int $id_galeria) : ServiceResponse{
        $galeria_dao = new DocumentoAnexoDAO();
        $galeria_data = $galeria_dao->getDocumentoAnexoId($id_galeria);

        $dao_response = $galeria_dao->deleteDocumentoAnexo($id_galeria);
        $service_response_status = [
            DAOResponseInterface::RESTRICT_FK_UPDATE_OR_DELETION => ServiceResponseInterface::RECORD_IS_LINKED,
            DAOResponseInterface::SUCESS => ServiceResponseInterface::SUCESS,
            DAOResponseInterface::RECORD_NOT_FOUND => ServiceResponseInterface::RECORD_NOT_FOUND,
        ][$dao_response->getStatus()];

        if($dao_response->getStatus() == 1){ unlink($galeria_data); }

        $service_response = ServiceResponse::builder()
            ->setStatus($service_response_status)
            ->build();
        return $service_response;
    }

}