<?php

namespace App\Mappers;

use App\DAO\PacienteDAO;
use App\DAO\PetDAO;
use App\Entities\CEP\CEP;
use App\Entities\Cliente\Cliente;
use App\Entities\ConfirmacaoEmail\ConfirmacaoEmail;
use App\Entities\Endereco\Endereco;
use App\Entities\Paciente\Paciente;
use App\Entities\Pessoa\Pessoa;
use App\Entities\PessoaFisica\PessoaFisica;
use App\Entities\Usuario\Usuario;
use App\Entities\UsuarioPerfil\UsuarioPerfil;
use App\Services\JWTService;
use App\Utils\Collections\GeneralCollection;
use App\Utils\DateUtils;
use App\ViewModels\Paciente\PacienteDetailsViewModel\PacienteDetailsViewModel;
use App\ViewModels\Paciente\PacienteUpdateViewModel\PacienteUpdateViewModel;
use App\ViewModels\Paciente\PacienteRegistrationViewModel\PacienteRegistrationViewModel;
use App\Utils\EmailUtils;
use Exception;

class PacienteMapper {

	public static function PacienteRegistrationViewModelMapper(array $paciente): PacienteRegistrationViewModel {

		$cpf = trim( $paciente ['cpf'] );
		$genero = trim( $paciente ['genero'] );
		$dt = $paciente ['data_nascimento'];
		$email = "";
		$texto_email = trim( $paciente ['email'] );

		if (strlen( $texto_email ) == 0) {
			$email = EmailUtils::getEmailAddressAutoGenerate();
		} else {
			$email = $texto_email;
		}
		if (strlen( trim( $paciente ['cpf'] ) ) == 0) {
			$cpf = null;
		}

		if ((strlen( trim( $paciente ['genero'] ) ) == 0) || (trim( $paciente ['genero'] ) == '0')) {
			$genero = 'O';
		}

		if (strlen( trim( $paciente ['data_nascimento'] ) ) == 0) {
			$dt = '1900-01-01';
		}

		$jwt_payload = JWTService::getTokenJWTPayload();
		$uid = $jwt_payload ? $jwt_payload->getUid() : null;
		$paciente_registration_vm = PacienteRegistrationViewModel::builder()->setFoto( $paciente ['foto'] ?? '')
			->setNome( ucwords( $paciente ['nome'] ) )
			->setObservacao( $paciente ['observacao'] ?? null)
			->setEmail( $email )
			->setRg( $paciente ['rg'] )
			->setGenero( $genero )
			->setDataNascimento( $dt )
			->setProfissao( $paciente ['profissao'] ?? '')
			->setEstadoCivil( $paciente ['estado_civil'] ?? '')
			->setCep( $paciente ['cep'] )
			->setNumero( $paciente ['numero'] )
			->setComplemento( $paciente ['complemento'] ?? '')
			->setReferencias( $paciente ['referencias'] ?? '')
			->setCpf( $cpf )
			->setTelefone1( $paciente ['telefone_1'] )
			->setTelefone2( $paciente ['telefone_2'] ?? '')
			->setTelefone3( $paciente ['telefone_3'] ?? '')
			->setIndicadoPor( $paciente ['indicado_por'] ?? '')
			->setAdicionadoPor( $uid )
			->setSenha( $paciente ['senha'] )
			->setAtivo( $paciente ['ativo'] ?? 1)
			->setConvenio( $paciente ['convenio'] ?? '')
			->setTokenConfirmacaoEmail( $paciente ['token_confirmacao_email'] )
			->setCidade( $paciente ['cidade'] )
			->setEstado( $paciente ['estado'] )
			->setBairro( $paciente ['bairro'] )
			->setLogradouro( $paciente ['logradouro'] )
			->setPeso( $paciente ['peso'] ?? 1)
			->setAltura( $paciente ['altura'] ?? 1)
			->build();

		return $paciente_registration_vm;

	}

	public static function getEnderecoFromPacienteRegistrationVM(PacienteRegistrationViewModel $paciente_registration_vm, CEP $cep): Endereco {

		/*
		 * $endereco = Endereco::builder()->setCep( $cep->getId() )
		 * ->setNumero( $paciente_registration_vm->getNumero() )
		 * ->setComplemento( $paciente_registration_vm->getComplemento() )
		 * ->setReferencias( $paciente_registration_vm->getReferencias() )
		 * ->build();
		 */
		$endereco = new Endereco();
		$endereco->setCep( $cep->getId() ?? "");
		$endereco->setNumero( $paciente_registration_vm->getNumero() );
		$endereco->setComplemento( $paciente_registration_vm->getComplemento() ?? "");
		$endereco->setReferencias( $paciente_registration_vm->getReferencias() ?? "");
		return $endereco;

	}

