<?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\EspecialidadeService;
use App\Utils\Collections\QueryFilterCollection;
use App\Utils\Collections\QueryOrderCollection;
use App\Validations\PacienteValidation;
use App\Validations\EspecialidadeValidation;
use CodeIgniter\HTTP\Response;
use CodeIgniter\HTTP\ResponseInterface;

class EspecialidadeController extends BaseController {

	public function registerEspecialidade(): Response {

		if (!$this->validate( EspecialidadeValidation::register() )) {
			return $this->response->setJSON( [ 
				'message' => 'Informe os dados corretamente.',
				'errors' => $this->validation->getErrors() ] );
		}
		$especialidade_service_response = (new EspecialidadeService())->registerEspecialidade( $_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' => 'A especialidade foi cadastrada 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( $especialidade_service_response, $response_messages );

	}

	public function getEspecialidadeList(): Response {

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

		$especialidade_service_response = (new EspecialidadeService())->getEspecialidadeList( $pagination, $query_filter_collection, $query_order_collection );
		$response_messages = [ 
			ServiceResponseInterface::SUCESS => [ 
				'code' => ResponseInterface::HTTP_OK,
				'message' => 'Os dados das especialidades 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( $especialidade_service_response, $response_messages );

	}

	public function searchEspecialidadeByID(int $id_erro): Response {

		$query_filter = QueryFilter::builder()->setTable( 'especialidade' )
			->setNameParam( 'id' )
			->setValue( $id_erro )
			->setIsExact( true )
			->build();
		$erro_service_response = (new EspecialidadeService())->getEspecialidade( $query_filter );
		$response_messages = [ 
			ServiceResponseInterface::SUCESS => [ 
				'code' => ResponseInterface::HTTP_OK,
				'message' => 'Os dados das especialidades 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 updateEspecialidade(int $id_erro): Response {

		if (!$this->validate( EspecialidadeValidation::update() )) {
			return $this->response->setJSON( [ 
				'message' => 'Informe os dados corretamente.',
				'errors' => $this->validation->getErrors() ] );
		}
		$erro_service_response = (new EspecialidadeService())->updateEspecialidadeData( $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' => 'A especialidade não foi encontrado.' ],
			ServiceResponseInterface::SUCESS => [ 
				'code' => ResponseInterface::HTTP_OK,
				'message' => 'Os dados da especialidade 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 deleteEspecialidade(int $id_especialidade) {

		$especialidade_service_response = (new EspecialidadeService())->deleteEspecialidade( $id_especialidade );
		$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' => 'Essa especialidade está vinculada 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( $especialidade_service_response, $response_messages );

	}

	public function getEspecialidadeListByUnidadeId(int $id_unidade): Response {

		$especialidade_service = new EspecialidadeService();
		$especialidade_service_response = $especialidade_service->getEspecialidadeListByUnidadeId( $id_unidade );

		$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' => 'Essa especialidade está vinculada 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( $especialidade_service_response, $response_messages );

	}
	
}

