<?php declare(strict_types = 0);
/*
** 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/>.
**/


use Zabbix\Widgets\Fields\CWidgetFieldPatternSelect;

abstract class CWidgetFieldPatternSelectView extends CWidgetFieldView {

	protected ?CPatternSelect $patternselect = null;

	protected array $filter_preselect = [];

	protected array $popup_parameters = [];

	protected string $placeholder = '';

	public function __construct(CWidgetFieldPatternSelect $field) {
		$this->field = $field;
		$this->placeholder = _('patterns');
	}

	abstract protected function getObjectName(): string;

	public function getId(): string {
		return $this->getPatternSelect()->getId();
	}

	public function getFocusableElementId(): string {
		return $this->getId().'_ms';
	}

	public function getView(): CPatternSelect {
		return $this->getPatternSelect();
	}

	public function getPatternSelect(): CPatternSelect {
		if ($this->patternselect === null) {
			$patternselect_name = $this->getName().'[]';

			$options = [
				'name' => $patternselect_name,
				'object_name' => $this->getObjectName(),
				'data' => $this->field->getValue(),
				'disabled' => $this->isDisabled(),
				'placeholder' => $this->placeholder,
				'wildcard_allowed' => true,
				'popup' => [
					'parameters' => [
							'dstfrm' => $this->form_name,
							'dstfld1' => zbx_formatDomId($patternselect_name)
						] + $this->getPopupParameters()
				],
				'add_post_js' => false
			];

			if ($this->filter_preselect) {
				$options['popup']['filter_preselect'] = $this->filter_preselect;
			}

			$this->patternselect = (new CPatternSelect($options))
				->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
				->setAriaRequired($this->isRequired());
		}

		return $this->patternselect;
	}

	public function getJavaScript(): string {
		return '
			CWidgetForm.addField(
				new CWidgetFieldPatternSelect('.json_encode([
					'name' => $this->field->getName(),
					'form_name' => $this->form_name,
					'id' => $this->getId()
				]).')
			);
		';
	}

	public function setFilterPreselect(array $filter_preselect): self {
		$this->filter_preselect = $filter_preselect;

		return $this;
	}

	public function setPopupParameter(string $name, $value): self {
		$this->popup_parameters[$name] = $value;

		return $this;
	}

	protected function getPopupParameters(): array {
		return $this->popup_parameters;
	}

	public function setPlaceholder(string $placeholder): self {
		$this->placeholder = $placeholder;

		return $this;
	}
}
