<?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/>.
**/


/**
 * @var CView $this
 */
?>

<script type="text/x-jquery-tmpl" id="row-expression-tmpl">
	<?= (new CRow([
			(new CSelect('expressions[#{rowNum}][expression_type]'))
				->addClass('js-expression-type-select')
				->setId('expressions_#{rowNum}_expression_type')
				->addOptions(CSelect::createOptionsFromArray(CRegexHelper::expression_type2str())),
			(new CTextBox('expressions[#{rowNum}][expression]', '', false, 255))
				->setWidth(ZBX_TEXTAREA_MEDIUM_WIDTH)
				->setAriaRequired(),
			(new CSelect('expressions[#{rowNum}][exp_delimiter]'))
				->addOptions(CSelect::createOptionsFromArray(CRegexHelper::expressionDelimiters()))
				->setId('expressions_#{rowNum}_exp_delimiter')
				->addClass('js-expression-delimiter-select')
				->setDisabled(true)
				->addStyle('display: none;'),
			new CCheckBox('expressions[#{rowNum}][case_sensitive]'),
			(new CCol(
				(new CButton('expressions[#{rowNum}][remove]', _('Remove')))
					->addClass(ZBX_STYLE_BTN_LINK)
					->addClass('element-table-remove')
			))->addClass(ZBX_STYLE_NOWRAP)
		]))
			->addClass('form_row')
			->setAttribute('data-index', '#{rowNum}')
			->toString()
	?>
</script>

<script type="text/x-jquery-tmpl" id="test-table-row-tmpl">
	<?= (new CRow([
			'#{type}', '#{expression}', (new CSpan('#{result}'))->addClass('#{resultClass}')
		]))
			->addClass('test_row')
			->toString()
	?>
</script>

<script type="text/x-jquery-tmpl" id="test-combined-table-row-tmpl">
	<?= (new CRow([
			(new CCol(_('Combined result')))->setColspan(2), (new CSpan('#{result}'))->addClass('#{resultClass}')
		]))
			->addClass('test_row')
			->toString()
	?>
</script>

<script>
	(function($) {
		/**
		 * Object to manage expression related GUI elements.
		 * @type {Object}
		 */
		window.zabbixRegExp = {

			/**
			 * Template for expression row of testing results table.
			 * @type {String}
			 */
			testTableRowTpl: new Template($('#test-table-row-tmpl').html()),

			/**
			 * Template for combined result row in testing results table.
			 * @type {String}
			 */
			testCombinedTableRowTpl: new Template($('#test-combined-table-row-tmpl').html()),

			/**
			 * Send all expressions data to server with test string.
			 *
			 * @param {string} string Test string to test expression against
			 *
			 * @return {jqXHR}
			 */
			testExpressions: function(string) {
				var ajaxData = {
					testString: string,
					expressions: {}
				};

				$('#testResultTable').css({opacity: 0.5});

				$('#tbl_expr .form_row').each(function() {
					var index = $(this).data('index');

					ajaxData.expressions[index] = {
						expression : $('#expressions_' + index + '_expression').val(),
						expression_type : $('#expressions_' + index + '_expression_type').val(),
						exp_delimiter : $('#expressions_' + index + '_exp_delimiter').val(),
						case_sensitive : $('#expressions_' + index + '_case_sensitive').is(':checked') ? '1' : '0'
					}
				});

				var url = new Curl('zabbix.php');
				url.setArgument('action', 'regex.test');

				return $.post(
					url.getUrl(),
					{ajaxdata: ajaxData},
					$.proxy(this.showTestResults, this),
					'json'
				);
			},

			/**
			 * Update test results table with data received form server.
			 *
			 * @param {Object} response ajax response
			 */
			showTestResults: function(response) {
				var tplData,
					hasErrors,
					obj = this,
					$expressions = $('#tbl_expr .form_row'),
					expression_type_str;

				$('#testResultTable .test_row').remove();
				hasErrors = ($expressions.length == 0);

				$expressions.each(function() {
					var index = $(this).data('index'),
						expr_result = response.data.expressions[index],
						result;

					if (response.data.errors[index]) {
						hasErrors = true;
						result = response.data.errors[index];
					}
					else {
						result = expr_result ? <?= json_encode(_('TRUE')) ?> : <?= json_encode(_('FALSE')) ?>;
					}

					switch ($('#expressions_' + index + '_expression_type').val()) {
						case '<?= EXPRESSION_TYPE_INCLUDED ?>':
							expression_type_str = <?= json_encode(_('Character string included')) ?>;
							break;

						case '<?= EXPRESSION_TYPE_ANY_INCLUDED ?>':
							expression_type_str = <?= json_encode(_('Any character string included')) ?>;
							break;

						case '<?= EXPRESSION_TYPE_NOT_INCLUDED ?>':
							expression_type_str = <?= json_encode(_('Character string not included')) ?>;
							break;

						case '<?= EXPRESSION_TYPE_TRUE ?>':
							expression_type_str = <?= json_encode(_('Result is TRUE')) ?>;
							break;

						case '<?= EXPRESSION_TYPE_FALSE ?>':
							expression_type_str = <?= json_encode(_('Result is FALSE')) ?>;
							break;

						default:
							expression_type_str = '';
					}

					$('#testResultTable').append(obj.testTableRowTpl.evaluate({
						expression: $('#expressions_' + index + '_expression').val(),
						type: expression_type_str,
						result: result,
						resultClass: expr_result ? '<?= ZBX_STYLE_GREEN ?>' : '<?= ZBX_STYLE_RED ?>'
					}));
				});

				if (hasErrors) {
					tplData = {
						resultClass: '<?= ZBX_STYLE_RED ?>',
						result: <?= json_encode(_('UNKNOWN')) ?>
					};
				}
				else {
					tplData = {
						resultClass: response.data.final ? '<?= ZBX_STYLE_GREEN ?>' : '<?= ZBX_STYLE_RED ?>',
						result: response.data.final ? <?= json_encode(_('TRUE')) ?> : <?= json_encode(_('FALSE')) ?>
					};
				}

				$('#testResultTable').append(this.testCombinedTableRowTpl.evaluate(tplData));
				$('#testResultTable').css({opacity: 1});
			}
		};
	}(jQuery));

	jQuery(function($) {
		var $form = $('form#regex'),
			$test_string = $('#test_string');
			$test_btn = $('#testExpression');

		$form.on('submit', function() {
			$form.trimValues(['#name']);
		});

		$('#testExpression, #tab_test').click(function() {
			$test_btn.addClass('is-loading');
			$test_btn.prop('disabled', true);
			$test_string.prop('disabled', true);

			zabbixRegExp
				.testExpressions($test_string.val())
				.always(function() {
					$test_btn.removeClass('is-loading');
					$test_btn.prop('disabled', false);
					$test_string.prop('disabled', false);
				});
		});

		$('#tbl_expr')
			.dynamicRows({template: '#row-expression-tmpl', allow_empty: true})
			.on('change', '.js-expression-type-select', (e) => {
				$(e.target)
					.closest('[data-index]')
					.find('.js-expression-delimiter-select')
					.prop('disabled', e.target.value !== '<?= EXPRESSION_TYPE_ANY_INCLUDED ?>')
					.toggle(e.target.value === '<?= EXPRESSION_TYPE_ANY_INCLUDED ?>');
			});

		$form.find('#clone').click(function() {
			var url = new Curl('zabbix.php?action=regex.edit');

			$form.serializeArray().forEach(function(field) {
				url.setArgument(field.name, field.value);
			});

			redirect(url.getUrl(), 'post', 'action', undefined, true);
		});
	});
</script>