<?php

namespace App\Entities\Agenda;

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

class AgendaBuilder implements Builder {
	protected $id;
	protected $codigo;
	protected $id_medico;
	protected $id_assistente;
	protected $id_unidade;
	protected $data;
	protected $hora_inicio;
	protected $hora_final;
	protected $id_tipo_procedimento;
	protected $adicionado_por;
	protected $alterado_por;
	protected $criado_em;
	protected $alterado_em;

	public function setId(int $id): AgendaBuilder {

		$this->id = $id;
		return $this;

	}

	public function setCodigo(string $codigo): AgendaBuilder {

		$this->codigo = $codigo;
		return $this;

	}

	public function setIdMedico(int $id_medico): AgendaBuilder {

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

	}

	public function setIdAssistente(int $id_assistente): AgendaBuilder {

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

	}

	public function setIdUnidade($id_unidade) {

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

	}

	public function setData(string $data): AgendaBuilder {

		if (preg_match( REGEX_DATE_US_PATTERN, $data )) {
			$this->data = $data;
			return $this;
		} else {
			throw new ResponseException( [ 
				'data' => 'Data fora do padrão'
			] );
		}

	}

	public function setHoraInicio(string $hora_inicio): AgendaBuilder {

		if (preg_match( REGEX_HORARIO, $hora_inicio )) {
			$this->hora_inicio = $hora_inicio;
			return $this;
		} else {
			throw new ResponseException( [ 
				'hora_inicio' => 'Horário fora do padrão'
			] );
		}

	}

	public function setHoraFinal(string $hora_final): AgendaBuilder {

		if (preg_match( REGEX_HORARIO, $hora_final )) {
			$this->hora_final = $hora_final;
			return $this;
		} else {
			throw new ResponseException( [ 
				'hora_final' => 'Horário fora do padrão'
			] );
		}

	}

	public function setIdTipoProcedimento(int $id_tipo_procedimento): AgendaBuilder {

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

	}

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

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

	}

	public function setAlteradoPor(?int $alterado_por): AgendaBuilder {

		$this->alterado_por = $alterado_por;
		return $this;

	}

	public function setCriadoEm(?string $criado_em): AgendaBuilder {

		$this->criado_em = $criado_em;
		return $this;

	}

	public function setAlteradoEm(?string $alterado_em): AgendaBuilder {

		$this->alterado_em = $alterado_em;
		return $this;

	}

	public function build() {

		$agenda = new Agenda();
		if (isset( $this->id )) {
			$agenda->setid( $this->id );
		}
		if (isset( $this->codigo )) {
			$agenda->setcodigo( $this->codigo );
		}
		if (isset( $this->id_medico )) {
			$agenda->setidMedico( $this->id_medico );
		}
		if (isset( $this->id_assistente )) {
			$agenda->setIdAssistente( $this->id_assistente );
		}
		if (isset( $this->id_unidade )) {
			$agenda->setIdUnidade( $this->id_unidade );
		}
		if (isset( $this->data )) {
			$agenda->setdata( $this->data );
		}
		if (isset( $this->hora_inicio )) {
			$agenda->sethorainicio( $this->hora_inicio );
		}
		if (isset( $this->hora_final )) {
			$agenda->sethorafinal( $this->hora_final );
		}
		if (isset( $this->id_tipo_procedimento )) {
			$agenda->setIdTipoProcedimento( $this->id_tipo_procedimento );
		}
		if (isset( $this->adicionado_por )) {
			$agenda->setadicionadopor( $this->adicionado_por );
		}
		if (isset( $this->alterado_por )) {
			$agenda->setalteradopor( $this->alterado_por );
		}
		if (isset( $this->criado_em )) {
			$agenda->setcriadoem( $this->criado_em );
		}
		if (isset( $this->alterado_em )) {
			$agenda->setalteradoem( $this->alterado_em );
		}
		return $agenda;

	}

}