<?php


namespace App\Mappers;

use App\Entities\Endereco\Endereco;
use App\Entities\Pessoa\Pessoa;
use App\Entities\PessoaFisica\PessoaFisica;
use App\Entities\Usuario\Usuario;
use App\Utils\Collections\GeneralCollection;
use App\ViewModels\Usuario\UsuarioDetailsViewModel\UsuarioDetailsViewModel;
use App\ViewModels\Usuario\UsuarioUpdateViewModel\UsuarioUpdateViewModel;

class UsuarioMapper {

	public static function getUsuarioFromArray(array $data): Usuario {

		$usuario = Usuario::builder()->setId( $data ['id'] )
			->setEmail( $data ['email'] )
			->setSenha( $data ['senha'] )
			->setAtivo( $data ['ativo'] )
			->setFoto( $data ['foto'] )
			->setTipo( $data ['tipo'] )
			->setEmailVerificadoEm( $data ['email_verificado_em'] )
			->setCriadoEm( $data ['criado_em'] )
			->setAlteradoEm( $data ['alterado_em'] )
			->setIdPessoa( $data ['id_pessoa'] )
			->setAdicionadoPor( $data ['adicionado_por'] )
			->setAlteradoPor( $data ['alterado_por'] )
			->build();
		return $usuario;

	}

	public static function getUsuarioUpdateVMFromArray(array $data): UsuarioUpdateViewModel {

		$usuarioUpdateVM = new UsuarioUpdateViewModel();
		if (file_exists( $_FILES ['foto'] ['tmp_name'] ) === true) {
			$filecontents = file_get_contents( $_FILES ['foto'] ['tmp_name'] );
			$ext = pathinfo( $_FILES ['foto'] ['name'], PATHINFO_EXTENSION );
		} else {
			$filecontents = file_get_contents( "../writable/perfil/default.png" );
			$ext = "png";
		}

		$usuarioUpdateVM->setfoto( $filecontents );

		if (isset( $data ['nome'] )) {
			$usuarioUpdateVM->setnome( $data ['nome'] );
		}
		if (isset( $data ['telefone_1'] )) {
			$usuarioUpdateVM->settelefone1( $data ['telefone_1'] );
		}
		if (isset( $data ['telefone_2'] )) {
			$usuarioUpdateVM->settelefone2( $data ['telefone_2'] );
		}
		if (isset( $data ['cpf'] )) {
			$usuarioUpdateVM->setcpf( $data ['cpf'] );
		}
		if (isset( $data ['rg'] )) {
			$usuarioUpdateVM->setrg( $data ['rg'] );
		}
		if (isset( $data ['data_nascimento'] )) {
			$usuarioUpdateVM->setdatanascimento( $data ['data_nascimento'] );
		}
		if (isset( $data ['genero'] )) {
			$usuarioUpdateVM->setgenero( $data ['genero'] );
		}
		if (isset( $data ['cep'] )) {
			$usuarioUpdateVM->setcep( $data ['cep'] );
		}
		if (isset( $data ['numero'] )) {
			$usuarioUpdateVM->setnumero( $data ['numero'] );
		}
		if (isset( $data ['complemento'] )) {
			$usuarioUpdateVM->setcomplemento( $data ['complemento'] );
		}
		if (isset( $data ['referencias'] )) {
			$usuarioUpdateVM->setreferencia( $data ['referencias'] );
		}
		if (isset( $_FILES ['foto'] )) {
			$usuarioUpdateVM->setfoto( $filecontents );
			$usuarioUpdateVM->settipo( $ext );
		}
		return $usuarioUpdateVM;

	}

	public static function getUsuarioUpdateVMFromArrayUpdate(array $data): UsuarioUpdateViewModel {

		$usuarioUpdateVM = new UsuarioUpdateViewModel();

		if (isset( $data ['nome'] )) {
			$usuarioUpdateVM->setnome( $data ['nome'] );
		}
		if (isset( $data ['telefone_1'] )) {
			$usuarioUpdateVM->settelefone1( $data ['telefone_1'] );
		}
		if (isset( $data ['telefone_2'] )) {
			$usuarioUpdateVM->settelefone2( $data ['telefone_2'] );
		}
		if (isset( $data ['cpf'] )) {
			$usuarioUpdateVM->setcpf( $data ['cpf'] );
		}
		if (isset( $data ['rg'] )) {
			$usuarioUpdateVM->setrg( $data ['rg'] );
		}
		if (isset( $data ['data_nascimento'] )) {
			$usuarioUpdateVM->setdatanascimento( $data ['data_nascimento'] );
		}
		if (isset( $data ['genero'] )) {
			$usuarioUpdateVM->setgenero( $data ['genero'] );
		}
		if (isset( $data ['cep'] )) {
			$usuarioUpdateVM->setcep( $data ['cep'] );
		}
		if (isset( $data ['numero'] )) {
			$usuarioUpdateVM->setnumero( $data ['numero'] );
		}
		if (isset( $data ['complemento'] )) {
			$usuarioUpdateVM->setcomplemento( $data ['complemento'] );
		}
		if (isset( $data ['referencias'] )) {
			$usuarioUpdateVM->setreferencia( $data ['referencias'] );
		}
		if (isset( $data ['foto'] )) {
			$usuarioUpdateVM->setfoto( $data ['foto'] );
		}
		return $usuarioUpdateVM;

	}

