<?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/CLegacyWebTest.php';
require_once dirname(__FILE__).'/../behaviors/CMessageBehavior.php';

/**
 * Test the creation of inheritance of new objects on a previously linked template.
 *
 * @backup graphs
 */
class testInheritanceGraph extends CLegacyWebTest {

	/**
	 * Attach MessageBehavior to the test.
	 *
	 * @return array
	 */
	public function getBehaviors() {
		return [CMessageBehavior::class];
	}

	private $templateid = 15000;	// 'Inheritance test template'
	private $template = 'Inheritance test template';

	private $hostid = 15001;		// 'Template inheritance test host'
	private $host = 'Template inheritance test host';

	// return list of graphs from a template
	public static function update() {
		return CDBHelper::getDataProvider(
			'SELECT g.graphid'.
			' FROM graphs g'.
			' WHERE EXISTS ('.
				'SELECT NULL'.
				' FROM graphs_items gi,items i'.
				' WHERE g.graphid=gi.graphid'.
					' AND gi.itemid=i.itemid'.
					' AND i.hostid=15000'.	//	$this->templateid.
					' AND i.flags=0'.
				')'.
				' AND g.flags=0'
		);
	}

	/**
	 * @dataProvider update
	 */
	public function testInheritanceGraph_SimpleUpdate($data) {
		$sqlGraphs = 'SELECT * FROM graphs ORDER BY graphid';
		$oldHashGraphs = CDBHelper::getHash($sqlGraphs);

		$this->zbxTestLogin('graphs.php?form=update&context=host&graphid='.$data['graphid']);
		$this->zbxTestCheckTitle('Configuration of graphs');
		$this->zbxTestClickWait('update');
		$this->zbxTestWaitUntilMessageTextPresent('msg-good', 'Graph updated');

		$this->assertEquals($oldHashGraphs, CDBHelper::getHash($sqlGraphs));
	}

	// Returns create data
	public static function create() {
		return [
			[
				[
					'expected' => TEST_GOOD,
					'name' => 'testInheritanceGraph5',
					'addItems' => [
						['itemName' => 'testInheritanceItem1'],
						['itemName' => 'testInheritanceItem2'],
						['itemName' => 'testInheritanceItem3'],
						['itemName' => 'testInheritanceItem4']
					]
				]
			],
			[
				[
					'expected' => TEST_BAD,
					'name' => 'testInheritanceGraph4',
					'addItems' => [
						['itemName' => 'testInheritanceItem1']
					],
					'error_msg' => 'Cannot add graph',
					'errors'=> [
						'Graph "testInheritanceGraph4" already exists on the template "Inheritance test template".'
					]
				]
			]
		];
	}

	/**
	 * @dataProvider create
	 */
	public function testInheritanceGraph_SimpleCreate($data) {
		$this->zbxTestLogin('graphs.php?form=Create+graph&context=template&hostid='.$this->templateid);

		$this->zbxTestInputType('name', $data['name']);
		$this->assertEquals($data['name'], $this->zbxTestGetValue("//input[@id='name']"));

		foreach ($data['addItems'] as $item) {
			$this->zbxTestClick('add_item');
			$this->zbxTestLaunchOverlayDialog('Items');
			$this->zbxTestClickLinkTextWait($item['itemName']);
			$this->zbxTestTextPresent($this->template.': '.$item['itemName']);
		}
		$this->query('id:add')->one()->click();

		switch ($data['expected']) {
			case TEST_GOOD:
				$this->assertMessage(TEST_GOOD, 'Graph added');
				$this->zbxTestCheckTitle('Configuration of graphs');
				$this->zbxTestCheckHeader('Graphs');
				$this->zbxTestTextNotPresent('Cannot add graph');
				$filter = $this->query('name:zbx_filter')->asForm()->one();
				$filter->getField('Templates')->clear()->fill($this->template);
				$filter->submit();
				$this->query('link', $data['name'])->one()->waitUntilVisible();
				break;

			case TEST_BAD:
				$this->assertMessage(TEST_BAD, $data['error_msg']);
				$this->zbxTestCheckTitle('Configuration of graphs');
				$this->zbxTestCheckHeader('Graphs');
				$this->zbxTestTextNotPresent('Graph added');
				$this->zbxTestTextPresent($data['errors']);
				break;
		}
	}
}
