<?php


namespace App\ViewModels\AgendaMedico\AgendaMedicoRegistrationViewModel;


use App\Utils\Builder;
use App\Utils\ResponseException;
use DateTime;

class AgendaMedicoRegistrationViewModelBuilder implements Builder
{

    protected $id_medico;
    protected $id_unidade;
    protected $id_especialidade;
    protected $data;
    protected $hora_inicio;
    protected $hora_final;
    protected $adicionado_por;

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

    public function setIdUnidade($id_unidade)
    {
        $this->id_unidade = $id_unidade;
        return $this;
    }

    public function setIdEspecialidade($id_especialidade)
    {
        $this->id_especialidade = $id_especialidade;
        return $this;
    }

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

    public function setHoraInicio(DateTime $hora_inicio): AgendaMedicoRegistrationViewModelBuilder
    {
        $this->hora_inicio = $hora_inicio;
        return $this;
    }

    public function setHoraFinal(DateTime $hora_final): AgendaMedicoRegistrationViewModelBuilder
    {
        $diff = date_diff($this->hora_inicio, $hora_final);
        if ($diff->invert) {
            throw new ResponseException(['hora_final' => 'A hora final da consulta deve ser maior que a hora inicial.'], 'Erro durante o mapeamento da entidade AgendaEspecialidadeViewModel.');
        } else if ($diff->h * MINUTE + $diff->i < TEMPO_MINIMO_CONSULTA) {
            throw new ResponseException(['hora_final' => 'A consulta deve ter, no mínimo, ' . TEMPO_MINIMO_CONSULTA . ' minutos'], 'Erro durante o mapeamento da entidade AgendaEspecialidadeViewModel.');
        } else {
            $this->hora_final = $hora_final;
            return $this;
        }
    }

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

    public function build() : AgendaMedicoRegistrationViewModel
    {
        $agenda_registration_vm = new AgendaMedicoRegistrationViewModel();
        $agenda_registration_vm->setidmedico($this->id_medico);
        $agenda_registration_vm->setIdUnidade($this->id_unidade);
        $agenda_registration_vm->setIdEspecialidade($this->id_especialidade);
        $agenda_registration_vm->setdata($this->data);
        $agenda_registration_vm->sethorainicio($this->hora_inicio);
        $agenda_registration_vm->sethorafinal($this->hora_final);
        $agenda_registration_vm->setAdicionadoPor($this->adicionado_por);
        return $agenda_registration_vm;
    }


}