	public static function getCepFromPacienteRegistrationVM(PacienteRegistrationViewModel $paciente_registration_vm): CEP {

		$cep = CEP::builder()->setCep( $paciente_registration_vm->getCep() )
			->setCidade( $paciente_registration_vm->getCidade() )
			->setBairro( $paciente_registration_vm->getBairro() )
			->setEstado( $paciente_registration_vm->getEstado() )
			->setLogradouro( $paciente_registration_vm->getLogradouro() )
			->build();
		// $cep = new CEP();
		// $cep->setCep( $paciente_registration_vm->getCep() );
		// $cep->setCidade( $paciente_registration_vm->getCidade() );
		// $cep->setBairro( $paciente_registration_vm->getBairro() );
		// $cep->setEstado( $paciente_registration_vm->getEstado() );
		// $cep->setLogradouro( $paciente_registration_vm->getLogradouro() );

		return $cep;

	}

	public static function getPessoaFromPacienteRegistrationVM(PacienteRegistrationViewModel $paciente_registration_vm, Endereco $endereco): Pessoa {

		// $pessoa = Pessoa::builder()->setTelefone1( $paciente_registration_vm->getTelefone1() )->setTelefone2( $paciente_registration_vm->getTelefone2()
		// )->setObservacao( $paciente_registration_vm->getObservacao() )->setIdENDERECO( $endereco->getId() )->setIdTIPOPESSOA( PESSOA_FISICA_ID
		// )->setAdicionadoPor( $paciente_registration_vm->getAdicionadoPor() )->build();
		$pessoa = new Pessoa();
		$pessoa->setTelefone1( $paciente_registration_vm->getTelefone1() );
		$pessoa->setTelefone2( $paciente_registration_vm->getTelefone2() );
		$pessoa->setTelefone3( $paciente_registration_vm->getTelefone3() );
		$pessoa->setObservacao( $paciente_registration_vm->getObservacao() );
		$pessoa->setIdEndereco( $endereco->getId() );
		$pessoa->setIdTipoPessoa( PESSOA_FISICA_ID );
		$pessoa->setAdicionadoPor( $paciente_registration_vm->getAdicionadoPor() );

		return $pessoa;

	}

	public static function getPessoaFisicaFromPacienteRegistrationVM(PacienteRegistrationViewModel $paciente_registration_vm, Pessoa $pessoa): PessoaFisica {

		// $pessoa_fisica = PessoaFisica::builder()->setIdPESSOA( $pessoa->getId() )->setCpf( $paciente_registration_vm->getCpf() )->setRg(
		// $paciente_registration_vm->getRg() )->setGenero( $paciente_registration_vm->getGenero() )->setDataNascimento(
		// $paciente_registration_vm->getDataNascimento() )->setNome( $paciente_registration_vm->getNome() )->setProfissao(
		// $paciente_registration_vm->getProfissao() )->setEstadoCivil( $paciente_registration_vm->getEstadoCivil() )->build();
		$pessoa_fisica = new PessoaFisica();
		$pessoa_fisica->setIdPessoa( $pessoa->getId() );
		$pessoa_fisica->setCpf( $paciente_registration_vm->getCpf() );
		$pessoa_fisica->setRg( $paciente_registration_vm->getRg() );
		$pessoa_fisica->setGenero( $paciente_registration_vm->getGenero() );
		$pessoa_fisica->setDataNascimento( $paciente_registration_vm->getDataNascimento() );
		$pessoa_fisica->setNome( $paciente_registration_vm->getNome() );
		$pessoa_fisica->setProfissao( $paciente_registration_vm->getProfissao() );
		$pessoa_fisica->setEstadoCivil( $paciente_registration_vm->getEstadoCivil() );

		return $pessoa_fisica;

	}

