<?php

namespace app\Controllers;

use App\Controllers\BaseController;
use App\Services\ServiceResponse\ServiceResponseInterface;
use CodeIgniter\HTTP\Response;
use CodeIgniter\HTTP\ResponseInterface;
use App\Services\AuditComandaService;
use App\Validations\AuditComandaValidator;
use App\Services\ComandaService;
use App\Services\RequisicaoService;

class AuditComandaController extends BaseController {

	public function getItensByComandaId(int $comandaId): Response {

		$service = new AuditComandaService();
		$service_response = $service->getItensByComandaId( $comandaId );
		$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 pesquisa foi realizada com sucesso.'
			],
			ServiceResponseInterface::HAVE_CONFLICTS => [ 
				'code' => ResponseInterface::HTTP_CONFLICT,
				'message' => 'Não foi possível realizar a pesquisa, pois foram detectados conflitos com os dados informados.'
			],
			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.'
			],
			ServiceResponseInterface::UNKNOWN_ERROR => [ 
				'code' => ResponseInterface::HTTP_MULTI_STATUS,
				'message' => 'O processo retornou multiplas mensagens.'
			]
		];
		return $this->getResponse( $service_response, $response_messages );

	}

	public function getProntuarioByComandaId(int $comandaId): Response {

		$service = new AuditComandaService();
		$service_response = $service->getProntuarioByComandaId( $comandaId );
		$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 pesquisa foi realizada com sucesso.'
			],
			ServiceResponseInterface::HAVE_CONFLICTS => [ 
				'code' => ResponseInterface::HTTP_CONFLICT,
				'message' => 'Não foi possível realizar a pesquisa, pois foram detectados conflitos com os dados informados.'
			],
			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.'
			],
			ServiceResponseInterface::UNKNOWN_ERROR => [ 
				'code' => ResponseInterface::HTTP_MULTI_STATUS,
				'message' => 'O processo retornou multiplas mensagens.'
			]
		];
		return $this->getResponse( $service_response, $response_messages );

	}

	public function getAssistenteAviableToRequisicao(int $requisicaoId): Response {

		$service = new AuditComandaService();
		$service_response = $service->getAssistenteAviableToRequisicao( $requisicaoId );
		$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 pesquisa foi realizada com sucesso.'
			],
			ServiceResponseInterface::HAVE_CONFLICTS => [ 
				'code' => ResponseInterface::HTTP_CONFLICT,
				'message' => 'Não foi possível realizar a pesquisa, pois foram detectados conflitos com os dados informados.'
			],
			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.'
			],
			ServiceResponseInterface::UNKNOWN_ERROR => [ 
				'code' => ResponseInterface::HTTP_MULTI_STATUS,
				'message' => 'O processo retornou multiplas mensagens.'
			]
		];
		return $this->getResponse( $service_response, $response_messages );

	}

	public function adminExecExame(): Response {

		$request = $this->getDataPost();

		if (count( AuditComandaValidator::adminExecExame( $request ) ) > 0) {
			return $this->response->setStatusCode( 400 )
				->setJSON( [ 
				'message' => 'Informe os dados corretamente.',
				'errors' => AuditComandaValidator::adminExecExame( $request )
			] );
		}

		$requisicao_service = new RequisicaoService();
		$req_response = $requisicao_service->getDadosRequisicaoID( intval( $request ['requisicao_id'] ) );

		
		if ($req_response->getStatus() != ServiceResponseInterface::SUCESS) {
			return $this->response->setStatusCode( 400 )
			->setJSON( [
					'message' => 'Informe os dados corretamente.',
					'errors' => $req_response->getErrors()
			] );
		}
		
		
		$obj_req = $req_response->getData();
		
		$obj_data = $obj_req ['data_requisicao'] . ' ' . $obj_req ['hora_requisicao'];
		$obj_exec = $request ['data_exec'] . ' ' . $request ['hora_exec'];
		
		if ($obj_data > $obj_exec) {
			$erros_resp = $obj_exec . ' < ' . $obj_data;
			return $this->response->setStatusCode( 400 )
			->setJSON( [
					'message' => 'A execução não pode ser anterior a requisição.',
					'errors' => $erros_resp
			] );
		}
		
		
		$service = new AuditComandaService();
		$service_response = $service->adminExecExame( $request );

		$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 requisição foi executada com sucesso.'
			],
			ServiceResponseInterface::HAVE_CONFLICTS => [ 
				'code' => ResponseInterface::HTTP_CONFLICT,
				'message' => 'Não foi possível executar a requisição, pois foram detectados conflitos com os dados informados.'
			],
			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.'
			],
			ServiceResponseInterface::UNKNOWN_ERROR => [ 
				'code' => ResponseInterface::HTTP_MULTI_STATUS,
				'message' => 'O processo retornou multiplas mensagens.'
			],
			ServiceResponseInterface::INSUFFICIENT_DATA => [ 
				'code' => ResponseInterface::HTTP_BAD_REQUEST,
				'message' => 'Informe os dados corretamente.'
			]
		];
		return $this->getResponse( $service_response, $response_messages );

	}

	public function adminExcluirExame(): Response {

		$request = $this->getDataPost();

		if (count( AuditComandaValidator::adminExcluirExame( $request ) ) > 0) {
			return $this->response->setStatusCode( 400 )
				->setJSON( [ 
				'message' => 'Informe os dados corretamente.',
				'errors' => AuditComandaValidator::adminExcluirExame( $request )
			] );
		}

		$service = new AuditComandaService();
		$service_response = $service->adminExcluirExame( $request );

		$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 requisição excluida com sucesso.'
			],
			ServiceResponseInterface::HAVE_CONFLICTS => [ 
				'code' => ResponseInterface::HTTP_CONFLICT,
				'message' => 'Não foi possível excluir a requisicao, pois foram detectados conflitos com os dados informados.'
			],
			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.'
			],
			ServiceResponseInterface::UNKNOWN_ERROR => [ 
				'code' => ResponseInterface::HTTP_MULTI_STATUS,
				'message' => 'O processo retornou multiplas mensagens.'
			],
			ServiceResponseInterface::INSUFFICIENT_DATA => [ 
				'code' => ResponseInterface::HTTP_BAD_REQUEST,
				'message' => 'Informe os dados corretamente.'
			]
		];
		return $this->getResponse( $service_response, $response_messages );

	}

	public function adminNewReqExecExame(): Response {

		$request = $this->getDataPost();

		if (count( AuditComandaValidator::adminNewReqExecExame( $request ) ) > 0) {
			return $this->response->setStatusCode( 400 )
				->setJSON( [ 
				'message' => 'Informe os dados corretamente.',
				'errors' => AuditComandaValidator::adminNewReqExecExame( $request )
			] );
		}

		$comanda_service = new ComandaService();
		$comanda_response = $comanda_service->getDadosComandaID( intval( $request ['id_comanda'] ) );

		if ($comanda_response->getStatus() == ServiceResponseInterface::RECORD_NOT_FOUND) {
			return $this->response->setStatusCode( 400 )
				->setJSON( [ 
				'message' => 'Comanda não encontrada.',
				'errors' => $comanda_response->getErrors()
			] );
		}

		if ($comanda_response->getStatus() != ServiceResponseInterface::SUCESS) {
			return $this->response->setStatusCode( 400 )
				->setJSON( [ 
				'message' => 'Informe os dados corretamente.',
				'errors' => $comanda_response->getErrors()
			] );
		}

		$objComanda = $comanda_response->getData();

		$obj_data = $objComanda ['data_criada'] . ' ' . $objComanda ['hora_criada'];
		$obj_exec = $request ['data_exec'] . ' ' . $request ['hora_exec'];

		if ($obj_data > $obj_exec) {
			$erros_resp = $obj_exec . ' < ' . $obj_data;
			return $this->response->setStatusCode( 400 )
				->setJSON( [ 
				'message' => 'A data do procedimento é anterior a abertura da comanda.',
				'errors' => $erros_resp
			] );
		}

		$service = new AuditComandaService();
		$service_response = $service->adminNewReqExecExame( $request );

		$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 requisição incluída com sucesso.'
			],
			ServiceResponseInterface::HAVE_CONFLICTS => [ 
				'code' => ResponseInterface::HTTP_CONFLICT,
				'message' => 'Não foi possível incluir a requisição, pois foram detectados conflitos com os dados informados.'
			],
			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.'
			],
			ServiceResponseInterface::UNKNOWN_ERROR => [ 
				'code' => ResponseInterface::HTTP_MULTI_STATUS,
				'message' => 'O processo retornou multiplas mensagens.'
			],
			ServiceResponseInterface::INSUFFICIENT_DATA => [ 
				'code' => ResponseInterface::HTTP_BAD_REQUEST,
				'message' => 'Informe os dados corretamente.'
			]
		];
		return $this->getResponse( $service_response, $response_messages );

	}
	
	public function adminExcluirConsulta(): Response {
		
		$request = $this->getDataPost();
		
		if (count( AuditComandaValidator::adminExcluirConsulta( $request ) ) > 0) {
			return $this->response->setStatusCode( 400 )
			->setJSON( [
					'message' => 'Informe os dados corretamente.',
					'errors' => AuditComandaValidator::adminExcluirConsulta( $request )
			] );
		}
		
		$service = new AuditComandaService();
		$service_response = $service->adminExcluirConsulta( $request );
		
		$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 requisição excluida com sucesso.'
				],
				ServiceResponseInterface::HAVE_CONFLICTS => [
						'code' => ResponseInterface::HTTP_CONFLICT,
						'message' => 'Não foi possível excluir a requisicao, pois foram detectados conflitos com os dados informados.'
				],
				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.'
				],
				ServiceResponseInterface::UNKNOWN_ERROR => [
						'code' => ResponseInterface::HTTP_MULTI_STATUS,
						'message' => 'O processo retornou multiplas mensagens.'
				],
				ServiceResponseInterface::INSUFFICIENT_DATA => [
						'code' => ResponseInterface::HTTP_BAD_REQUEST,
						'message' => 'Informe os dados corretamente.'
				]
		];
		return $this->getResponse( $service_response, $response_messages );
		
	}

}

