<?php
/*
** Copyright (C) 2001-2025 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/>.
**/


require_once dirname(__FILE__) . '/../../include/CWebTest.php';

class testMultiselectDialogs extends CWebTest {

	/**
	 * Function for opening multiselects in a form and check their contents.
	 *
	 * @param CFormElement    $form            form where checks are performed
	 * @param array           $multiselects    multiselect fields to be checked
	 */
	protected function checkMultiselectDialogs($form, $multiselects) {
		foreach ($multiselects as $multiselect) {
			$count = count($multiselect);
			$multiselect_form = $form;

			foreach ($multiselect as $field => $parameters) {
				// Open multiselect dialog.
				$dialog = $multiselect_form->getField($field)->edit();
				$this->checkErrorsAndTitle($dialog, $parameters['title']);

				if (array_key_exists('filter', $parameters)) {
					$this->checkOverlayFilter($dialog, $parameters['title'], $parameters['filter']);
				}

				if (CTestArrayHelper::get($parameters, 'empty', false)) {
					$this->checkOverlayStud($dialog, $parameters['title']);
				}

				// Set form element of current overlay dialog if multiple dialogs layers are opened.
				if ($count > 1) {
					$multiselect_form = $dialog->asForm(['normalized' => true]);
				}
			}

			if ($count > 1) {
				COverlayDialogElement::closeAll(true);
			}
			else {
				$dialog->close();
			}
		}
	}

	/**
	 * Function for checking dialog title and error absence in it.
	 *
	 * @param COverlayDialogElement    $dialog    dialog form where checks are performed
	 * @param string                   $title     title of a dialog
	 */
	protected function checkErrorsAndTitle($dialog, $title) {
		$this->assertEquals($title, $dialog->getTitle());

		// Check that opened dialog does not contain any error messages.
		$this->assertFalse($dialog->query('xpath:.//*[contains(@class, "msg-bad")]')->exists());
	}

	/**
	 * Function for asserting additional filter in multeselect's overlay.
	 *
	 * @param COverlayDialogElement    $dialog    dialog form where checks are performed
	 * @param string                   $title     title of a dialog
	 * @param array                    $filter    filter parameters passed in format: ['<filter_label>' => '<filter_value>']
	 */
	protected function checkOverlayFilter($dialog, $title, $filter = null) {
		// For some overlays filter has special selector.
		$filter_selector = (in_array($title, ['SLA', 'Service', 'Services']))
			? $dialog->query('id:services-filter-name')
			: $dialog->query('xpath:.//div[@class="multiselect-control"]')->asMultiselect();

		if ($filter === null) {
			$this->assertFalse($filter_selector->exists());
		}
		else {
			$this->assertEquals(key($filter), $dialog->query('tag:label')->one()->getText());
			$this->assertEquals(array_values($filter), [$filter_selector->one()->getValue()]);
		}
	}

	/**
	 * Function for checking stud's text when overlay is empty.
	 *
	 * @param COverlayDialogElement    $dialog    dialog form where checks are performed
	 * @param string                   $title     title of a dialog
	 */
	protected function checkOverlayStud($dialog, $title) {
		$text = (in_array($title, ['Templates', 'Hosts', 'Triggers']))
			? "Filter is not set\nUse the filter to display results"
			: 'No data found';
		$this->assertEquals($text, $dialog->query('class:no-data-message')->one()->getText());
	}
}