<?php

namespace App\ViewModels\Recepcao\RecepcionistaRegistrationViewModel;

use App\Utils\Builder;
use App\Utils\ResponseException;
use Config\CustomRules;
use Exception;

class RecepcionistaRegistrationViewModelBuilder implements Builder {
	protected $foto;
	protected $nome;
	protected $email;
	protected $rg;
	protected $data_nascimento;
	protected $cpf;
	protected $genero;
	protected $telefone_1;
	protected $telefone_2;
	protected $telefone_3;
	protected $numero;
	protected $complemento;
	protected $referencias;
	protected $profissao;
	protected $estado_civil;
	protected $indicado_por;
	protected $adicionado_por;
	protected $senha;
	protected $token_confirmacao_email;
	protected $ativo;
	protected $cep;
	protected $logradouro;
	protected $cidade;
	protected $bairro;
	protected $estado;
	protected $id_perfil;
	protected $unidade;
	protected $senha_chamefacil;

	public function build() {

		$recepcao_registration_view_model = new RecepcionistaRegistrationViewModel();
		$recepcao_registration_view_model->setFoto( $this->foto );
		$recepcao_registration_view_model->setnome( $this->nome );
		$recepcao_registration_view_model->setemail( $this->email );
		$recepcao_registration_view_model->setrg( $this->rg );
		$recepcao_registration_view_model->setdatanascimento( $this->data_nascimento );
		$recepcao_registration_view_model->setcpf( $this->cpf );
		$recepcao_registration_view_model->setgenero( $this->genero );
		$recepcao_registration_view_model->settelefone1( $this->telefone_1 );
		$recepcao_registration_view_model->settelefone2( $this->telefone_2 );
		$recepcao_registration_view_model->settelefone3( $this->telefone_3 );
		$recepcao_registration_view_model->setcep( $this->cep );
		$recepcao_registration_view_model->setnumero( $this->numero );
		$recepcao_registration_view_model->setcomplemento( $this->complemento );
		$recepcao_registration_view_model->setreferencias( $this->referencias );
		$recepcao_registration_view_model->setprofissao( $this->profissao );
		$recepcao_registration_view_model->setestadocivil( $this->estado_civil );
		$recepcao_registration_view_model->setindicadopor( $this->indicado_por );
		$recepcao_registration_view_model->setAdicionadoPor( $this->adicionado_por );
		$recepcao_registration_view_model->setSenha( $this->senha );
		$recepcao_registration_view_model->settokenconfirmacaoemail( $this->token_confirmacao_email );
		$recepcao_registration_view_model->setAtivo( $this->ativo );
		$recepcao_registration_view_model->setLogradouro( $this->logradouro );
		$recepcao_registration_view_model->setCidade( $this->cidade );
		$recepcao_registration_view_model->setEstado( $this->estado );
		$recepcao_registration_view_model->setBairro( $this->bairro );
		$recepcao_registration_view_model->setPerfilId( $this->id_perfil );
		$recepcao_registration_view_model->setUnidades( $this->unidades );
		$recepcao_registration_view_model->setSenhaChameFacil( $this->senha_chamefacil );
		return $recepcao_registration_view_model;

	}

	public function setSenhaChameFacil(string $senha_chamefacil): RecepcionistaRegistrationViewModelBuilder {

		$this->senha_chamefacil = $senha_chamefacil;
		return $this;

	}

	public function setFoto($foto) {

		$this->foto = $foto;
		return $this;

	}

	public function setNome(string $nome): RecepcionistaRegistrationViewModelBuilder {

		if (!preg_match( REGEX_ONLY_LETTERS_SPACES, $nome )) {
			throw new ResponseException( [ 
				'nome' => 'Informe um nome válido.'
			] );
		}
		$this->nome = $nome;
		return $this;

	}

	public function setEmail(string $email): RecepcionistaRegistrationViewModelBuilder {

		if (!preg_match( REGEX_EMAIL, $email )) {
			throw new ResponseException( [ 
				'email' => 'Informe um email válido.'
			] );
		}
		$this->email = $email;
		return $this;

	}

	public function setRg(string $rg): RecepcionistaRegistrationViewModelBuilder {

		$this->rg = $rg;
		return $this;

	}

	public function setDataNascimento(string $data_nascimento): RecepcionistaRegistrationViewModelBuilder {

		if (!preg_match( REGEX_DATE_US_PATTERN, $data_nascimento )) {
			throw new ResponseException( [ 
				'data_nascimeneto' => 'Informe uma data válida.'
			] );
		}
		$this->data_nascimento = $data_nascimento;
		return $this;

	}

