<?php

namespace App\Controllers;

use App\Controllers\BaseController;
use CodeIgniter\HTTP\Response;
use CodeIgniter\HTTP\ResponseInterface;
use App\Services\OrcamentoClienteService;
use App\Services\ServiceResponse\ServiceResponseInterface;
use App\Validations\OrcamentoClienteValidation;

class OrcamentoClienteController extends BaseController {
	
	public function register():Response {
		
		$request = $this->getDataPost();
		
		if (count( OrcamentoClienteValidation::register( $request ) ) > 0) {
			return $this->response->setStatusCode( 400 )
			->setJSON( [
					'message' => 'Informe os dados corretamente.',
					'errors' => OrcamentoClienteValidation::register( $request )
			] );
		}
		
		$service = new OrcamentoClienteService();
		$service_response = $service->register($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' => 'O Orçamento foi cadastrado com sucesso.'
				],
				ServiceResponseInterface::HAVE_CONFLICTS => [
						'code' => ResponseInterface::HTTP_BAD_REQUEST,
						'message' => 'Não foi possível cadastrar o orçamento, pois foram detectados conflitos com horários já cadastrados.'
				],
				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_INTERNAL_SERVER_ERROR,
						'message' => 'Erro interno do servidor.'
				]
		];
		
		return $this->getResponse( $service_response, $response_messages );
		
	}
	
	public function update():Response {
		$request = $this->getDataPost();
		
		if (count( OrcamentoClienteValidation::update( $request ) ) > 0) {
			return $this->response->setStatusCode( 400 )
			->setJSON( [
					'message' => 'Informe os dados corretamente.',
					'errors' => OrcamentoClienteValidation::update( $request )
			] );
		}
		
		$service = new OrcamentoClienteService();
		$service_response = $service->update($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' => 'O Orçamento foi cadastrado com sucesso.'
				],
				ServiceResponseInterface::HAVE_CONFLICTS => [
						'code' => ResponseInterface::HTTP_BAD_REQUEST,
						'message' => 'Não foi possível cadastrar o orçamento, pois foram detectados conflitos com horários já cadastrados.'
				],
				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_INTERNAL_SERVER_ERROR,
						'message' => 'Erro interno do servidor.'
				]
		];
		
		return $this->getResponse( $service_response, $response_messages );
	}
	
	public function getOrcamentoByClienteIdFromUnidadeId( int $id_unidade,int $id_cliente):Response{
		
		$service = new OrcamentoClienteService();
		
		$service_sync_espirado = $service->syncOrcamentoStatusExpiradoUnidadeCliente($id_unidade, $id_cliente);
				
		$service_response = $service->getListOrcamentosByClienteID($id_unidade, $id_cliente);
		
		$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 Orçamento foi cadastrado com sucesso.'
				],
				ServiceResponseInterface::RECORD_NOT_FOUND => [
						'code' => ResponseInterface::HTTP_NO_CONTENT,
						'message' => 'Não foram encontrados registros.'
				],
				ServiceResponseInterface::HAVE_CONFLICTS => [
						'code' => ResponseInterface::HTTP_BAD_REQUEST,
						'message' => 'Não foi possível cadastrar o orçamento, pois foram detectados conflitos com horários já cadastrados.'
				],
				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_INTERNAL_SERVER_ERROR,
						'message' => 'Erro interno do servidor.'
				]
		];
		
		return $this->getResponse( $service_response, $response_messages );
	}
	
	public function getOrcamentoByPetIdFromUnidadeId( int $id_unidade,int $id_pet):Response{
		
		$service = new OrcamentoClienteService();
		
		$service_sync_espirado = $service->syncOrcamentoStatusExpiradoUnidadePet($id_unidade, $id_pet);
		
		$service_response = $service->getListOrcamentosByPetID($id_unidade, $id_pet);
		
		$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 Orçamento foi cadastrado com sucesso.'
				],
				ServiceResponseInterface::RECORD_NOT_FOUND => [
						'code' => ResponseInterface::HTTP_NO_CONTENT,
						'message' => 'Não foram encontrados registros.'
				],
				ServiceResponseInterface::HAVE_CONFLICTS => [
						'code' => ResponseInterface::HTTP_BAD_REQUEST,
						'message' => 'Não foi possível cadastrar o orçamento, pois foram detectados conflitos com horários já cadastrados.'
				],
				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_INTERNAL_SERVER_ERROR,
						'message' => 'Erro interno do servidor.'
				]
		];
		
		return $this->getResponse( $service_response, $response_messages );
	}
	
	public function getOrcamentoId( int $id_orcamento):Response{
		
		$service = new OrcamentoClienteService();
		$service_sync_espirado = $service->syncOrcamentoStatusExpirado($id_orcamento);
		$service_response = $service->getOrcamentoId($id_orcamento);
		
		$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 Orçamento foi cadastrado com sucesso.'
				],
				ServiceResponseInterface::RECORD_NOT_FOUND => [
						'code' => ResponseInterface::HTTP_NO_CONTENT,
						'message' => 'Não foram encontrados registros.'
				],
				ServiceResponseInterface::HAVE_CONFLICTS => [
						'code' => ResponseInterface::HTTP_BAD_REQUEST,
						'message' => 'Não foi possível cadastrar o orçamento, pois foram detectados conflitos com horários já cadastrados.'
				],
				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_INTERNAL_SERVER_ERROR,
						'message' => 'Erro interno do servidor.'
				]
		];
		
		return $this->getResponse( $service_response, $response_messages );
	}
	
	public function getOrcamentoIdDetalhe( int $id_orcamento):Response{
		
		$service = new OrcamentoClienteService();
		$service_response = $service->getOrcamentoDetalhe($id_orcamento);
		
		$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 Orçamento foi cadastrado com sucesso.'
				],
				ServiceResponseInterface::RECORD_NOT_FOUND => [
						'code' => ResponseInterface::HTTP_NO_CONTENT,
						'message' => 'Não foram encontrados registros.'
				],
				ServiceResponseInterface::HAVE_CONFLICTS => [
						'code' => ResponseInterface::HTTP_BAD_REQUEST,
						'message' => 'Não foi possível cadastrar o orçamento, pois foram detectados conflitos com horários já cadastrados.'
				],
				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_INTERNAL_SERVER_ERROR,
						'message' => 'Erro interno do servidor.'
				]
		];
		
		return $this->getResponse( $service_response, $response_messages );
	}
	
	public function registerRequisicaoFromOrcamento():Response {
		$request = $this->getDataPost();
		
		if (count( OrcamentoClienteValidation::makerequisicao( $request ) ) > 0) {
			return $this->response->setStatusCode( 400 )
			->setJSON( [
					'message' => 'Informe os dados corretamente.',
					'errors' => OrcamentoClienteValidation::makerequisicao( $request )
			] );
		}
		
		$service = new OrcamentoClienteService();
		$validade = $service->isValidOrcamento($request);
		
		if(!$validade){
			return $this->response->setStatusCode( 400 )
			->setJSON( [
					'message' => 'Orçamento fora da validade.',
					'errors' => ''
			] );
		}
		
		$validade_unidade = $service->isValidOrcamentoUnidade($request);
		
		if(!$validade_unidade){
			return $this->response->setStatusCode( 400 )
			->setJSON( [
					'message' => 'Orçamento para essa unidade não encontrado.',
					'errors' => ''
			] );
		}
		
		$service_response = $service->registerRequisicaoFromOrcamento($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' => 'O Orçamento foi cadastrado com sucesso.'
				],
				ServiceResponseInterface::HAVE_CONFLICTS => [
						'code' => ResponseInterface::HTTP_BAD_REQUEST,
						'message' => 'Não foi possível cadastrar o orçamento, pois foram detectados conflitos com horários já cadastrados.'
				],
				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_INTERNAL_SERVER_ERROR,
						'message' => 'Erro interno do servidor.'
				]
		];
		
		return $this->getResponse( $service_response, $response_messages );
	}
	
}