	public static function getUsuarioFromPacienteRegistrationVM(PacienteRegistrationViewModel $paciente_registration_vm, Pessoa $pessoa): Usuario {

		// $usuario = Usuario::builder()->setEmail( $paciente_registration_vm->getEmail() )->setSenha( $paciente_registration_vm->getSenha() )->setAtivo(
		// $paciente_registration_vm->getAtivo() )->setFoto( $paciente_registration_vm->getFoto() )->setEmailVerificadoEm(
		// $paciente_registration_vm->getTokenConfirmacaoEmail() ? null : DateUtils::now() )->setIdPESSOA( $pessoa->getId() )->setAdicionadoPor(
		// $paciente_registration_vm->getAdicionadoPor() )->build();
		$usuario = new Usuario();
		$usuario->setEmail( $paciente_registration_vm->getEmail() );
		$usuario->setSenha( $paciente_registration_vm->getSenha() );
		$usuario->setAtivo( $paciente_registration_vm->getAtivo() );
		$usuario->setFoto( $paciente_registration_vm->getFoto() );
		$usuario->setEmailVerificadoEm( $paciente_registration_vm->getTokenConfirmacaoEmail() ? null : DateUtils::now() );
		$usuario->setIdPessoa( $pessoa->getId() );
		$usuario->setAdicionadoPor( $paciente_registration_vm->getAdicionadoPor() );

		return $usuario;

	}

	public static function getPacienteFromPacienteRegistrationVM(PacienteRegistrationViewModel $paciente_registration_vm, Pessoa $pessoa): Paciente {

		// $paciente = Paciente::builder()->setAdicionadoPor( $paciente_registration_vm->getAdicionadoPor() )->setIdPESSOA( $pessoa->getId() )->setConvenio(
		// $paciente_registration_vm->getConvenio() )->setIndicadoPor( $paciente_registration_vm->getIndicadoPor() )->build();
		$paciente = new Paciente();
		$paciente->setAdicionadoPor( $paciente_registration_vm->getAdicionadoPor() );
		$paciente->setIdPessoa( $pessoa->getId() );
		$paciente->setConvenio( $paciente_registration_vm->getConvenio() );
		$paciente->setIndicadoPor( $paciente_registration_vm->getIndicadoPor() );

		return $paciente;

	}

	public static function getClienteFromPacienteRegistrationVM(PacienteRegistrationViewModel $paciente_registration_vm, Pessoa $pessoa): Cliente {

		// $cliente = Cliente::builder()->setAdicionadoPor( $paciente_registration_vm->getAdicionadoPor() )->setIdPESSOA( $pessoa->getId() )->build();
		$cliente = new Cliente();
		$cliente->setAdicionadoPor( $paciente_registration_vm->getAdicionadoPor() );
		$cliente->setIdPessoa( $pessoa->getId() );

		return $cliente;

	}

	public static function getConfirmacaoEmailFromPacienteRegistrationVM(PacienteRegistrationViewModel $paciente_registration_vm, Usuario $usuario): ConfirmacaoEmail {

		// $confirmacao_email = ConfirmacaoEmail::builder()->setIdUSUARIO( $usuario->getId() )->setToken( $paciente_registration_vm->getTokenConfirmacaoEmail()
		// )->setTempoExpiracao( EMAIL_TOKEN_EXPIRATION_TIME )->build();
		$confirmacao_email = new ConfirmacaoEmail();
		$confirmacao_email->setIdUsuario( $usuario->getId() );
		$confirmacao_email->setToken( $paciente_registration_vm->getTokenConfirmacaoEmail() );
		$confirmacao_email->setTempoExpiracao( EMAIL_TOKEN_EXPIRATION_TIME );

		return $confirmacao_email;

	}

	public static function getUsuarioPerfilFromPacienteRegistrationVM(PacienteRegistrationViewModel $paciente_registration_vm, Usuario $usuario): UsuarioPerfil {

		// $usuario_perfil = UsuarioPerfil::builder()->setIdUSUARIO( $usuario->getId() )->setIdPERFIL( PERFIL_PACIENTE )->build();
		$usuario_perfil = new UsuarioPerfil();
		$usuario_perfil->setIdUsuario( $usuario->getId() );
		$usuario_perfil->setIdPerfil( PERFIL_PACIENTE );

		return $usuario_perfil;

	}

	public static function getPacienteDetailsVMListFromArray(array $paciente_list): GeneralCollection {

		$paciente_details_vm_collection = new GeneralCollection();
		for ($i = 0, $number_pacientes = count( $paciente_list ); $i < $number_pacientes; $i++) {
			$paciente_details_vm_collection->push( PacienteMapper::getPacienteListVMFromArray( $paciente_list [$i] ) );
		}
		return $paciente_details_vm_collection;

	}