	public function setCpf(string $cpf): RecepcionistaRegistrationViewModelBuilder {

		if (!preg_match( REGEX_CPF, $cpf )) {
			throw new ResponseException( [ 
				'cpf' => 'Informe um CPF válido.'
			] );
		}
		$this->cpf = $cpf;
		return $this;

	}

	public function setGenero(string $genero): RecepcionistaRegistrationViewModelBuilder {

		if (!preg_match( REGEX_GENERO, $genero )) {
			throw new ResponseException( [ 
				'genero' => 'Informe um gênero válido.'
			] );
		}
		$this->genero = $genero;
		return $this;

	}

	public function setTelefone1(string $telefone_1): RecepcionistaRegistrationViewModelBuilder {

		if (!preg_match( REGEX_PHONE, $telefone_1 )) {
			throw new ResponseException( [ 
				'telefone_1' => 'Informe um telefone_1 válido.'
			] );
		}
		$this->telefone_1 = $telefone_1;
		return $this;

	}

	public function setTelefone2(string $telefone_2): RecepcionistaRegistrationViewModelBuilder {

		if ($telefone_2 && !preg_match( REGEX_PHONE, $telefone_2 )) {
			throw new ResponseException( [ 
				'telefone_2' => 'Informe um telefone_1 válido.'
			] );
		}
		$this->telefone_2 = $telefone_2;
		return $this;

	}

	public function setTelefone3(string $telefone_3): RecepcionistaRegistrationViewModelBuilder {

		$this->telefone_3 = $telefone_3;
		return $this;

	}

	public function setCep(string $cep): RecepcionistaRegistrationViewModelBuilder {

		if (!preg_match( REGEX_CEP, $cep )) {
			throw new ResponseException( [ 
				'cep' => 'Informe um CEP válido.'
			] );
		}
		$this->cep = $cep;
		return $this;

	}

	public function setNumero(string $numero): RecepcionistaRegistrationViewModelBuilder {

		$this->numero = $numero;
		return $this;

	}

	public function setComplemento(string $complemento): RecepcionistaRegistrationViewModelBuilder {

		$this->complemento = $complemento;
		return $this;

	}

	public function setReferencias(string $referencias): RecepcionistaRegistrationViewModelBuilder {

		$this->referencias = $referencias;
		return $this;

	}

	public function setProfissao(string $profissao): RecepcionistaRegistrationViewModelBuilder {

		$this->profissao = $profissao;
		return $this;

	}

	public function setEstadoCivil(string $estado_civil): RecepcionistaRegistrationViewModelBuilder {

		$this->estado_civil = $estado_civil;
		return $this;

	}

	public function setIndicadoPor(string $indicado_por): RecepcionistaRegistrationViewModelBuilder {

		$this->indicado_por = $indicado_por;
		return $this;

	}

	public function setAdicionadoPor(?int $adicionado_por): RecepcionistaRegistrationViewModelBuilder {

		$this->adicionado_por = $adicionado_por;
		return $this;

	}

	public function setSenha(string $senha): RecepcionistaRegistrationViewModelBuilder {

		$this->senha = $senha;
		return $this;

	}

	public function setTokenConfirmacaoEmail(string $token_confirmacao_email): RecepcionistaRegistrationViewModelBuilder {

		$this->token_confirmacao_email = $token_confirmacao_email;
		return $this;

	}

	public function setAtivo(int $ativo): RecepcionistaRegistrationViewModelBuilder {

		$this->ativo = $ativo;
		return $this;

	}

	/**
	 *
	 * @param mixed $logradouro
	 * @return RecepcionistaRegistrationViewModelBuilder
	 */
	public function setLogradouro($logradouro) {

		$this->logradouro = $logradouro;
		return $this;

	}

	/**
	 *
	 * @param mixed $cidade
	 * @return RecepcionistaRegistrationViewModelBuilder
	 */
	public function setCidade($cidade) {

		$this->cidade = $cidade;
		return $this;

	}

	/**
	 *
	 * @param mixed $bairro
	 * @return RecepcionistaRegistrationViewModelBuilder
	 */
	public function setBairro($bairro) {

		$this->bairro = $bairro;
		return $this;

	}

	/**
	 *
	 * @param mixed $estado
	 * @return RecepcionistaRegistrationViewModelBuilder
	 */
	public function setEstado($estado) {

		$this->estado = $estado;
		return $this;

	}

	public function setPerfilId($id_perfil) {

		$this->id_perfil = $id_perfil;
		return $this;

	}

	public function setUnidades($unidades) {

		$this->unidades = [ ];
		$unidade_id [] = strpos( $unidades, ',' ) ? explode( ',', $unidades ) : $unidades;
		$this->unidades = (is_array( $unidade_id [0] ) && $unidade_id [0] > 1) ? $unidade_id [0] : $unidade_id;
		return $this;

	}

}
