<?php
/*
** Copyright (C) 2001-2026 Zabbix SIA
**
** This program is free software: you can redistribute it and/or modify it under the terms of
** the GNU Affero General Public License as published by the Free Software Foundation, version 3.
**
** This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
** without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
** See the GNU Affero General Public License for more details.
**
** You should have received a copy of the GNU Affero General Public License along with this program.
** If not, see <https://www.gnu.org/licenses/>.
**/


class CMultilineInput extends CDiv {
	/**
	 * Default CSS class name for HTML root element.
	 */
	const ZBX_STYLE_CLASS = 'multilineinput-control';

	/**
	 * @var string
	 */
	private $name;

	/**
	 * @var string
	 */
	private $value;

	/**
	 * @var array
	 */
	private $options;

	/**
	 * @param string   $name
	 * @param string   $value
	 * @param array    $options
	 * @param string   $options['title']                 Modal dialog title.
	 * @param string   $options['hint']                  Hint message for input element.
	 * @param string   $options['placeholder']           Placeholder for empty value.
	 * @param string   $options['placeholder_textarea']  Placeholder for empty value for textarea.
	 * @param string   $options['label_before']          Label, placed before textarea (HTML allowed, default: '').
	 * @param string   $options['label_after']           Label, placed after textarea (HTML allowed, default: '').
	 * @param int      $options['maxlength']             Max characters length (optional).
	 * @param bool     $options['line_numbers']          Show line numbers (default: true).
	 * @param int      $options['rows']                  Textarea rows number for grow=fixed
	 *                                                   or rows limit for grow=auto if more than 0 (default: 20).
	 * @param bool     $options['grow']                  Textarea grow mode fixed|auto|stretch (default: 'fixed').
	 * @param bool     $options['monospace_font']        Monospace font type (default: true).
	 * @param bool     $options['readonly']              Readonly component (default: false).
	 * @param bool     $options['disabled']              Is disabled (default: false).
	 * @param bool     $options['use_tab]                If true, on tab key pressed, adds indent instead of moving
	 *                                                   the pointer to the next element
	 */
	public function __construct($name = 'multilineinput', $value = '', array $options = []) {
		parent::__construct();

		$this
			->addClass(self::ZBX_STYLE_CLASS)
			->setId(zbx_formatDomId($name))
			->setAttribute('data-name', $name)
			->setAttribute('data-field-type', 'multiline');

		$this->name = $name;
		$this->value = $value;
		$this->options = $options;
	}

	/**
	 * @param string $value
	 *
	 * @return CMultilineInput
	 */
	public function setValue($value) {
		$this->value = $value;

		return $this;
	}

	/**
	 * @param string           $key
	 * @param string|int|bool  $value
	 *
	 * @return CMultilineInput
	 */
	public function setOption($key, $value) {
		$this->options[$key] = $value;

		return $this;
	}

	/**
	 * @return CMultilineInput
	 */
	public function setEnabled() {
		$this->options['disabled'] = false;

		return $this;
	}

	/**
	 * @return CMultilineInput
	 */
	public function setDisabled() {
		$this->options['disabled'] = true;

		return $this;
	}

	/**
	 * Get content of all Javascript code.
	 *
	 * @return string  Javascript code.
	 */
	public function getPostJS() {
		return 'jQuery("#'.$this->getId().'").multilineInput('.json_encode([
			'value' => $this->value
		] + $this->options).');';
	}

	public function toString($destroy = true) {
		if (!array_key_exists('add_post_js', $this->options) || $this->options['add_post_js']) {
			zbx_add_post_js($this->getPostJS());
		}

		return parent::toString($destroy);
	}

	/**
	 * Specify ID of error container.
	 *
	 * @param string|null $container_id    ID of form element where to display field errors.
	 *
	 * @return self
	 */
	public function setErrorContainer(?string $container_id): self {
		$this->setAttribute('data-error-container', $container_id);

		return $this;
	}

	/**
	 * Specify the field label used for error message.
	 *
	 * @param string|null $label    Field label used in error message.
	 *
	 * @return self
	 */
	public function setErrorLabel(?string $label): self {
		$this->setAttribute('data-error-label', $label);

		return $this;
	}
}
