<?php

namespace App\Controllers;

use App\Services\ProfissionalService;
use App\Services\ServiceResponse\ServiceResponseInterface;
use CodeIgniter\HTTP\Response;
use CodeIgniter\HTTP\ResponseInterface;
use App\Services\ProfissionalClinicaService;

class ProfissionalController extends BaseController {

	public function register() {

		if (!$this->validate( $this->validation->getRuleGroup( 'register_profissional' ) )) {
			return $this->response->setJSON( [ 
				'message' => 'Informe os dados corretamente.',
				'errors' => $this->validation->getErrors()
			] );
		}
		$register_data = (new ProfissionalService())->registerProfissional( $_POST );
		$response_messages = [ 
			DATABASE_CONNECTION_ERROR => [ 
				'code' => ResponseInterface::HTTP_INTERNAL_SERVER_ERROR,
				'message' => 'Erro de conexão ao banco de dados.'
			],
			VALIDATION_PARAMS_ERROR => [ 
				'code' => ResponseInterface::HTTP_BAD_REQUEST,
				'message' => 'Informe os dados corretamente.'
			],
			SUCESS => [ 
				'code' => ResponseInterface::HTTP_OK,
				'message' => 'O profissional foi cadastrado com sucesso.'
			]
		];
		$array_response = [ ];
		$response = $this->getResponse( $array_response, $register_data, $response_messages );
		return $response;

	}

	public function getProfissionalFromID(int $id_profissional) {

		$service = (new ProfissionalService())->getProfissionalFromID( $id_profissional );
		$response_messages = [ 
			RECORD_NOT_FOUND => [ 
				'code' => ResponseInterface::HTTP_PARTIAL_CONTENT,
				'message' => 'O profissional não foi encontrado.'
			],
			SUCESS => [ 
				'code' => ResponseInterface::HTTP_OK,
				'message' => 'O profissional foi encontrado com sucesso.'
			]
		];
		$array_response = [ ];
		if ($service ['data']) {
			$array_response ['data'] = $service ['data'];
		}
		return $this->getResponse( $array_response, $service, $response_messages );

	}

	public function readAll() {

		$request = $_GET;
		$service = (new ProfissionalService())->getProfissionalAll( $request );
		$response_messages = [ 
			RECORD_NOT_FOUND => [ 
				'code' => ResponseInterface::HTTP_PARTIAL_CONTENT,
				'message' => 'O paciente não foi encontrado.'
			],
			SUCESS => [ 
				'code' => ResponseInterface::HTTP_OK,
				'message' => 'O paciente foi encontrado com sucesso.'
			]
		];
		$array_response = [ 
			'data' => $service ['data']
		];
		return $this->getResponse( $array_response, $service, $response_messages );

	}

	public function getProfissionaisByUnidadeId(int $idUnidade): Response {

		$service = new ProfissionalClinicaService();
		$service_response = $service->getProfissionaisByUnidadeId( $idUnidade );

		$response_messages = [ 
			ServiceResponseInterface::SUCESS => [ 
				'code' => ResponseInterface::HTTP_OK,
				'message' => 'Consulta executada com sucesso.'
			],
			ServiceResponseInterface::FORBIDDEN => [ 
				'code' => ResponseInterface::HTTP_FORBIDDEN,
				'message' => 'Usuário sem permissão para esta operação.'
			],
			ServiceResponseInterface::HAVE_CONFLICTS => [ 
				'code' => ResponseInterface::HTTP_CONFLICT,
				'message' => 'Dados conflitantes.'
			],
			ServiceResponseInterface::FOREIGN_KEY_DONT_EXISTS => [ 
				'code' => ResponseInterface::HTTP_BAD_REQUEST,
				'message' => 'Dados inválidos.'
			],
			ServiceResponseInterface::INSUFFICIENT_DATA => [ 
				'code' => ResponseInterface::HTTP_BAD_REQUEST,
				'message' => 'Dados inválidos.'
			],
			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.'
			],
			ServiceResponseInterface::DATABASE_CONNECTION_ERROR => [ 
				'code' => ResponseInterface::HTTP_FAILED_DEPENDENCY,
				'message' => 'Erro interno de comunicação com Banco de dados.'
			]
		];

		return $this->getResponse( $service_response, $response_messages );

	}

}