	public static function getPacienteDetailsVMListFromArrayToUpdate(array $paciente_list): GeneralCollection {

		$paciente_details_vm_collection = new GeneralCollection();
		for ($i = 0, $number_pacientes = count( $paciente_list ); $i < $number_pacientes; $i++) {
			$paciente_details_vm_collection->push( PacienteMapper::getPacienteListVMFromArrayToUpdate( $paciente_list [$i] ) );
		}
		return $paciente_details_vm_collection;

	}

	public static function getPacientesDetailsArrayFromPacienteDetailsVMList(GeneralCollection $paciente_details_vm_collection): array {

		return $paciente_details_vm_collection->toArray();

	}

	public static function getPacienteListVMFromArray(array &$paciente): PacienteDetailsViewModel {

		/*
		 * if ($paciente['foto']) {
		 * $get_file = file_get_contents($paciente['foto']);
		 * $ext = pathinfo($paciente['foto'], PATHINFO_EXTENSION);
		 * $filebase64 = base64_encode($get_file);
		 * } else {
		 * $get_file = file_get_contents("../writable/perfil/default.png");
		 * $ext = "png";
		 * $filebase64 = base64_encode($get_file);
		 * }
		 */
		try {
			$get_file = file_get_contents( $paciente ['foto'] );
			$ext = pathinfo( $paciente ['foto'], PATHINFO_EXTENSION );
			$filebase64 = base64_encode( $get_file );
		} catch ( Exception $e ) {
			$get_file = file_get_contents( "../writable/perfil/default.png" );
			$ext = "png";
			$filebase64 = base64_encode( $get_file );
		}

		$pets = new PacienteDAO();
		$response_array = $pets->getPetsPaciente( $paciente ['id'] );

		$paciente_details_vm = new PacienteDetailsViewModel();
		$paciente_details_vm->setId( $paciente ['id'] );
		$paciente_details_vm->setCpf( $paciente ['cpf'] ?? '' );
		$paciente_details_vm->setIdCliente( $paciente ['id_cliente'] ?? 0);
		$paciente_details_vm->setRg( $paciente ['rg'] );
		$paciente_details_vm->setNome( $paciente ['nome'] );
		$paciente_details_vm->setGenero( $paciente ['genero'] );
		$paciente_details_vm->setDataNascimento( $paciente ['data_nascimento'] );
		$paciente_details_vm->setTelefone1( $paciente ['telefone_1'] );
		$paciente_details_vm->setTelefone2( $paciente ['telefone_2'] );
		$paciente_details_vm->setObservacao( $paciente ['observacao'] );
		$paciente_details_vm->setCep( $paciente ['cep'] );
		$paciente_details_vm->setNumero( $paciente ['numero'] );
		$paciente_details_vm->setComplemento( $paciente ['complemento'] );
		$paciente_details_vm->setReferencias( $paciente ['referencias'] );
		$paciente_details_vm->setEstado( $paciente ['estado'] );
		$paciente_details_vm->setCidade( $paciente ['cidade'] );
		$paciente_details_vm->setBairro( $paciente ['bairro'] );
		$paciente_details_vm->setLogradouro( $paciente ['logradouro'] );
		$paciente_details_vm->setEmail( $paciente ['email'] );
		$paciente_details_vm->setFoto( $filebase64 );
		$paciente_details_vm->setTipo( $ext );
		$paciente_details_vm->setIndicadoPor( $paciente ['indicado_por'] );
		$paciente_details_vm->setProfissao( $paciente ['profissao'] );
		$paciente_details_vm->setEstadoCivil( $paciente ['estado_civil'] );
		$paciente_details_vm->setConvenio( $paciente ['convenio'] );
		$paciente_details_vm->setPeso( $paciente ['peso'] );
		$paciente_details_vm->setAltura( $paciente ['altura'] );
		$paciente_details_vm->setPets( $response_array );
		return $paciente_details_vm;

	}

