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


/**
 * @var CView $this
 */

$this->includeJsFile('administration.proxy.edit.js.php');

$widget = (new CWidget())->setTitle(_('Proxies'));

$tabs = new CTabView();

if ($data['form_refresh'] == 0) {
	$tabs->setSelected(0);
}

$proxyForm = (new CForm())
	->setId('proxy-form')
	->setName('proxy-form')
	->addItem((new CVar('form_refresh', $data['form_refresh'] + 1))->removeId())
	->addVar('proxyid', $data['proxyid'])
	->addVar('tls_accept', $data['tls_accept'])
	->addVar('psk_edit_mode', $data['psk_edit_mode'])
	->setAttribute('aria-labelledby', ZBX_STYLE_PAGE_TITLE);

if (array_key_exists('clone_proxyid', $data)) {
	$proxyForm->addVar('clone_proxyid', $data['clone_proxyid']);
}

$interfaceTable = (new CTable())
	->setHeader([_('IP address'), _('DNS name'), _('Connect to'), _('Port')])
	->addRow([
		(new CTextBox('ip', $data['ip'], false, 64))->setWidth(ZBX_TEXTAREA_INTERFACE_IP_WIDTH),
		(new CTextBox('dns', $data['dns'], false, DB::getFieldLength('interface', 'dns')))
			->setWidth(ZBX_TEXTAREA_INTERFACE_DNS_WIDTH),
		(new CRadioButtonList('useip', (int) $data['useip']))
			->addValue('IP', INTERFACE_USE_IP)
			->addValue('DNS', INTERFACE_USE_DNS)
			->setModern(true),
		(new CTextBox('port', $data['port'], false, 64))
			->setWidth(ZBX_TEXTAREA_INTERFACE_PORT_WIDTH)
			->setAriaRequired()
	]);

$proxy_form_list = (new CFormList('proxyFormList'))
	->addRow((new CLabel(_('Proxy name'), 'host'))->setAsteriskMark(),
		(new CTextBox('host', $data['host'], false, 128))
			->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
			->setAttribute('autofocus', 'autofocus')
			->setAriaRequired()
	)
	->addRow((new CLabel(_('Proxy mode'), 'status')),
		(new CRadioButtonList('status', (int) $data['status']))
			->addValue(_('Active'), HOST_STATUS_PROXY_ACTIVE)
			->addValue(_('Passive'), HOST_STATUS_PROXY_PASSIVE)
			->setModern(true)
	)
	->addRow((new CLabel(_('Interface'), 'proxy_interface'))->setAsteriskMark(),
		(new CDiv($interfaceTable))
			->addClass(ZBX_STYLE_TABLE_FORMS_SEPARATOR)
			->setId('proxy_interface')
	)
	->addRow(_('Proxy address'),
		(new CTextBox('proxy_address', $data['proxy_address'], false, 255))->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
	)
	->addRow(_('Description'),
		(new CTextArea('description', $data['description']))
			->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
			->setMaxlength(DB::getFieldLength('hosts', 'description'))
	);

// append tabs to form
$proxyTab = (new CTabView())->addTab('proxyTab', _('Proxy'), $proxy_form_list);

// Encryption form list.
$encryption_form_list = (new CFormList('encryption'))
	->addRow(_('Connections to proxy'),
		(new CRadioButtonList('tls_connect', (int) $data['tls_connect']))
			->addValue(_('No encryption'), HOST_ENCRYPTION_NONE)
			->addValue(_('PSK'), HOST_ENCRYPTION_PSK)
			->addValue(_('Certificate'), HOST_ENCRYPTION_CERTIFICATE)
			->setModern(true)
	)
	->addRow(_('Connections from proxy'),
		(new CList())
			->addClass(ZBX_STYLE_LIST_CHECK_RADIO)
			->addItem((new CCheckBox('tls_in_none'))->setLabel(_('No encryption')))
			->addItem((new CCheckBox('tls_in_psk'))->setLabel(_('PSK')))
			->addItem((new CCheckBox('tls_in_cert'))->setLabel(_('Certificate')))
	);

if ($data['psk_edit_mode']) {
	$encryption_form_list
		->addRow((new CLabel(_('PSK identity'), 'tls_psk_identity'))->setAsteriskMark(),
			(new CTextBox('tls_psk_identity', $data['tls_psk_identity'], false, 128))
				->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
				->setAriaRequired()
		)
		->addRow((new CLabel(_('PSK'), 'tls_psk'))->setAsteriskMark(),
			(new CTextBox('tls_psk', $data['tls_psk'], false, 512))
				->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
				->setAriaRequired()
				->disableAutocomplete()
		);
}
else {
	$encryption_form_list
		->addRow(
			(new CLabel(_('PSK')))->setAsteriskMark(),
			(new CSimpleButton(_('Change PSK')))
				->setId('change_psk')
				->addClass(ZBX_STYLE_BTN_GREY),
			null,
			'tls_psk'
		);
}

$encryption_form_list
	->addRow(_('Issuer'),
		(new CTextBox('tls_issuer', $data['tls_issuer'], false, 1024))->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
	)
	->addRow(_x('Subject', 'encryption certificate'),
		(new CTextBox('tls_subject', $data['tls_subject'], false, 1024))->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
	);

$tabs->addTab('proxyTab', _('Proxy'), $proxy_form_list);
$tabs->addTab('encryptionTab', _('Encryption'), $encryption_form_list, TAB_INDICATOR_ENCRYPTION);

// append buttons to form
$cancelButton = (new CRedirectButton(_('Cancel'), (new CUrl('zabbix.php'))
	->setArgument('action', 'proxy.list')
	->setArgument('page', CPagerHelper::loadPage('proxy.list', null))
))->setId('cancel');

if ($data['proxyid'] == 0) {
	$tabs->setFooter(makeFormFooter(
		new CSubmitButton(_('Add'), 'action', 'proxy.create'),
		[$cancelButton]
	));
}
else {
	$tabs->setFooter(makeFormFooter(
		new CSubmitButton(_('Update'), 'action', 'proxy.update'),
		[
			(new CSimpleButton(_('Clone')))->setId('clone'),
			new CRedirectButton(_('Delete'),
				'zabbix.php?action=proxy.delete&sid='.$data['sid'].'&proxyids[]='.$data['proxyid'],
				_('Delete proxy?')
			),
			$cancelButton
		]
	));
}

$proxyForm->addItem($tabs);
$widget->addItem($proxyForm)->show();