<?php

namespace App\ViewModels\Administrativo\AdministrativoUpdateViewModel;
use App\Utils\Builder;
use App\Utils\ResponseException;
use Config\CustomRules;
use Exception;

class AdministrativoUpdateViewModelBuilder 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 $id_perfil;

    protected $cep;
    protected $logradouro;
    protected $cidade;
    protected $estado;
    protected $bairro;
    protected $id_clinica;

    public function setIdPerfil($id_perfil)
    {
        $this->id_perfil = $id_perfil;
        return $this;
    }

    public function setNome(string $nome): AdministrativoUpdateViewModelBuilder
    {
        $this->nome = $nome;
        return $this;
    }

    public function setEmail(string $email): AdministrativoUpdateViewModelBuilder
    {
        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): AdministrativoUpdateViewModelBuilder
    {
        $this->rg = $rg;
        return $this;
    }

    public function setDataNascimento(string $data_nascimento): AdministrativoUpdateViewModelBuilder
    {
        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): AdministrativoUpdateViewModelBuilder
    {
        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): AdministrativoUpdateViewModelBuilder
    {
        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): AdministrativoUpdateViewModelBuilder
    {
        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): AdministrativoUpdateViewModelBuilder
    {
        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): AdministrativoUpdateViewModelBuilder
    {
        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): AdministrativoUpdateViewModelBuilder
    {
        $this->numero = $numero;
        return $this;
    }

    public function setComplemento(string $complemento): AdministrativoUpdateViewModelBuilder
    {
        $this->complemento = $complemento;
        return $this;
    }

    public function setReferencias(string $referencias): AdministrativoUpdateViewModelBuilder
    {
        $this->referencias = $referencias;
        return $this;
    }

    public function setProfissao(string $profissao): AdministrativoUpdateViewModelBuilder
    {
        $this->profissao = $profissao;
        return $this;
    }

    public function setEstadoCivil(string $estado_civil): AdministrativoUpdateViewModelBuilder
    {
        $this->estado_civil = $estado_civil;
        return $this;
    }

    public function setIndicadoPor(string $indicado_por): AdministrativoUpdateViewModelBuilder
    {
        $this->indicado_por = $indicado_por;
        return $this;
    }

    public function setAdicionadoPor(?int $adicionado_por): AdministrativoUpdateViewModelBuilder
    {
        $this->adicionado_por = $adicionado_por;
        return $this;
    }

    public function setSenha(string $senha): AdministrativoUpdateViewModelBuilder
    {
        $this->senha = $senha;
        return $this;
    }

    public function setTokenConfirmacaoEmail(string $token_confirmacao_email): AdministrativoUpdateViewModelBuilder
    {
        $this->token_confirmacao_email = $token_confirmacao_email;
        return $this;
    }

    public function setAtivo(int $ativo): AdministrativoUpdateViewModelBuilder
    {
        $this->ativo = $ativo;
        return $this;
    }

    public function setIdMedico(int $id_medico):AdministrativoUpdateViewModelBuilder
    {
        $this->id_medico = $id_medico;
        return $this;
    }


    public function setAlteradoPor($alterado_por):AdministrativoUpdateViewModelBuilder
    {
        $this->alterado_por = $alterado_por;
        return $this;
    }

    public function setFoto(string $foto) :AdministrativoUpdateViewModelBuilder
    {
        $this->foto = $foto;
        return $this;
    }

    /**
     * @param mixed $logradouro
     * @return AdministrativoUpdateViewModelBuilder
     */
    public function setLogradouro($logradouro)
    {
        $this->logradouro = $logradouro;
        return $this;
    }

    /**
     * @param mixed $cidade
     * @return AdministrativoUpdateViewModelBuilder
     */
    public function setCidade($cidade)
    {
        $this->cidade = $cidade;
        return $this;
    }

    /**
     * @param mixed $estado
     * @return AdministrativoUpdateViewModelBuilder
     */
    public function setEstado($estado)
    {
        $this->estado = $estado;
        return $this;
    }

    /**
     * @param mixed $bairro
     * @return AdministrativoUpdateViewModelBuilder
     */
    public function setBairro($bairro)
    {
        $this->bairro = $bairro;
        return $this;
    }

    public function setIdClinica(int $idClinica)
    {
        $this->id_clinica = $idClinica;
        return $this;
    }


    public function build () {
        $administrativo_view_model = new AdministrativoUpdateViewModel();
        $administrativo_view_model->setnome($this->nome);
        $administrativo_view_model->setemail($this->email);
        $administrativo_view_model->setrg($this->rg);
        $administrativo_view_model->setdatanascimento($this->data_nascimento);
        $administrativo_view_model->setcpf($this->cpf);
        $administrativo_view_model->setgenero($this->genero);
        $administrativo_view_model->settelefone1($this->telefone_1);
        $administrativo_view_model->settelefone2($this->telefone_2);
        $administrativo_view_model->setcep($this->cep);
        $administrativo_view_model->setnumero($this->numero);
        $administrativo_view_model->setcomplemento($this->complemento);
        $administrativo_view_model->setreferencias($this->referencias);
        $administrativo_view_model->setProfissao($this->profissao);
        $administrativo_view_model->setestadocivil($this->estado_civil);
        $administrativo_view_model->setindicadopor($this->indicado_por);
        $administrativo_view_model->setAdicionadoPor($this->adicionado_por);
        $administrativo_view_model->setSenha($this->senha);
        $administrativo_view_model->settokenconfirmacaoemail($this->token_confirmacao_email);
        $administrativo_view_model->setIdMedico($this->id_medico);
        $administrativo_view_model->setAtivo($this->ativo);
        $administrativo_view_model->setAlteradoPor($this->alterado_por);

        $administrativo_view_model->setLogradouro($this->logradouro);
        $administrativo_view_model->setBairro($this->bairro);
        $administrativo_view_model->setCidade($this->cidade);
        $administrativo_view_model->setEstado($this->estado);
        $administrativo_view_model->setIdPerfil($this->id_perfil);
        if (isset($this->foto)) {
            $administrativo_view_model->setFoto($this->foto);
        }
        if (isset($this->id_clinica)) {
            $administrativo_view_model->setIdClinica($this->id_clinica);
        }
        return $administrativo_view_model;
    }
}
