<?php

namespace App\ViewModels\Paciente\PacienteRegistrationViewModel;

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

class PacienteRegistrationViewModelBuilder implements Builder {
	private $foto;
	private $nome;
	private $observacao;
	private $email;
	private $rg;
	private $data_nascimento;
	private $cpf;
	private $genero;
	private $telefone_1;
	private $telefone_2;
	private $telefone_3;
	private $cep;
	private $logradouro;
	private $estado;
	private $bairro;
	private $cidade;
	private $numero;
	private $complemento;
	private $referencias;
	private $profissao;
	private $estado_civil;
	private $indicado_por;
	private $adicionado_por;
	private $senha;
	private $token_confirmacao_email;
	private $ativo;
	private $convenio;

	public function setFoto($foto) {

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

	}

	public function setNome(string $nome): PacienteRegistrationViewModelBuilder {

		$this->nome = $nome;
		return $this;

	}

	public function setEmail(string $email): PacienteRegistrationViewModelBuilder {

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

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

	}

	public function setDataNascimento(string $data_nascimento): PacienteRegistrationViewModelBuilder {

		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($cpf): PacienteRegistrationViewModelBuilder {

		if (!is_null( $cpf )) {
			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): PacienteRegistrationViewModelBuilder {

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

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

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

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

	}

	public function setCep(string $cep): PacienteRegistrationViewModelBuilder {

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

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

	}

	public function setComplemento(string $complemento): PacienteRegistrationViewModelBuilder {

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

	}

	public function setReferencias(string $referencias): PacienteRegistrationViewModelBuilder {

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

	}

	public function setProfissao(string $profissao): PacienteRegistrationViewModelBuilder {

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

	}

	public function setEstadoCivil(string $estado_civil): PacienteRegistrationViewModelBuilder {

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

	}

	public function setIndicadoPor(string $indicado_por): PacienteRegistrationViewModelBuilder {

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

	}

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

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

	}

	public function setSenha(string $senha): PacienteRegistrationViewModelBuilder {

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

	}

	public function setTokenConfirmacaoEmail(string $token_confirmacao_email): PacienteRegistrationViewModelBuilder {

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

	}

	public function setAtivo(int $ativo): PacienteRegistrationViewModelBuilder {

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

	}

	public function setConvenio($convenio) {

		$this->convenio = $convenio;
		return $this;

	}

	public function setObservacao($observacao) {

		$this->observacao = $observacao;
		return $this;

	}

	public function setLogradouro($logradouro) {

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

	}

	public function setEstado($estado) {

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

	}

	public function setBairro($bairro) {

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

	}

	public function setCidade($cidade) {

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

	}

	public function setPeso($peso) {

		$this->peso = $peso;
		return $this;

	}

	public function setAltura($altura) {

		$this->altura = $altura;
		return $this;

	}

	public function getPeso() {

		return $this->peso;

	}

	public function getAltura() {

		return $this->altura;

	}

	public function build() {

		$paciente_registration_view_model = new PacienteRegistrationViewModel();
		$paciente_registration_view_model->setFoto( $this->foto );
		$paciente_registration_view_model->setnome( $this->nome );
		$paciente_registration_view_model->setObservacao( $this->observacao );
		$paciente_registration_view_model->setemail( $this->email );
		$paciente_registration_view_model->setrg( $this->rg );
		$paciente_registration_view_model->setdatanascimento( $this->data_nascimento );
		$paciente_registration_view_model->setcpf( $this->cpf );
		$paciente_registration_view_model->setgenero( $this->genero );
		$paciente_registration_view_model->settelefone1( $this->telefone_1 );
		$paciente_registration_view_model->settelefone2( $this->telefone_2 );
		$paciente_registration_view_model->settelefone3( $this->telefone_3 );
		$paciente_registration_view_model->setcep( $this->cep );
		$paciente_registration_view_model->setnumero( $this->numero );
		$paciente_registration_view_model->setcomplemento( $this->complemento );
		$paciente_registration_view_model->setreferencias( $this->referencias );
		$paciente_registration_view_model->setprofissao( $this->profissao );
		$paciente_registration_view_model->setestadocivil( $this->estado_civil );
		$paciente_registration_view_model->setindicadopor( $this->indicado_por );
		$paciente_registration_view_model->setAdicionadoPor( $this->adicionado_por );
		$paciente_registration_view_model->setSenha( $this->senha );
		$paciente_registration_view_model->settokenconfirmacaoemail( $this->token_confirmacao_email );
		$paciente_registration_view_model->setAtivo( $this->ativo );
		$paciente_registration_view_model->setConvenio( $this->convenio );

		$paciente_registration_view_model->setCidade( $this->cidade );
		$paciente_registration_view_model->setBairro( $this->bairro );
		$paciente_registration_view_model->setEstado( $this->estado );
		$paciente_registration_view_model->setLogradouro( $this->logradouro );

		$paciente_registration_view_model->setPeso( $this->peso );
		$paciente_registration_view_model->setAltura( $this->altura );
		return $paciente_registration_view_model;

	}

}
