<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace Magento\Ui\Component\Form\Element;

use Magento\Ui\Component\Form\Field;
use Magento\Framework\View\Element\UiComponentFactory;
use Magento\Framework\View\Element\UiComponentInterface;
use Magento\Framework\View\Element\UiComponent\ContextInterface;

/**
 * @api
 * @since 100.0.2
 */
class Multiline extends AbstractElement
{
    const NAME = 'multiline';

    const FORM_ELEMENT = 'input';

    const DATA_TYPE = 'text';

    /**
     * UI component factory
     *
     * @var UiComponentFactory
     */
    protected $uiComponentFactory;

    /**
     * Constructor
     *
     * @param ContextInterface $context
     * @param UiComponentFactory $uiComponentFactory
     * @param UiComponentInterface[] $components
     * @param array $data
     */
    public function __construct(
        ContextInterface $context,
        UiComponentFactory $uiComponentFactory,
        array $components = [],
        array $data = []
    ) {
        $this->uiComponentFactory = $uiComponentFactory;
        parent::__construct($context, $components, $data);
    }

    /**
     * Get component name
     *
     * @return string
     */
    public function getComponentName()
    {
        return static::NAME;
    }

    /**
     * Prepare component configuration
     *
     * @return void
     */
    public function prepare()
    {
        $size = abs((int) $this->getData('config/size'));
        $validation = [$this->getData('config/validation')];
        while ($size--) {
            $identifier = $this->getName() . '_' . $size;
            $arguments = [
                'data' => [
                    'name' => $identifier,
                    'config' => [
                        'dataScope' => $size,
                        'dataType' => static::DATA_TYPE,
                        'formElement' => static::FORM_ELEMENT,
                        'sortOrder' => $size,
                    ]
                ]
            ];

            if (!empty($validation[$size])) {
                $arguments['data']['config']['validation'] = $validation[$size];
            }

            $component = $this->uiComponentFactory->create($identifier, Field::NAME, $arguments);
            $component->prepare();

            $this->components[$identifier] = $component;
        }
        parent::prepare();
    }
}