	public static function getPacienteListVMFromArrayToUpdate(array &$paciente): PacienteDetailsViewModel {

		// $paciente_details_vm = PacienteDetailsViewModel::builder()->setId( $paciente ['id'] )->setCpf( $paciente ['cpf'] )->setIdCliente( $paciente
		// ['id_cliente'] )->setRg( $paciente ['rg'] )->setNome( $paciente ['nome'] )->setGenero( $paciente ['genero'] )->setDataNascimento( $paciente
		// ['data_nascimento'] )->setTelefone1( $paciente ['telefone_1'] )->setTelefone2( $paciente ['telefone_2'] )->setObservacao( $paciente ['observacao']
		// )->setCep( $paciente ['cep'] )->setNumero( $paciente ['numero'] )->setComplemento( $paciente ['complemento'] )->setReferencias( $paciente
		// ['referencias'] )->setEstado( $paciente ['estado'] )->setCidade( $paciente ['cidade'] )->setBairro( $paciente ['bairro'] )->setLogradouro( $paciente
		// ['logradouro'] )->setEmail( $paciente ['email'] )->setFoto( $paciente ['foto'] )->setIndicadoPor( $paciente ['indicado_por'] )->setProfissao(
		// $paciente ['profissao'] )->setEstadoCivil( $paciente ['estado_civil'] )->setConvenio( $paciente ['convenio'] )->build();
		$paciente_details_vm = new PacienteDetailsViewModel();
		$paciente_details_vm->setId( $paciente ['id'] );
		$paciente_details_vm->setCpf( $paciente ['cpf'] );
		$paciente_details_vm->setIdCliente( $paciente ['id_cliente'] );
		$paciente_details_vm->setRg( $paciente ['rg'] );
		$paciente_details_vm->setNome( $paciente ['nome'] );
		$paciente_details_vm->setGenero( $paciente ['genero'] );
		$paciente_details_vm->setDataNascimento( $paciente ['data_nascimento'] );
		$paciente_details_vm->setTelefone1( $paciente ['telefone_1'] );
		$paciente_details_vm->setTelefone2( $paciente ['telefone_2'] );
		$paciente_details_vm->setObservacao( $paciente ['observacao'] );
		$paciente_details_vm->setCep( $paciente ['cep'] );
		$paciente_details_vm->setNumero( $paciente ['numero'] );
		$paciente_details_vm->setComplemento( $paciente ['complemento'] );
		$paciente_details_vm->setReferencias( $paciente ['referencias'] );
		$paciente_details_vm->setEstado( $paciente ['estado'] );
		$paciente_details_vm->setCidade( $paciente ['cidade'] );
		$paciente_details_vm->setBairro( $paciente ['bairro'] );
		$paciente_details_vm->setLogradouro( $paciente ['logradouro'] );
		$paciente_details_vm->setEmail( $paciente ['email'] );
		$paciente_details_vm->setFoto( $paciente ['foto'] );
		$paciente_details_vm->setIndicadoPor( $paciente ['indicado_por'] );
		$paciente_details_vm->setProfissao( $paciente ['profissao'] );
		$paciente_details_vm->setEstadoCivil( $paciente ['estado_civil'] );
		$paciente_details_vm->setConvenio( $paciente ['convenio'] );

		return $paciente_details_vm;

	}