	public static function getEnderecoFromUsuarioUpdateVM(UsuarioUpdateViewModel $usuario_update_vm): Endereco {

		$endereco = new Endereco();
		if ($usuario_update_vm->getCep()) {
			$endereco->setCep( $usuario_update_vm->getCep() );
		}
		if ($usuario_update_vm->getNumero()) {
			$endereco->setNumero( $usuario_update_vm->getNumero() );
		}
		if ($usuario_update_vm->getComplemento()) {
			$endereco->setComplemento( $usuario_update_vm->getComplemento() );
		}
		if ($usuario_update_vm->getReferencia()) {
			$endereco->setReferencias( $usuario_update_vm->getReferencia() );
		}
		return $endereco;

	}

	public static function getPessoaFromUsuarioUpdateVM(UsuarioUpdateViewModel $usuario_update_vm): Pessoa {

		$pessoa = new Pessoa();
		if ($usuario_update_vm->getTelefone1()) {
			$pessoa->setTelefone1( $usuario_update_vm->getTelefone1() );
		}
		if ($usuario_update_vm->getTelefone2()) {
			$pessoa->setTelefone2( $usuario_update_vm->getTelefone2() );
		}
		return $pessoa;

	}

	public static function getPessoaFisicaFromUsuarioUpdateVM(UsuarioUpdateViewModel $usuario_update_vm): PessoaFisica {

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

	}

	public static function getUsuarioDetailsVMFromArrayRaw(array $row, array $permissoes = [ ]): UsuarioDetailsViewModel {

		return UsuarioDetailsViewModel::builder()->setNome( $row ['nome'] ?? '')
			->setFoto( $row ['foto'] )
			->setBairro( $row ['bairro'] ?? '')
			->setCep( $row ['cep'] ?? '')
			->setCidade( $row ['cidade'] ?? '')
			->setComplemento( $row ['complemento'] ?? '')
			->setCpf( $row ['cpf'] ?? '')
			->setDataNascimento( $row ['data_nascimento'] ?? '')
			->setEstado( $row ['estado'] ?? '')
			->setGenero( $row ['genero'] ?? '')
			->setLogradouro( $row ['logradouro'] ?? '')
			->setNumero( $row ['numero'] ?? '')
			->setReferencias( $row ['referencias'] ?? '')
			->setRg( $row ['rg'] ?? '')
			->setTelefone1( $row ['telefone_1'] ?? '')
			->setTelefone2( $row ['telefone_2'] ?? '')
			->setTipo( $row ['tipo'] ?? '')
			->setPermissoes( $permissoes )
			->build();

	}

	public static function getUsuarioDetailsVMFromArray(array $row, array $permissoes = [ ]): UsuarioDetailsViewModel {

		if (file_exists( $row ['foto'] ) === true) {
			$get_file = file_get_contents( $row ['foto'] );
			$ext = pathinfo( $row ['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 );
		}
		return UsuarioDetailsViewModel::builder()->setNome( $row ['nome'] ?? '')
			->setFoto( $filebase64 )
			->setBairro( $row ['bairro'] ?? '')
			->setCep( $row ['cep'] ?? '')
			->setCidade( $row ['cidade'] ?? '')
			->setComplemento( $row ['complemento'] ?? '')
			->setCpf( $row ['cpf'] ?? '')
			->setDataNascimento( $row ['data_nascimento'] ?? '')
			->setEstado( $row ['estado'] ?? '')
			->setGenero( $row ['genero'] ?? '')
			->setLogradouro( $row ['logradouro'] ?? '')
			->setNumero( $row ['numero'] ?? '')
			->setReferencias( $row ['referencias'] ?? '')
			->setRg( $row ['rg'] ?? '')
			->setTelefone1( $row ['telefone_1'] ?? '')
			->setTelefone2( $row ['telefone_2'] ?? '')
			->setTipo( $ext )
			->setPermissoes( $permissoes )
			->setClienteId( $row ['cliente_id'] ?? 0)
			->setMedicoId( $row ['medico_id'] ?? 0)
			->setAssistenteId( $row ['assistente_id'] ?? 0)
			->setPacienteId( $row ['paciente_id'] ?? 0)
			->build();

	}

}
