<?php


namespace App\Controllers;

use App\DAO\Filter\QueryFilter;
use App\DAO\Filter\QueryFilterTranslator;
use App\DAO\Order\QueryOrderTranslator;
use App\Services\PacienteService;
use App\Services\ServiceResponse\ServiceResponseInterface;
use App\Services\TipoProcedimentoService;
use App\Utils\Collections\QueryFilterCollection;
use App\Utils\Collections\QueryOrderCollection;
use App\Validations\PacienteValidation;
use App\Validations\TipoProcedimentoValidation;
use CodeIgniter\HTTP\Response;
use CodeIgniter\HTTP\ResponseInterface;

class TipoProcedimentoController extends BaseController
{
    public function registerTipoProcedimento(): Response
    {
        if (!$this->validate(TipoProcedimentoValidation::register())) {
            return $this->response->setJSON([
                'message' => 'Informe os dados corretamente.',
                'errors' => $this->validation->getErrors()
            ]);
        }
        $tipo_procedimento_service_response = (new TipoProcedimentoService())->registerTipoProcedimento($_POST);
        $response_messages = [
            ServiceResponseInterface::DATABASE_CONNECTION_ERROR => [
                'code' => ResponseInterface::HTTP_INTERNAL_SERVER_ERROR,
                'message' => 'Erro de conexão com o banco de dados.'
            ],
            ServiceResponseInterface::SUCESS => [
                'code' => ResponseInterface::HTTP_OK,
                'message' => 'O tipo de procedimento foi cadastrado com sucesso.'
            ],
            ServiceResponseInterface::VALIDATION_PARAMS_ERROR => [
                'code' => ResponseInterface::HTTP_BAD_REQUEST,
                'message' => 'Informe os dados corretamente.'
            ],
            ServiceResponseInterface::SERVICE_INTERNAL_ERROR => [
                'code' => ResponseInterface::HTTP_INTERNAL_SERVER_ERROR,
                'message' => 'Erro interno do servidor.'
            ],
        ];
        return $this->getResponse($tipo_procedimento_service_response, $response_messages);
    }

    public function getTipoProcedimentoList () : Response {
        $pagination = $this->getPaginationFromRequest();
        if ($_GET['sort'] === null) {
            $_GET['sort'] = "descricao";
        }
        $query_filter_collection = new QueryFilterCollection($_GET, QueryFilterTranslator::tipo_procedimento());
        $query_order_collection = new QueryOrderCollection($_GET, QueryOrderTranslator::tipo_procedimento());

        $tipo_procedimento_service_response = (new TipoProcedimentoService())->getTipoProcedimentoList($pagination, $query_filter_collection, $query_order_collection);
        $response_messages = [
            ServiceResponseInterface::SUCESS => [
                'code' => ResponseInterface::HTTP_OK,
                'message' => 'Os dados dos tipos de procedimento foram encontrados com sucesso.'
            ],
            ServiceResponseInterface::RECORD_NOT_FOUND => [
                'code' => ResponseInterface::HTTP_PARTIAL_CONTENT,
                'message' => 'Nenhum registro foi encontrado.'
            ],
            ServiceResponseInterface::SERVICE_INTERNAL_ERROR => [
                'code' => ResponseInterface::HTTP_INTERNAL_SERVER_ERROR,
                'message' => 'Erro interno do servidor.'
            ],
            ServiceResponseInterface::DATABASE_CONNECTION_ERROR => [
                'code' => ResponseInterface::HTTP_INTERNAL_SERVER_ERROR,
                'message' => 'Erro interno do servidor.'
            ],
        ];
        return $this->getResponse($tipo_procedimento_service_response, $response_messages);
    }

    public function searchTipoProcedimentoByID (int $id_erro) : Response {
        $query_filter = QueryFilter::builder()
            ->setTable('tipo_procedimento')
            ->setNameParam('id')
            ->setValue($id_erro)
            ->setIsExact(true)
            ->build();
        $erro_service_response = (new TipoProcedimentoService())->getTipoProcedimento($query_filter);
        $response_messages = [
            ServiceResponseInterface::SUCESS => [
                'code' => ResponseInterface::HTTP_OK,
                'message' => 'Os dados do especie foram encontrados com sucesso.'
            ],
            ServiceResponseInterface::RECORD_NOT_FOUND => [
                'code' => ResponseInterface::HTTP_PARTIAL_CONTENT,
                'message' => 'Nenhum registro foi encontrado.'
            ],
            ServiceResponseInterface::SERVICE_INTERNAL_ERROR => [
                'code' => ResponseInterface::HTTP_INTERNAL_SERVER_ERROR,
                'message' => 'Erro interno do servidor.'
            ],
            ServiceResponseInterface::DATABASE_CONNECTION_ERROR => [
                'code' => ResponseInterface::HTTP_INTERNAL_SERVER_ERROR,
                'message' => 'Erro interno do servidor.'
            ],
        ];
        return $this->getResponse($erro_service_response, $response_messages);
    }

    public function updateTipoProcedimento (int $id_erro) : Response {
        if (!$this->validate(TipoProcedimentoValidation::update())) {
            return $this->response->setJSON([
                'message' => 'Informe os dados corretamente.',
                'errors' => $this->validation->getErrors()
            ]);
        }
        $erro_service_response = (new TipoProcedimentoService())->updateTipoProcedimentoData($id_erro, $_POST);
        $response_messages = [
            ServiceResponseInterface::DATABASE_CONNECTION_ERROR => [
                'code' => ResponseInterface::HTTP_INTERNAL_SERVER_ERROR,
                'message' => 'Erro de conexão com o banco de dados.'
            ],
            ServiceResponseInterface::RECORD_NOT_FOUND => [
                'code' => ResponseInterface::HTTP_PARTIAL_CONTENT,
                'message' => 'O especie não foi encontrado.'
            ],
            ServiceResponseInterface::SUCESS => [
                'code' => ResponseInterface::HTTP_OK,
                'message' => 'Os dados do especie foram atualizados com sucesso.'
            ],
            ServiceResponseInterface::VALIDATION_PARAMS_ERROR => [
                'code' => ResponseInterface::HTTP_BAD_REQUEST,
                'message' => 'Informe os dados corretamente.'
            ],
        ];
        return $this->getResponse($erro_service_response, $response_messages);
    }

    public function deleteTipoProcedimento (int $id_tipo_procedimento) {
        $tipo_procedimento_service_response = (new TipoProcedimentoService())->deleteTipoProcedimento($id_tipo_procedimento);
        $response_messages = [
            ServiceResponseInterface::SUCESS => [
                'code' => ResponseInterface::HTTP_OK,
                'message' => 'A exclusão foi efetuda com sucesso.'
            ],
            ServiceResponseInterface::RECORD_NOT_FOUND => [
                'code' => ResponseInterface::HTTP_PARTIAL_CONTENT,
                'message' => 'Nenhum registro foi encontrado.'
            ],
            ServiceResponseInterface::RECORD_IS_LINKED => [
                'code' => ResponseInterface::HTTP_BAD_REQUEST,
                'message' => 'Esse tipo de procedimento está vinculado a outros cadastros do sistema. Portanto, não pode ser excluído.'
            ],
            ServiceResponseInterface::DATABASE_CONNECTION_ERROR => [
                'code' => ResponseInterface::HTTP_INTERNAL_SERVER_ERROR,
                'message' => 'Erro interno do servidor.'
            ],
        ];
        return $this->getResponse($tipo_procedimento_service_response, $response_messages);
    }
}