	public static function getPacienteDetailsVMFromArray(array &$paciente): PacienteDetailsViewModel {

		if (file_exists( $paciente ['foto'] ) === true) {
			$get_file = file_get_contents( $paciente ['foto'] );
			$ext = pathinfo( $paciente ['foto'], PATHINFO_EXTENSION );
			$filebase64 = base64_encode( $get_file );
		} else {
			$get_file = "";
			$ext = "";
			$filebase64 = "";
		}

		// $paciente_details_vm = PacienteDetailsViewModel::builder()->setId( $paciente ['id'] )->setCpf( $paciente ['cpf'] )->setIdCliente( $paciente
		// ['id_cliente'] )->setRg( $paciente ['rg'] )->setNome( $paciente ['nome'] )->setGenero( $paciente ['genero'] )->setDataNascimento( $paciente
		// ['data_nascimento'] )->setTelefone1( $paciente ['telefone_1'] )->setTelefone2( $paciente ['telefone_2'] )->setObservacao( $paciente ['observacao']
		// )->setCep( $paciente ['cep'] )->setNumero( $paciente ['numero'] )->setComplemento( $paciente ['complemento'] )->setReferencias( $paciente
		// ['referencias'] )->setEstado( $paciente ['estado'] )->setCidade( $paciente ['cidade'] )->setBairro( $paciente ['bairro'] )->setLogradouro( $paciente
		// ['logradouro'] )->setEmail( $paciente ['email'] )->setFoto( $filebase64 )->setTipo( $ext )->setIndicadoPor( $paciente ['indicado_por']
		// )->setProfissao( $paciente ['profissao'] )->setEstadoCivil( $paciente ['estado_civil'] )->setConvenio( $paciente ['convenio'] )->setPeso( $paciente
		// ['peso'] )->setAltura( $paciente ['altura'] )->build();

		$paciente_details_vm = new PacienteDetailsViewModel();
		$paciente_details_vm->setId( $paciente ['id'] );
		$paciente_details_vm->setCpf( $paciente ['cpf'] );
		$paciente_details_vm->setIdCliente( $paciente ['id_cliente'] );
		$paciente_details_vm->setRg( $paciente ['rg'] );
		$paciente_details_vm->setNome( $paciente ['nome'] );
		$paciente_details_vm->setGenero( $paciente ['genero'] );
		$paciente_details_vm->setDataNascimento( $paciente ['data_nascimento'] );
		$paciente_details_vm->setTelefone1( $paciente ['telefone_1'] );
		$paciente_details_vm->setTelefone2( $paciente ['telefone_2'] );
		$paciente_details_vm->setTelefone3( $paciente ['telefone_3'] ?? '');
		$paciente_details_vm->setObservacao( $paciente ['observacao'] );
		$paciente_details_vm->setCep( $paciente ['cep'] );
		$paciente_details_vm->setNumero( $paciente ['numero'] );
		$paciente_details_vm->setComplemento( $paciente ['complemento'] );
		$paciente_details_vm->setReferencias( $paciente ['referencias'] );
		$paciente_details_vm->setEstado( $paciente ['estado'] );
		$paciente_details_vm->setCidade( $paciente ['cidade'] );
		$paciente_details_vm->setBairro( $paciente ['bairro'] );
		$paciente_details_vm->setLogradouro( $paciente ['logradouro'] );
		$paciente_details_vm->setEmail( $paciente ['email'] );
		$paciente_details_vm->setFoto( $filebase64 );
		$paciente_details_vm->setTipo( $ext );
		$paciente_details_vm->setIndicadoPor( $paciente ['indicado_por'] );
		$paciente_details_vm->setProfissao( $paciente ['profissao'] );
		$paciente_details_vm->setEstadoCivil( $paciente ['estado_civil'] );
		$paciente_details_vm->setConvenio( $paciente ['convenio'] );
		$paciente_details_vm->setPeso( $paciente ['peso'] );
		$paciente_details_vm->setAltura( $paciente ['altura'] );

		return $paciente_details_vm;

	}

