<?php namespace App\Services;

use App\DAO\DAOResponse\DAOResponseInterface;
use App\DAO\Filter\QueryFilter;
use App\DAO\GaleriaDAO;
use App\DAO\Pagination\Pagination;
use App\Mappers\GaleriaMapper;
use App\Services\ServiceResponse\ServiceResponse;
use App\Services\ServiceResponse\ServiceResponseInterface;
use App\Utils\Collections\QueryFilterCollection;
use App\Utils\Collections\QueryOrderCollection;
use App\Utils\ResponseException;

class GaleriaService extends Service
{

    public function registerGaleria (array $data, string $url) : ServiceResponse {
        $galeria_registration_vm = GaleriaMapper::getGaleriaRegistrationVMFromArray($data, $url);
        $galeria_dao = new GaleriaDAO();
        $dao_response = $galeria_dao->persistGaleriaRegistrationVM($galeria_registration_vm);
        $service_response = new ServiceResponse();
        switch ($dao_response->getStatus()) {
            case DAOResponseInterface::SUCESS:
                $data = [
                    'id_galeria' => $dao_response->getData()->getId()
                ];
                $service_response->setStatus(ServiceResponseInterface::SUCESS);
                $service_response->setData($data);
                break;
            case DAOResponseInterface::FOREIGN_KEY_DONT_EXISTS:
            case DAOResponseInterface::DUPLICATED_UNIQUE_KEY:
                $service_response->setStatus(ServiceResponseInterface::VALIDATION_PARAMS_ERROR);
                $service_response->setErrors($dao_response->getErrors());
                break;
            case DAOResponseInterface::DATABASE_CONNECTION_ERROR:
                $service_response->setStatus(ServiceResponseInterface::DATABASE_CONNECTION_ERROR);
                break;
        }
        return $service_response;
    }

    public function getGaleriaList (?Pagination $pagination, ?QueryFilterCollection $query_filter_collection, ?QueryOrderCollection $query_order_collection) : ServiceResponse{
        $galeria_dao = new GaleriaDAO();
        $dao_response = $galeria_dao->getGaleriaList($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 = GaleriaMapper::getGaleriaDetailsArrayFromProcedimentoDetailsVMCollection($dao_response_data);
            $pagination = $dao_response->getPagination();
            $data = [
                'galeria' => $procedimento_details_array,
                'pagination' => $pagination ? $pagination->toResponseArray() : null
            ];
            $service_response->setData($data);
        }
        return $service_response;
    }

    public function getGaleria (QueryFilter $query_filter) : ServiceResponse {
        $exame_dao = new GaleriaDAO();
        $query_filter_collection = new QueryFilterCollection();
        $query_filter_collection->push($query_filter);
        $dao_response = $exame_dao->getGaleria($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 deleteGaleria (int $id_galeria) : ServiceResponse{
        $galeria_dao = new GaleriaDAO();
        $galeria_data = $galeria_dao->getGaleriaId($id_galeria);

        $dao_response = $galeria_dao->deleteGaleria($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;
    }

}