<?php
/**
 * For the full copyright and license information, please view the
 * docs/licenses/LICENSE.txt file that was distributed with this source code.
 */
class FormFieldCore
{
    private $name = '';
    private $type = 'text';
    private $required = false;
    private $label = '';
    private $value = null;
    private $availableValues = [];
    /**
     * @var int|null
     */
    private $minLength = null;
    private $maxLength = null;
    private $errors = [];
    private $constraints = [];
    private $attr = [];

    /**
     * @var string
     */
    private $autocomplete = '';

    /**
     * @var string|null
     */
    public $moduleName = null;

    public function toArray()
    {
        $formField = [
            'name' => $this->getName(),
            'type' => $this->getType(),
            'required' => $this->isRequired(),
            'label' => $this->getLabel(),
            'value' => $this->getValue(),
            'availableValues' => $this->getAvailableValues(),
            'minLength' => $this->getMinLength(),
            'maxLength' => $this->getMaxLength(),
            'errors' => $this->getErrors(),
            'autocomplete' => $this->getAutocompleteAttribute(),
            'attr' => $this->getAttr(),
        ];

        Hook::exec('additionalHtmlAttributesFormFields', ['formFieldArray' => &$formField]);

        return $formField;
    }

    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    public function getName()
    {
        return $this->name;
    }

    public function setType($type)
    {
        $this->type = $type;

        return $this;
    }

    public function getType()
    {
        return $this->type;
    }

    public function setRequired($required)
    {
        $this->required = $required;

        return $this;
    }

    public function isRequired()
    {
        return $this->required;
    }

    public function setLabel($label)
    {
        $this->label = $label;

        return $this;
    }

    public function getLabel()
    {
        return $this->label;
    }

    public function setValue($value)
    {
        $this->value = $value;

        return $this;
    }

    public function getValue()
    {
        return $this->value;
    }

    public function setAvailableValues(array $availableValues)
    {
        $this->availableValues = $availableValues;

        return $this;
    }

    public function getAvailableValues()
    {
        return $this->availableValues;
    }

    public function addAvailableValue($availableValue, $label = null)
    {
        if (!$label) {
            $label = $availableValue;
        }

        $this->availableValues[$availableValue] = $label;

        return $this;
    }

    public function setMinLength(?int $min): self
    {
        $this->minLength = $min;

        return $this;
    }

    public function getMinLength(): ?int
    {
        return $this->minLength;
    }

    public function setMaxLength($max)
    {
        $this->maxLength = (int) $max;

        return $this;
    }

    public function getMaxLength()
    {
        return $this->maxLength;
    }

    public function setErrors(array $errors)
    {
        $this->errors = $errors;

        return $this;
    }

    public function getErrors()
    {
        return $this->errors;
    }

    public function addError($errorString)
    {
        $this->errors[] = $errorString;

        return $this;
    }

    public function setConstraints(array $constraints)
    {
        $this->constraints = $constraints;

        return $this;
    }

    public function addConstraint($constraint)
    {
        $this->constraints[] = $constraint;

        return $this;
    }

    public function getConstraints()
    {
        return $this->constraints;
    }

    /**
     * @param string $autocomplete
     *
     * @return FormFieldCore
     */
    public function setAutocompleteAttribute(string $autocomplete): FormFieldCore
    {
        $this->autocomplete = $autocomplete;

        return $this;
    }

    /**
     * @return string
     */
    public function getAutocompleteAttribute(): string
    {
        return $this->autocomplete;
    }

    /**
     * @param array $attr
     *
     * @return FormFieldCore
     */
    public function setAttr(array $attr): FormFieldCore
    {
        $this->attr = $attr;

        return $this;
    }

    /**
     * @return array
     */
    public function getAttr(): array
    {
        return $this->attr;
    }
}
