<?php

namespace App\ViewModels\Formulario\FormularioRegistrationViewModel;

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

class PerguntaRegistrationBuilder implements Builder {
	protected $texto_pergunta;
	protected $id_tipo_pergunta;
	protected $obrigatorio;
	protected $opcoes;
	protected $ordem;
	protected $ativo;

	public function build(): PerguntaRegistration {

		$pergunta_registration_vm = new PerguntaRegistration();
		
		$pergunta_registration_vm->setTextoPergunta( $this->texto_pergunta );
		$pergunta_registration_vm->setIdTipoPergunta( $this->id_tipo_pergunta );
		$pergunta_registration_vm->setObrigatorio( $this->obrigatorio );
		$pergunta_registration_vm->setOpcoes( $this->opcoes );
		$pergunta_registration_vm->setOrdem( $this->ordem );
		$pergunta_registration_vm->setAtivo( $this->ativo );
		
		return $pergunta_registration_vm;

	}

	public function setTextoPergunta(string $texto_pergunta): PerguntaRegistrationBuilder {

		$this->texto_pergunta = $texto_pergunta;
		return $this;

	}

	public function setIdTipoPergunta(int $id_tipo_pergunta): PerguntaRegistrationBuilder {

		$this->id_tipo_pergunta = $id_tipo_pergunta;
		return $this;

	}

	public function setObrigatorio(int $obrigatorio): PerguntaRegistrationBuilder {

		$this->obrigatorio = $obrigatorio;
		return $this;

	}

	public function setOpcoes(array $opcoes): PerguntaRegistrationBuilder {

		$questions_that_contains_options = [ 
				TIPO_PERGUNTA_MULTIPLA_ESCOLHA,
				TIPO_PERGUNTA_CHECKBOX
		];
		$require_options = in_array( $this->id_tipo_pergunta, $questions_that_contains_options );
		if ($require_options && count( $opcoes ) === 0) {
			throw new ResponseException( [ 
					'opcoes' => "A pergunta de texto_pergunta \"{$this->texto_pergunta}\" deve conter uma lista de opções."
			], 'Ocorreu um erro durante a construção do objeto PerguntaRegistration.' );
		} else if (!$require_options && count( $opcoes ) > 0) {
			throw new ResponseException( [ 
					'opcoes' => "A pergunta de texto_pergunta \"{$this->texto_pergunta}\" não pode conter opções."
			], 'Ocorreu um erro durante a construção do objeto PerguntaRegistration.' );
		} else {
			$this->opcoes = $opcoes;
			return $this;
		}

	}

	public function setOrdem(int $ordem): PerguntaRegistrationBuilder {

		$this->ordem = $ordem;
		return $this;

	}

	public function setAtivo(int $ativo): PerguntaRegistrationBuilder {
		
		$this->ativo = $ativo;
		return $this;
		
	}
	
}