<?php

namespace Xentral\Modules\Resubmission\Data;

use Xentral\Modules\Resubmission\Exception\ValidationFailedException;

final class FreeTextFieldContentData
{
    /** @var int $resubmissionId Wiedervorlagen-ID */
    public $resubmissionId;

    /** @var int $configId Textfield-Config-ID */
    public $configId;

    /** @var string|null $content */
    public $content;

    /**
     * @param array $formData
     *
     * @throws ValidationFailedException
     *
     * @return self
     */
    public static function fromFormData(array $formData)
    {
        $formData['content'] = trim($formData['content']);

        $data = new self();
        $data->configId = (int)$formData['textfield_config_id'];
        $data->resubmissionId = (int)$formData['resubmission_id'];
        $data->content = !empty($formData['content']) ? $formData['content'] : null;

        $errors = $data->validate();
        if (!empty($errors)) {
            throw ValidationFailedException::fromErrors($errors);
        }

        return $data;
    }

    /**
     * @return array
     */
    public function validate()
    {
        $errors = [];

        // resubmissionId-Property
        if (!is_int($this->resubmissionId)) {
            $errors['resubmission_id'][] = 'The "resubmissionId" property must be an integer.';
        }
        if ($this->resubmissionId <= 0) {
            $errors['resubmission_id'][] = 'The "resubmissionId" property must be greater than zero.';
        }

        // configId-Property
        if (!is_int($this->configId)) {
            $errors['config_id'][] = 'The "configId" property must be type integer.';
        }
        if ($this->configId <= 0) {
            $errors['config_id'][] = 'The "configId" property must be greater than zero.';
        }

        // content-Property
        if ($this->content !== null && !is_string($this->content)) {
            $errors['content'][] = 'The "content" property must be null or a non empty string.';
        }

        return $errors;
    }
}