<?php

namespace App\ViewModels\Agenda\AgendaRegistrationViewModel;

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

class AgendaRegistrationViewModelBuilder implements Builder {
	protected $id_medico;
	protected $id_assistente;
	protected $id_unidade;
	protected $id_tipo_procedimento;
	protected $data;
	protected $hora_inicio;
	protected $hora_final;
	protected $adicionado_por;

	public function build(): AgendaRegistrationViewModel {

		$agenda_registration_vm = new AgendaRegistrationViewModel();

		$agenda_registration_vm->setIdMedico( $this->id_medico );
		$agenda_registration_vm->setIdAssistente( $this->id_assistente );
		$agenda_registration_vm->setIdUnidade( $this->id_unidade );
		$agenda_registration_vm->setIdTipoProcedimento( $this->id_tipo_procedimento );
		$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;

	}

	public function setIdMedico(int $id_medico): AgendaRegistrationViewModelBuilder {

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

	}

	public function setIdAssistente(int $id_assistente): AgendaRegistrationViewModelBuilder {

		$this->id_assistente = $id_assistente;
		return $this;

	}

	public function setIdUnidade($id_unidade) {

		$this->id_unidade = $id_unidade;
		return $this;

	}

	public function setIdTipoProcedimento(int $id_tipo_procedimento): AgendaRegistrationViewModelBuilder {

		$this->id_tipo_procedimento = $id_tipo_procedimento;
		return $this;

	}

	public function setData(DateTime $data): AgendaRegistrationViewModelBuilder {

		$this->data = $data;
		return $this;

	}

	public function setHoraInicio(DateTime $hora_inicio): AgendaRegistrationViewModelBuilder {

		$this->hora_inicio = $hora_inicio;
		return $this;

	}

	public function setHoraFinal(DateTime $hora_final): AgendaRegistrationViewModelBuilder {

		$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 AgendaViewModel.' );
		} 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 AgendaViewModel.' );
		} else {
			$this->hora_final = $hora_final;
			return $this;
		}

	}

	public function setAdicionadoPor(int $adicionado_por): AgendaRegistrationViewModelBuilder {

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

	}

}