<?php namespace App\Services;

use App\DAO\DAOResponse\DAOResponseInterface;
use App\DAO\DocumentoGeradoDAO;
use App\DAO\Filter\QueryFilter;
use App\DAO\Pagination\Pagination;
use App\Mappers\DocumentoGeradoMapper;
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 DocumentoGeradoService extends Service
{

    public function getDocumentoGeradoList (?Pagination $pagination, ?QueryFilterCollection $query_filter_collection, ?QueryOrderCollection $query_order_collection) : ServiceResponse{
        $galeria_dao = new DocumentoGeradoDAO();
        $dao_response = $galeria_dao->getDocumentoGeradoList($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 = DocumentoGeradoMapper::getDocumentoGeradoDetailsArrayFromProcedimentoDetailsVMCollection($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 getDocumentoGerado (QueryFilter $query_filter) : ServiceResponse {
        $exame_dao = new DocumentoGeradoDAO();
        $query_filter_collection = new QueryFilterCollection();
        $query_filter_collection->push($query_filter);
        $dao_response = $exame_dao->getDocumentoGerado($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;
    }
}