<?php

namespace App\ViewModels\Medico\MedicoUpdateViewModel;

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

class MedicoUpdateViewModelBuilder implements Builder {
	protected $nome;
	protected $email;
	protected $rg;
	protected $data_nascimento;
	protected $cpf;
	protected $genero;
	protected $telefone_1;
	protected $telefone_2;
	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 $id_medico;
	protected $alterado_por;
	protected $foto;
	protected $cep;
	protected $logradouro;
	protected $cidade;
	protected $estado;
	protected $bairro;
	protected $assinatura;
	protected $documento;

	public function setNome(string $nome): MedicoUpdateViewModelBuilder {

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

	}

	public function setAssinatura($assinatura) {

		$this->assinatura = $assinatura;
		return $this;

	}

	public function setDocumento($documento) {

		$this->documento = $documento;
		return $this;

	}

	public function setEmail(string $email): MedicoUpdateViewModelBuilder {

		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): MedicoUpdateViewModelBuilder {

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

	}

	public function setDataNascimento(string $data_nascimento): MedicoUpdateViewModelBuilder {

		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): MedicoUpdateViewModelBuilder {

		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): MedicoUpdateViewModelBuilder {

		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): MedicoUpdateViewModelBuilder {

		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): MedicoUpdateViewModelBuilder {

		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 setCep(string $cep): MedicoUpdateViewModelBuilder {

		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): MedicoUpdateViewModelBuilder {

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

	}

	public function setComplemento(string $complemento): MedicoUpdateViewModelBuilder {

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

	}

	public function setReferencias(string $referencias): MedicoUpdateViewModelBuilder {

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

	}

	public function setProfissao(string $profissao): MedicoUpdateViewModelBuilder {

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

	}

	public function setEstadoCivil(string $estado_civil): MedicoUpdateViewModelBuilder {

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

	}

	public function setIndicadoPor(string $indicado_por): MedicoUpdateViewModelBuilder {

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

	}

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

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

	}

	public function setSenha(string $senha): MedicoUpdateViewModelBuilder {

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

	}

	public function setTokenConfirmacaoEmail(string $token_confirmacao_email): MedicoUpdateViewModelBuilder {

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

	}

	public function setAtivo(int $ativo): MedicoUpdateViewModelBuilder {

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

	}

	
	public function setIdMedico(int $id_medico): MedicoUpdateViewModelBuilder {

		$this->id_medico = $id_medico;
		return $this;

	}

	public function setAlteradoPor($alterado_por): MedicoUpdateViewModelBuilder {

		$this->alterado_por = $alterado_por;
		return $this;

	}

	public function setFoto(string $foto): MedicoUpdateViewModelBuilder {

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

	}

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

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

	}

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

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

	}

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

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

	}

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

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

	}

	public function build() {

		$medico_view_model = new MedicoUpdateViewModel();
		$medico_view_model->setnome( $this->nome );
		$medico_view_model->setemail( $this->email );
		$medico_view_model->setrg( $this->rg );
		$medico_view_model->setdatanascimento( $this->data_nascimento );
		$medico_view_model->setcpf( $this->cpf );
		$medico_view_model->setgenero( $this->genero );
		$medico_view_model->settelefone1( $this->telefone_1 );
		$medico_view_model->settelefone2( $this->telefone_2 );
		$medico_view_model->setcep( $this->cep );
		$medico_view_model->setnumero( $this->numero );
		$medico_view_model->setcomplemento( $this->complemento );
		$medico_view_model->setreferencias( $this->referencias );
		$medico_view_model->setProfissao( $this->profissao );
		$medico_view_model->setestadocivil( $this->estado_civil );
		$medico_view_model->setindicadopor( $this->indicado_por );
		$medico_view_model->setAdicionadoPor( $this->adicionado_por );
		$medico_view_model->setSenha( $this->senha );
		$medico_view_model->settokenconfirmacaoemail( $this->token_confirmacao_email );
		$medico_view_model->setIdMedico( $this->id_medico );
		$medico_view_model->setAtivo( $this->ativo );		
		$medico_view_model->setAlteradoPor( $this->alterado_por );
		$medico_view_model->setLogradouro( $this->logradouro );
		$medico_view_model->setCidade( $this->cidade );
		$medico_view_model->setEstado( $this->estado );
		$medico_view_model->setBairro( $this->bairro );
		if (isset( $this->foto )) {
			$medico_view_model->setFoto( $this->foto );
		}
		return $medico_view_model;

	}

}
