<?php


namespace App\Entities\AgendaEspecialidade;

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

class AgendaEspecialidadeBuilder implements Builder
{
    protected $id;
    protected $codigo;
    protected $id_medico;
    protected $id_unidade;
    protected $data;
    protected $hora_inicio;
    protected $hora_final;
    protected $id_especialidade;
    protected $adicionado_por;
    protected $alterado_por;
    protected $criado_em;
    protected $alterado_em;

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

    public function setCodigo(string $codigo) : AgendaEspecialidadeBuilder
    {
        $this->codigo = $codigo;
        return $this;
    }

    public function setIdMEDICO($id_medico) : AgendaEspecialidadeBuilder
    {
        $this->id_medico = $id_medico;
        return $this;
    }

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

    public function setData(string $data) : AgendaEspecialidadeBuilder
    {
        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) : AgendaEspecialidadeBuilder
    {
        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) : AgendaEspecialidadeBuilder
    {
        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 setIdEspecialidade($id_especialidade)
    {
        $this->id_especialidade = $id_especialidade;
        return $this;
    }

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

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

    public function setCriadoEm(?string $criado_em) : AgendaEspecialidadeBuilder
    {
        $this->criado_em = $criado_em;
        return $this;
    }

    public function setAlteradoEm(?string $alterado_em): AgendaEspecialidadeBuilder
    {
        $this->alterado_em = $alterado_em;
        return $this;
    }

    public function build()
    {
        $agenda = new AgendaEspecialidade();
        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_unidade)) {
            $agenda->setIdUnidade($this->id_unidade);
        }
        if (isset($this->id_especialidade)) {
            $agenda->setIdEspecialidade($this->id_especialidade);
        }
        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->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;
    }
}