<?php
/*
** Zabbix
** Copyright (C) 2001-2022 Zabbix SIA
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 2 of the License, or
** (at your option) any later version.
**
** 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 General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
**/

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

use Facebook\WebDriver\WebDriverBy;

class testPageReportsTriggerTop extends CLegacyWebTest {

	public function testPageReportsTriggerTop_FilterLayout() {
		$this->zbxTestLogin('toptriggers.php');
		$this->zbxTestCheckTitle('100 busiest triggers');
		$this->zbxTestCheckHeader('100 busiest triggers');
		$this->zbxTestExpandFilterTab('Filter');
		$this->zbxTestTextPresent('Host groups', 'Hosts', 'Severity', 'Filter', 'From', 'Till');
		$this->zbxTestClickXpathWait('//button[text()="Reset"]');

		// Check unselected severities
		$severities = ['Not classified', 'Warning', 'High', 'Information', 'Average', 'Disaster'];
		foreach ($severities as $severity) {
			$severity_id = $this->zbxTestGetAttributeValue('//label[text()=\''.$severity.'\']', 'for');
			$this->assertTrue($this->query('id', $severity_id)->waitUntilPresent()->one()->isSelected(false));
		}

		// Check closed filter
		$this->zbxTestClickXpathWait('//a[contains(@class,\'filter-trigger\')]');
		$this->zbxTestAssertNotVisibleId('groupids_');

		// Check opened filter
		$this->zbxTestClickXpathWait('//a[contains(@class,\'filter-trigger\')]');
		$this->zbxTestAssertVisibleId('groupids_');
	}

	public static function getFilterData() {
		return [
			[
				[
					'filter' => [
						'host_group' => 'Zabbix servers'
					],
					'date' => [
						'from' => '2020-10-23 00:00',
						'to' => 'now/d'
					],
					'result' => [
						'Test trigger to check tag filter on problem page',
						'Test trigger with tag'
					]
				]
			],
			[
				[
					'filter' => [
						'host_group' => 'Zabbix servers'
					],
					'date' => [
						'from' => 'now/d',
						'to' => 'now/d'
					]
				]
			],
			[
				[
					'filter' => [
						'host_group' => 'Zabbix servers',
						'host' => 'ЗАББИКС Сервер'
					],
					'date' => [
						'from' => '2020-10-23 17:00'
					],
					'result' => [
						'Test trigger with tag'
					]
				]
			],
			[
				[
					'filter' => [
						'host_group' => 'Zabbix servers',
						'host' => 'Host ZBX6663'
					],
					'date' => [
						'from' => 'now/d',
						'to' => 'now/d'
					]
				]
			],
			[
				[
					'filter' => [
						'host_group' => 'Zabbix servers',
						'host' => 'ЗАББИКС Сервер'
					],
					'date' => [
						'from' => '2020-10-22 04:01',
						'to' => '2020-10-24 04:01'
					],
					'result' => [
						'Test trigger to check tag filter on problem page',
						'Test trigger with tag'
					]
				]
			],
			[
				[
					'filter' => [
						'host_group' => 'Zabbix servers',
						'host' => 'ЗАББИКС Сервер'
					],
					'date' => [
						'from' => '2020-10-26 00:00',
						'to' => 'now/d'
					]
				]
			],
			[
				[
					'date' => [
						'from' => '2020-10-23 15:35',
						'to' => '2020-10-23 15:36'
					],
					'result' => [
						'Trigger for tag permissions MySQL'
					]
				]
			],
			[
				[
					'filter' => [
						'severities' => [
							'Average',
							'High',
							'Disaster'
						]
					],
					'date' => [
						'from' => '2020-10-22 00:00'
					],
					'result' => [
						'Test trigger to check tag filter on problem page'
					]
				]
			],
			[
				[
					'filter' => [
						'severities' => [
							'High',
							'Disaster'
						]
					],
					'date' => [
						'from' => '2020-10-22 00:00'
					]
				]
			],
			[
				[
					'date' => [
						'from' => '2020-10-23 15:33',
						'to' => '2020-10-23 15:36'
					],
					'result' => [
						'Test trigger to check tag filter on problem page',
						'Trigger for tag permissions MySQL'
					]
				]
			]
		];
	}