	public static function getPacienteUpdateVMFromArray(array $paciente_data): PacienteUpdateViewModel {

		$paciente_update_vm = new PacienteUpdateViewModel();
		if (isset( $paciente_data ['cpf'] )) {
			$paciente_update_vm->setCpf( $paciente_data ['cpf'] );
		}
		if (isset( $paciente_data ['rg'] )) {
			$paciente_update_vm->setRg( $paciente_data ['rg'] );
		}
		if (isset( $paciente_data ['nome'] )) {
			$paciente_update_vm->setNome( ucwords( $paciente_data ['nome'] ) );
		}
		if (isset( $paciente_data ['genero'] )) {
			$paciente_update_vm->setGenero( $paciente_data ['genero'] );
		}
		if (isset( $paciente_data ['profissao'] )) {
			$paciente_update_vm->setProfissao( $paciente_data ['profissao'] );
		}
		if (isset( $paciente_data ['data_nascimento'] )) {
			$paciente_update_vm->setDataNascimento( $paciente_data ['data_nascimento'] );
		}
		if (isset( $paciente_data ['telefone_1'] )) {
			$paciente_update_vm->setTelefone1( $paciente_data ['telefone_1'] );
		}
		if (isset( $paciente_data ['telefone_2'] )) {
			$paciente_update_vm->setTelefone2( $paciente_data ['telefone_2'] );
		}
		if (isset( $paciente_data ['telefone_3'] )) {
			$paciente_update_vm->setTelefone3( $paciente_data ['telefone_3'] );
		}

		if (isset( $paciente_data ['cep'] )) {
			$paciente_update_vm->setCep( $paciente_data ['cep'] );
		}
		if (isset( $paciente_data ['logradouro'] )) {
			$paciente_update_vm->setCep( $paciente_data ['cep'] );
		}
		if (isset( $paciente_data ['estado'] )) {
			$paciente_update_vm->setCep( $paciente_data ['cep'] );
		}
		if (isset( $paciente_data ['cidade'] )) {
			$paciente_update_vm->setCep( $paciente_data ['cep'] );
		}
		if (isset( $paciente_data ['bairro'] )) {
			$paciente_update_vm->setCep( $paciente_data ['cep'] );
		}

		if (isset( $paciente_data ['numero'] )) {
			$paciente_update_vm->setNumero( $paciente_data ['numero'] );
		}
		if (isset( $paciente_data ['complemento'] )) {
			$paciente_update_vm->setComplemento( $paciente_data ['complemento'] );
		}
		if (isset( $paciente_data ['referencias'] )) {
			$paciente_update_vm->setReferencias( $paciente_data ['referencias'] );
		}

		if (isset( $_FILES ['foto'] )) {
			$ext = "." . pathinfo( $_FILES ['foto'] ['name'], PATHINFO_EXTENSION );
			// $ext = strtolower(substr($_FILES['foto']['name'], -4)); //Pegando extensão do arquivo
			$new_name = date( "Y.m.d-H.i.s" ) . $ext; // Definindo um novo nome para o arquivo
			$dir = '../writable/perfil/';
			move_uploaded_file( $_FILES ['foto'] ['tmp_name'], $dir . $new_name ); // Fazer upload do arquivo
			$paciente_data ['foto'] = $dir . $new_name;

			$paciente_update_vm->setFoto( $paciente_data ['foto'] );
		}

		if (isset( $paciente_data ['foto'] )) {
			$paciente_update_vm->setFoto( $paciente_data ['foto'] );
		}
		if (isset( $paciente_data ['indicado_por'] )) {
			$paciente_update_vm->setIndicadoPor( $paciente_data ['indicado_por'] );
		}
		if (isset( $paciente_data ['convenio'] )) {
			$paciente_update_vm->setConvenio( $paciente_data ['convenio'] );
		}
		if (isset( $paciente_data ['altura'] )) {
			$paciente_update_vm->setAltura( $paciente_data ['altura'] );
		}
		if (isset( $paciente_data ['peso'] )) {
			$paciente_update_vm->setPeso( $paciente_data ['peso'] );
		}
		if (isset( $paciente_data ['observacao'] )) {
			$paciente_update_vm->setObservacao( $paciente_data ['observacao'] );
		}

		if (isset( $paciente_data ['logradouro'] )) {
			$paciente_update_vm->setLogradouro( $paciente_data ['logradouro'] );
		}
		if (isset( $paciente_data ['cidade'] )) {
			$paciente_update_vm->setCidade( $paciente_data ['cidade'] );
		}
		if (isset( $paciente_data ['estado'] )) {
			$paciente_update_vm->setEstado( $paciente_data ['estado'] );
		}
		if (isset( $paciente_data ['bairro'] )) {
			$paciente_update_vm->setBairro( $paciente_data ['bairro'] );
		}
		$paciente_update_vm->setAlteradoPor( JWTService::getTokenJWTPayload()->getUid() );
		return $paciente_update_vm;

	}

	public static function getEnderecoFromPacienteUpdateVM(PacienteUpdateViewModel $paciente_update_vm): Endereco {

		$endereco = new Endereco();
		if ($paciente_update_vm->getNumero()) {
			$endereco->setNumero( $paciente_update_vm->getNumero() );
		}
		if ($paciente_update_vm->getComplemento()) {
			$endereco->setComplemento( $paciente_update_vm->getComplemento() );
		}
		if ($paciente_update_vm->getReferencias()) {
			$endereco->setReferencias( $paciente_update_vm->getReferencias() );
		}
		return $endereco;

	}

	public static function getCepFromPacienteUpdateVM(PacienteUpdateViewModel $paciente_update_vm): CEP {

		$endereco = new CEP();
		if ($paciente_update_vm->getCep()) {
			$endereco->setCep( $paciente_update_vm->getCep() );
		}
		if ($paciente_update_vm->getLogradouro()) {
			$endereco->setLogradouro( $paciente_update_vm->getLogradouro() );
		}
		if ($paciente_update_vm->getCidade()) {
			$endereco->setCidade( $paciente_update_vm->getCidade() );
		}
		if ($paciente_update_vm->getBairro()) {
			$endereco->setBairro( $paciente_update_vm->getBairro() );
		}
		if ($paciente_update_vm->getEstado()) {
			$endereco->setEstado( $paciente_update_vm->getEstado() );
		}
		return $endereco;

	}

