<?php


namespace App\ViewModels\AgendaEspecialidade\AgendaEspecialidadeListingViewModel;


use App\Utils\Builder;
use App\Utils\Entity;
use App\Utils\ResponseException;
use App\ViewModels\AgendaEspecialidade\AgendaEspecialidadeUpdateViewModel\AgendaEspecialidadeUpdateViewModelBuilder;

class AgendaEspecialidadeListingViewModelBuilder implements Builder
{
    protected $id;
    protected $data;
    protected $hora_inicio;
    protected $hora_final;
    protected $id_especialidade;
    protected $nome_especialidade;
    protected $id_agendamento;
    protected $id_paciente;
    protected $id_cliente;
    protected $cancelado_em;
    protected $id_consulta;
    protected $id_medico;
    protected $id_unidade;
    protected $nome_cliente;
    protected $nome_pet;

    /**
     * @param mixed $nome_especialidade
     * @return AgendaEspecialidadeListingViewModelBuilder
     */
    public function setNomeEspecialidade($nome_especialidade)
    {
        $this->nome_especialidade = $nome_especialidade;
        return $this;
    }


    /**
     * @param mixed $id_especialidade
     * @return AgendaEspecialidadeListingViewModelBuilder
     */
    public function setIdEspecialidade($id_especialidade)
    {
        $this->id_especialidade = $id_especialidade;
        return $this;
    }

    /**
     * @param mixed $nome_cliente
     * @return AgendaEspecialidadeListingViewModelBuilder
     */
    public function setNomeCliente($nome_cliente)
    {
        $this->nome_cliente = $nome_cliente;
        return $this;
    }

    /**
     * @param mixed $nome_pet
     * @return AgendaEspecialidadeListingViewModelBuilder
     */
    public function setNomePet($nome_pet)
    {
        $this->nome_pet = $nome_pet;
        return $this;
    }

    /**
     * @param mixed $id_medico
     * @return AgendaEspecialidadeListingViewModelBuilder
     */
    public function setIdMedico($id_medico)
    {
        $this->id_medico = $id_medico;
        return $this;
    }

    /**
     * @param mixed $id_unidade
     * @return AgendaEspecialidadeListingViewModelBuilder
     */
    public function setIdUnidade($id_unidade)
    {
        $this->id_unidade = $id_unidade;
        return $this;
    }

    public function setId(int $id): AgendaEspecialidadeListingViewModelBuilder
    {
        $this->id = $id;
        return $this;
    }

    public function setData(string $data): AgendaEspecialidadeListingViewModelBuilder
    {
        $this->data = $data;
        return $this;
    }

    public function setHoraInicio(string $hora_inicio): AgendaEspecialidadeListingViewModelBuilder
    {
        if (preg_match(REGEX_HORARIO, $hora_inicio)) {
            $this->hora_inicio = $hora_inicio;
            return $this;
        } else {
            throw new ResponseException(['hora_inicio' => 'Horário fora do formato: ' . $hora_inicio]);
        }
    }

    public function setHoraFinal(string $hora_final): AgendaEspecialidadeListingViewModelBuilder
    {
        if (preg_match(REGEX_HORARIO, $hora_final)) {
            $this->hora_final = $hora_final;
            return $this;
        } else {
            throw new ResponseException(['hora_inicio' => 'Horário fora do formato: ' . $hora_final]);
        }
    }

    public function setIdTipoProcedimento(int $id_tipo_procedimento): AgendaEspecialidadeListingViewModelBuilder
    {
        $this->id_tipo_procedimento = $id_tipo_procedimento;
        return $this;
    }

    public function setIdAgendamento(?int $id_agendamento): AgendaEspecialidadeListingViewModelBuilder
    {
        $this->id_agendamento = $id_agendamento ?? 0;
        return $this;
    }

    public function setIdProcedimento(?int $id_procedimento): AgendaEspecialidadeListingViewModelBuilder
    {
        $this->id_procedimento = $id_procedimento ?? 0;
        return $this;
    }

    public function setTipoProcedimento(string $tipo_procedimento): AgendaEspecialidadeListingViewModelBuilder
    {
        $this->tipo_procedimento = $tipo_procedimento;
        return $this;
    }

    public function setProcedimento(?string $procedimento): AgendaEspecialidadeListingViewModelBuilder
    {
        $this->procedimento = $procedimento ?? '';
        return $this;
    }

    public function setIdPaciente(?int $id_paciente): AgendaEspecialidadeListingViewModelBuilder
    {
        $this->id_paciente = $id_paciente ?? 0;
        return $this;
    }
    
    public function setIdCliente(?int $id_cliente): AgendaEspecialidadeListingViewModelBuilder
    {
        $this->id_cliente = $id_cliente ?? 0;
        return $this;
    }

    public function setCanceladoEm(String $cancelado_em): AgendaEspecialidadeListingViewModelBuilder
    {
        $this->cancelado_em = $cancelado_em;
        return $this;
    }

    public function setIdConsulta($id_consulta)
    {
        $this->id_consulta = $id_consulta;
        return $this;
    }

    public function build()
    {
        $agenda_details_vm = new AgendaEspecialidadeListingViewModel ();
        $agenda_details_vm->setid($this->id);
        $agenda_details_vm->setdata($this->data);
        $agenda_details_vm->sethorainicio($this->hora_inicio);
        $agenda_details_vm->sethorafinal($this->hora_final);
        $agenda_details_vm->setIdEspecialidade($this->id_especialidade);
        $agenda_details_vm->setNomeEspecialidade($this->nome_especialidade);
        $agenda_details_vm->setIdAgendamento($this->id_agendamento);
        $agenda_details_vm->setIdPaciente($this->id_paciente);
        $agenda_details_vm->setIdCliente($this->id_cliente);
        $agenda_details_vm->setCanceladoEm($this->cancelado_em);
        $agenda_details_vm->setIdConsulta($this->id_consulta);
        $agenda_details_vm->setIdMedico($this->id_medico);
        $agenda_details_vm->setIdUnidade($this->id_unidade);
        $agenda_details_vm->setNomeCliente($this->nome_cliente);
        $agenda_details_vm->setNomePet($this->nome_pet);
        return $agenda_details_vm;
    }


}