<?php
/*
** Copyright (C) 2001-2024 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 CPartial $this
 */
?>

<script>
	var row_num = 0;
	var userids = new Set();
	var usrgrpids = new Set();
	var allowed_edit = <?= json_encode($data['allowed_edit']) ?>;

	var ReportSubscription = class {

		constructor(data, edit = null) {
			this.data = data;

			this.row = document.createElement('tr');
			this.row.appendChild(this.createRecipientCell());
			this.row.appendChild(this.createCreatorCell());
			this.row.appendChild(this.createStatusCell());
			this.row.appendChild(this.createActionCell());

			this.render(edit);
			row_num++;
		}

		render(edit) {
			if (edit instanceof Element) {
				if (this.data.recipientid != this.data.old_recipientid) {
					if (this.data.recipient_type == <?= ZBX_REPORT_RECIPIENT_TYPE_USER ?>) {
						userids
							.add(this.data.recipientid)
							.delete(this.data.old_recipientid);
					}
					else {
						usrgrpids
							.add(this.data.recipientid)
							.delete(this.data.old_recipientid);
					}
				}

				return edit.replaceWith(this.row);
			}

			return document
				.querySelector('#subscriptions-table tbody')
				.append(this.row);
		}

		createRecipientCell() {
			const cell = document.createElement('td');
			const icon = document.createElement('span');
			let recipient;

			if (this.data.recipient_type == <?= ZBX_REPORT_RECIPIENT_TYPE_USER ?>) {
				icon.classList.add('<?= ZBX_STYLE_ICON ?>', '<?= ZBX_ICON_USER_FILLED_SMALL ?>');
				icon.setAttribute('title', <?= json_encode(_('User')) ?>);
				userids.add(this.data.recipientid);
			}
			else {
				icon.classList.add('<?= ZBX_STYLE_ICON ?>', '<?= ZBX_ICON_USERS_FILLED_SMALL ?>');
				icon.setAttribute('title', <?= json_encode(_('User group')) ?>);
				usrgrpids.add(this.data.recipientid);
			}

			if (allowed_edit) {
				recipient = document.createElement('a');
				recipient.href = 'javascript:void(0);';
				recipient.addEventListener('click', (event) => {
					const parameters = Object.assign(this.data, {
						edit: 1,
						old_recipientid: this.data.recipientid
					});

					if (this.data.recipient_type == <?= ZBX_REPORT_RECIPIENT_TYPE_USER ?>) {
						parameters.exclude = recipient.parentNode.parentNode.querySelector('[name*=exclude]').value;
						parameters.userids = Array.from(userids);
					}
					else {
						parameters.usrgrpids = Array.from(usrgrpids);
					}

					PopUp('popup.scheduledreport.subscription.edit', parameters,
						{dialogue_class: 'modal-popup-medium', trigger_element: event.target}
					);
				});
			}
			else {
				recipient = document.createElement('span');

				if (this.data.recipient_inaccessible) {
					recipient.classList.add('<?= ZBX_STYLE_GREY ?>');
				}
			}

			recipient.textContent = this.data.recipient_name;
			recipient.setAttribute('title', this.data.recipient_name);

			cell.appendChild(icon);
			cell.appendChild(recipient);
			cell.appendChild(this.createHiddenInput('[recipientid]', this.data.recipientid));
			cell.appendChild(this.createHiddenInput('[recipient_type]', this.data.recipient_type));
			cell.appendChild(this.createHiddenInput('[recipient_name]', this.data.recipient_name));
			cell.appendChild(this.createHiddenInput('[recipient_inaccessible]', this.data.recipient_inaccessible));

			return cell;
		}

		createCreatorCell() {
			const cell = document.createElement('td');
			const span = document.createElement('span');

			span.textContent = this.data.creator_name;
			span.setAttribute('title', this.data.creator_name);

			if (this.data.creator_type == <?= ZBX_REPORT_CREATOR_TYPE_RECIPIENT ?> || this.data.creator_inaccessible) {
				span.classList.add('<?= ZBX_STYLE_GREY ?>');
			}

			cell.appendChild(span);
			cell.appendChild(this.createHiddenInput('[creatorid]', this.data.creatorid));
			cell.appendChild(this.createHiddenInput('[creator_type]', this.data.creator_type));
			cell.appendChild(this.createHiddenInput('[creator_name]', this.data.creator_name));
			cell.appendChild(this.createHiddenInput('[creator_inaccessible]', this.data.creator_inaccessible));

			return cell;
		}

		createStatusCell() {
			const cell = document.createElement('td');

			if (this.data.recipient_type == <?= ZBX_REPORT_RECIPIENT_TYPE_USER_GROUP ?>) {
				return cell;
			}

			let status;

			if (allowed_edit) {
				status = document.createElement('a');
				status.href = 'javascript:void(0);';
				status.classList.add('<?= ZBX_STYLE_LINK_ACTION ?>');
				status.addEventListener('click', (event) => {
					const input = status.parentNode.querySelector('[name*=exclude]');

					if (input.value == <?= ZBX_REPORT_EXCLUDE_USER_TRUE ?>) {
						status.textContent = <?= json_encode(_('Include')) ?>;
						status.classList.replace('<?= ZBX_STYLE_RED ?>', '<?= ZBX_STYLE_GREEN ?>');
						input.value = <?= ZBX_REPORT_EXCLUDE_USER_FALSE ?>
					}
					else {
						status.textContent = <?= json_encode(_('Exclude')) ?>;
						status.classList.replace('<?= ZBX_STYLE_GREEN ?>', '<?= ZBX_STYLE_RED ?>');
						input.value = <?= ZBX_REPORT_EXCLUDE_USER_TRUE ?>
					}
				});
			}
			else {
				status = document.createElement('span');
			}

			if (this.data.exclude == <?= ZBX_REPORT_EXCLUDE_USER_FALSE ?>) {
				status.textContent = <?= json_encode(_('Include')) ?>;
				status.classList.add('<?= ZBX_STYLE_GREEN ?>');
			}
			else {
				status.textContent = <?= json_encode(_('Exclude')) ?>;
				status.classList.add('<?= ZBX_STYLE_RED ?>');
			}

			cell.appendChild(status);
			cell.appendChild(this.createHiddenInput('[exclude]', this.data.exclude));

			return cell;
		}

		createActionCell() {
			const cell = document.createElement('td');
			const btn = document.createElement('button');

			btn.type = 'button';
			btn.classList.add('<?= ZBX_STYLE_BTN_LINK ?>');
			btn.textContent = <?= json_encode(_('Remove')) ?>;

			if (allowed_edit) {
				btn.addEventListener('click', () => {
					if (this.data.recipient_type == <?= ZBX_REPORT_RECIPIENT_TYPE_USER ?>) {
						userids.delete(this.data.recipientid);
					}
					else {
						usrgrpids.delete(this.data.recipientid);
					}

					this.row.remove();
				});
			}
			else {
				btn.setAttribute('disabled', 'disabled');
			}

			cell.appendChild(btn);

			return cell;
		}

		createHiddenInput(name, value) {
			const input = document.createElement('input');

			input.type = 'hidden';
			input.name = `subscriptions[${row_num}]${name}`;
			input.value = value;

			return input;
		}

		static initializeNewUserPopup() {
			const elem = document.querySelector('#subscriptions-table .js-add-user:not(:disabled)');

			if (!elem) {
				return;
			}

			elem.addEventListener('click', (event) => {
				PopUp('popup.scheduledreport.subscription.edit', {
					recipient_type: <?= ZBX_REPORT_RECIPIENT_TYPE_USER ?>,
					userids: Array.from(userids)
				}, {dialogue_class: 'modal-popup-medium', trigger_element: event.target});
			});
		}

		static initializeNewUserGroupPopup() {
			const elem = document.querySelector('#subscriptions-table .js-add-user-group:not(:disabled)');

			if (!elem) {
				return;
			}

			elem.addEventListener('click', (event) => {
				PopUp('popup.scheduledreport.subscription.edit', {
					recipient_type: <?= ZBX_REPORT_RECIPIENT_TYPE_USER_GROUP ?>,
					usrgrpids: Array.from(usrgrpids)
				}, {dialogue_class: 'modal-popup-medium', trigger_element: event.target});
			});
		}
	}

	var subscriptions = <?= json_encode(array_values($data['subscriptions'])) ?>;

	subscriptions.forEach((subscription) => new ReportSubscription(subscription));

	if (allowed_edit) {
		ReportSubscription.initializeNewUserPopup();
		ReportSubscription.initializeNewUserGroupPopup();
	}
</script>