	public static function getPessoaFromPacienteUpdateVM(PacienteUpdateViewModel $paciente_update_vm): Pessoa {

		$pessoa = new Pessoa();
		if ($paciente_update_vm->getTelefone1()) {
			$pessoa->setTelefone1( $paciente_update_vm->getTelefone1() );
		}
		if ($paciente_update_vm->getTelefone2()) {
			$pessoa->setTelefone2( $paciente_update_vm->getTelefone2() );
		}
		if ($paciente_update_vm->getTelefone3()) {
			$pessoa->setTelefone3( $paciente_update_vm->getTelefone3() );
		}
		if ($paciente_update_vm->getObservacao()) {
			$pessoa->setObservacao( $paciente_update_vm->getObservacao() );
		}
		if ($paciente_update_vm->getAlteradoPor()) {
			$pessoa->setAlteradoPor( $paciente_update_vm->getAlteradoPor() );
		}
		return $pessoa;

	}

	public static function getPessoaFisicaFromPacienteUpdateVM(PacienteUpdateViewModel $paciente_update_vm): PessoaFisica {

		$pessoa_fisica = new PessoaFisica();
		if ($paciente_update_vm->getCpf()) {
			$pessoa_fisica->setCpf( $paciente_update_vm->getCpf() );
		}
		if ($paciente_update_vm->getRg()) {
			$pessoa_fisica->setRg( $paciente_update_vm->getRg() );
		}
		if ($paciente_update_vm->getGenero()) {
			$pessoa_fisica->setGenero( $paciente_update_vm->getGenero() );
		}
		if ($paciente_update_vm->getDataNascimento()) {
			$pessoa_fisica->setDataNascimento( $paciente_update_vm->getDataNascimento() );
		}
		if ($paciente_update_vm->getNome()) {
			$pessoa_fisica->setNome( $paciente_update_vm->getNome() );
		}
		if ($paciente_update_vm->getProfissao()) {
			$pessoa_fisica->setProfissao( $paciente_update_vm->getProfissao() );
		}
		if ($paciente_update_vm->getEstadoCivil()) {
			$pessoa_fisica->setEstadoCivil( $paciente_update_vm->getEstadoCivil() );
		}
		return $pessoa_fisica;

	}

	public static function getUsuarioFromPacienteUpdateVM(PacienteUpdateViewModel $paciente_update_vm): Usuario {

		$usuario = new Usuario();
		if ($paciente_update_vm->getFoto() && $_FILES ['foto'] ['size'] != 0) {
			$usuario->setFoto( $paciente_update_vm->getFoto() );
		}
		if ($paciente_update_vm->getAlteradoPor()) {
			$usuario->setAlteradoPor( $paciente_update_vm->getAlteradoPor() );
		}
		return $usuario;

	}

	public static function getPacienteFromPacienteUpdateVM(PacienteUpdateViewModel $paciente_update_vm): Paciente {

		$paciente = new Paciente();

		if ($paciente_update_vm->getPeso()) {
			$paciente->setPeso( $paciente_update_vm->getPeso() );
		}
		if ($paciente_update_vm->getAltura()) {
			$paciente->setAltura( $paciente_update_vm->getAltura() );
		}
		if ($paciente_update_vm->getAlteradoPor()) {
			$paciente->setAlteradoPor( $paciente_update_vm->getAlteradoPor() );
		}
		if ($paciente_update_vm->getConvenio()) {
			$paciente->setConvenio( $paciente_update_vm->getConvenio() );
		}
		if ($paciente_update_vm->getIndicadoPor()) {
			$paciente->setIndicadoPor( $paciente_update_vm->getIndicadoPor() );
		}
		return $paciente;

	}

	# -------------------------------------------------------------------------------------------------------------- #
	public static function getPacienteUpdateObservacaoVMFromArray(array $paciente_data): PacienteUpdateViewModel {

		$paciente_update_vm = new PacienteUpdateViewModel();
		if (isset( $paciente_data ['observacao'] )) {
			$paciente_update_vm->setObservacao( $paciente_data ['observacao'] );
		}
		return $paciente_update_vm;

	}

}
