<?php


namespace App\Controllers;

use App\Services\JWTService;
use App\Services\ServiceResponse\ServiceResponseInterface;
use App\Services\UsuarioService;
use App\Services\EmailService;
use App\Validations\UsuarioValidation;
use CodeIgniter\HTTP\Response;
use CodeIgniter\HTTP\ResponseInterface;

class UsuarioController extends BaseController {

	public function test(): Response {

		echo "oi, enviei o e-mail";
		$usuario_service_response = (new EmailService())->testMail( 'www.psro@gmail.com' );
		$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_BAD_REQUEST,
				'message' => 'Esse usuário não foi encontrado.'
			],
			ServiceResponseInterface::UNAUTHORIZED => [ 
				'code' => ResponseInterface::HTTP_UNAUTHORIZED,
				'message' => 'Informe a sua senha atual corretamente.'
			],
			ServiceResponseInterface::FORBIDDEN => [ 
				'code' => ResponseInterface::HTTP_FORBIDDEN,
				'message' => 'Operação não permitida para esse usuário.'
			],
			ServiceResponseInterface::SUCESS => [ 
				'code' => ResponseInterface::HTTP_OK,
				'message' => 'A sua senha foi alterada com sucesso.'
			]
		];
		return $this->getResponse( $usuario_service_response, $response_messages );

	}

	public function changePassword(int $id_usuario): Response {

		if (!$this->validate( UsuarioValidation::changePassword() )) {
			return $this->response->setJSON( [ 
				'message' => 'Informe os dados corretamente.',
				'errors' => $this->validation->getErrors()
			] );
		}
		$usuario_service_response = (new UsuarioService())->changePassword( $id_usuario, $_POST ['senha_atual'], $_POST ['nova_senha'] );
		$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_BAD_REQUEST,
				'message' => 'Esse usuário não foi encontrado.'
			],
			ServiceResponseInterface::UNAUTHORIZED => [ 
				'code' => ResponseInterface::HTTP_UNAUTHORIZED,
				'message' => 'Informe a sua senha atual corretamente.'
			],
			ServiceResponseInterface::FORBIDDEN => [ 
				'code' => ResponseInterface::HTTP_FORBIDDEN,
				'message' => 'Operação não permitida para esse usuário.'
			],
			ServiceResponseInterface::SUCESS => [ 
				'code' => ResponseInterface::HTTP_OK,
				'message' => 'A sua senha foi alterada com sucesso.'
			]
		];
		return $this->getResponse( $usuario_service_response, $response_messages );

	}

	public function forgetedPassword(): Response {

		/*
		 * if (!$this->validate(UsuarioValidation::forgetedPassword())) {
		 * return $this->response->setJSON([
		 * 'message' => 'Informe os dados corretamente.',
		 * 'errors' => $this->validation->getErrors()
		 * ]);
		 * }
		 */
		$usuario_service_response = (new UsuarioService())->forgetedPassword( $_POST ['email'] );
		$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_BAD_REQUEST,
				'message' => 'Esse usuário não foi encontrado.'
			],
			ServiceResponseInterface::UNAUTHORIZED => [ 
				'code' => ResponseInterface::HTTP_UNAUTHORIZED,
				'message' => 'Informe a sua senha atual corretamente.'
			],
			ServiceResponseInterface::FORBIDDEN => [ 
				'code' => ResponseInterface::HTTP_FORBIDDEN,
				'message' => 'Operação não permitida para esse usuário.'
			],
			ServiceResponseInterface::SUCESS => [ 
				'code' => ResponseInterface::HTTP_OK,
				'message' => 'A sua senha foi alterada com sucesso.'
			]
		];
		return $this->getResponse( $usuario_service_response, $response_messages );

	}

	public function update(int $id_usuario): Response {

		if (!$this->validate( UsuarioValidation::update() )) {
			return $this->response->setJSON( [ 
				'message' => 'Informe os dados corretamente.',
				'errors' => $this->validation->getErrors()
			] );
		}

		$usuario_antigo = (new UsuarioService())->getUsuarioDataFromUsuarioIDRaw( $id_usuario )
			->getData();
		$usuario_antigo ['id'] = $id_usuario;
		$_POST ["usuario_antigo"] = $usuario_antigo;
		$usuario_service_response = (new UsuarioService())->updateUserData( $id_usuario, $_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_BAD_REQUEST,
				'message' => 'Esse usuário não existe.'
			],
			ServiceResponseInterface::SUCESS => [ 
				'code' => ResponseInterface::HTTP_OK,
				'message' => 'Os dados do usuario foram atualizados com sucesso.'
			],
			ServiceResponseInterface::FORBIDDEN => [ 
				'code' => ResponseInterface::HTTP_FORBIDDEN,
				'message' => 'Esse usuário não tem permissão para realizar essa ação.'
			],
			ServiceResponseInterface::VALIDATION_PARAMS_ERROR => [ 
				'code' => ResponseInterface::HTTP_BAD_REQUEST,
				'message' => 'Informe os dados corretamente.'
			]
		];
		return $this->getResponse( $usuario_service_response, $response_messages );

	}

	public function getUsuarioByUsuarioID(int $id_usuario): Response {

		$usuario_service_response = (new UsuarioService())->getUsuarioDataFromUsuarioID( $id_usuario );
		$response_messages = [ 
			ServiceResponseInterface::SUCESS => [ 
				'code' => ResponseInterface::HTTP_OK,
				'message' => 'Os dados do usuário foram encontrados com sucesso.'
			],
			ServiceResponseInterface::RECORD_NOT_FOUND => [ 
				'code' => ResponseInterface::HTTP_PARTIAL_CONTENT,
				'message' => 'Nenhum registro foi encontrado.'
			],
			ServiceResponseInterface::FORBIDDEN => [ 
				'code' => ResponseInterface::HTTP_FORBIDDEN,
				'message' => 'Esse usuário não ter permissão para realizar essa operação.'
			],
			ServiceResponseInterface::DATABASE_CONNECTION_ERROR => [ 
				'code' => ResponseInterface::HTTP_INTERNAL_SERVER_ERROR,
				'message' => 'Erro interno do servidor.'
			]
		];
		return $this->getResponse( $usuario_service_response, $response_messages );

	}
	
	
	public function getMinhasUnidades():Response {
		$service = new UsuarioService();
		
		$service_response = $service->getMinhasUnidades();
		
		$response_messages = [
				ServiceResponseInterface::SUCESS => [
						'code' => ResponseInterface::HTTP_OK,
						'message' => 'Consulta realizada com sucesso.'
				],
				ServiceResponseInterface::HAVE_CONFLICTS => [
						'code' => ResponseInterface::HTTP_CONFLICT,
						'message' => 'Consulta não realizada. Existem conflitos nos dados informados'
				],
				ServiceResponseInterface::RECORD_NOT_FOUND => [
						'code' => ResponseInterface::HTTP_PARTIAL_CONTENT,
						'message' => 'Nenhum registro foi encontrado.'
				],
				ServiceResponseInterface::INSUFFICIENT_DATA => [
						'code' => ResponseInterface::HTTP_BAD_REQUEST,
						'message' => 'Dados incorretos para consulta.'
				],
				ServiceResponseInterface::DATABASE_CONNECTION_ERROR => [
						'code' => ResponseInterface::HTTP_INTERNAL_SERVER_ERROR,
						'message' => 'Erro interno do servidor.'
				]
		];
		
		return $this->getResponse( $service_response, $response_messages );
	}

}