	/**
	 * @dataProvider getFilterData
	 */
	public function testPageReportsTriggerTop_CheckFilter($data) {
		$this->zbxTestLogin('toptriggers.php');
		$this->zbxTestCheckHeader('100 busiest triggers');
		$this->zbxTestExpandFilterTab('Filter');
		$this->zbxTestClickButtonText('Reset');
		$this->zbxTestWaitForPageToLoad();

		if (array_key_exists('filter', $data)) {
			$filter = $data['filter'];

			if (array_key_exists('host_group', $filter)) {
				$this->zbxTestClickButtonMultiselect('groupids_');
				$this->zbxTestLaunchOverlayDialog('Host groups');
				$this->zbxTestClickLinkTextWait($filter['host_group']);
				$this->zbxTestWaitUntilElementNotVisible(WebDriverBy::xpath('//div[contains(@class, "overlay-dialogue modal")]'));
				$this->zbxTestMultiselectAssertSelected('groupids_', $filter['host_group']);
			}

			if (array_key_exists('host', $filter)) {
				$this->zbxTestClickButtonMultiselect('hostids_');
				$this->zbxTestLaunchOverlayDialog('Hosts');
				COverlayDialogElement::find()->one()->query('class:multiselect-button')->one()->click();
				$this->zbxTestLaunchOverlayDialog('Host groups');
				$groups_form = $this->query('name:hostGroupsform')->one();
				$all_groups = $groups_form->query('xpath:.//a')->all()->asText();
				$groups = ['Host group for tag permissions', 'Zabbix servers', 'ZBX6648 All Triggers',
					'ZBX6648 Disabled Triggers', 'ZBX6648 Enabled Triggers'];
				$this->assertTrue(count(array_diff($groups, $all_groups)) === 0);
				$groups_form->query('xpath://a[text()="Zabbix servers"]')->one()->click();
				COverlayDialogElement::find()->one()->waitUntilReady();
				$this->zbxTestClickXpathWait('//div[contains(@class, "overlay-dialogue modal")]//a[text()="'.
						$filter['host'].'"]');
				$this->zbxTestWaitUntilElementNotVisible(WebDriverBy::xpath('//div[contains(@class, "overlay-dialogue modal")]'));
				$this->zbxTestMultiselectAssertSelected('hostids_', $filter['host']);
			}

			if (array_key_exists('severities', $filter)) {
				foreach ($filter['severities'] as $severity) {
					$severity_id = $this->zbxTestGetAttributeValue('//label[text()="'.$severity.'"]', 'for');
					$this->zbxTestClick($severity_id);
				}
			}

			$this->zbxTestClickXpathWait('//button[@name="filter_set"][text()="Apply"]');
			$this->zbxTestWaitForPageToLoad();
		}

		// Fill in the date in filter.
		if (array_key_exists('date', $data)) {
			$this->zbxTestExpandFilterTab('Time');
			foreach ($data['date'] as $i => $full_date) {
				$this->zbxTestInputTypeOverwrite($i, $full_date);
			}
			// Wait till table id will be changed after filter apply.
			$tabel_id = $this->zbxTestGetAttributeValue('//table[@class="list-table"]', 'id');
			$this->zbxTestClickWait('apply');
			$this->zbxTestWaitUntilElementPresent(WebDriverBy::xpath('//table[@class="list-table"][not(@id="'.$tabel_id.'")]'));
			$this->zbxTestWaitForPageToLoad();
		}

		if (array_key_exists('result', $data)) {
			foreach ($data['result'] as $result) {
				$this->zbxTestWaitUntilElementPresent(WebDriverBy::xpath('//tbody//td[2]//a[text()="'.$result.'"]'));
				$this->zbxTestAssertElementPresentXpath('//tbody//td[2]//a[text()="'.$result.'"]');
			}
		}
		else {
			$this->zbxTestWaitUntilElementVisible(WebDriverBy::xpath('//tr[@class="nothing-to-show"]'));
			$this->zbxTestAssertElementText('//tr[@class="nothing-to-show"]/td', 'No data found.');
		}
	}
}