<?php declare(strict_types = 0);
/*
** 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/>.
**/


/**
 * Class containing information about system settings.
 */
final class CSettingsSchema {

	public const DB_FIELD_TYPES = [
		/*
		 * Mismatch with TEXT column type intentional. Since fields configurable by the API don't contain long values,
		 * they are validated as CHARs and length is checked.
		 */
		'value_str' => DB::FIELD_TYPE_CHAR,
		'value_int' => DB::FIELD_TYPE_INT,
		'value_usrgrpid' => DB::FIELD_TYPE_ID,
		'value_hostgroupid' => DB::FIELD_TYPE_ID,
		'value_userdirectoryid' => DB::FIELD_TYPE_ID,
		'value_mfaid' => DB::FIELD_TYPE_ID
	];

	public const PARAMETERS = [
		'alert_usrgrpid' => [
			'column' => 'value_usrgrpid'
		],
		'auditlog_enabled' => [
			'column' => 'value_int',
			'default' => 1
		],
		'auditlog_mode' => [
			'column' => 'value_int',
			'default' => 1
		],
		'authentication_type' => [
			'column' => 'value_int',
			'default' => 0
		],
		'autoreg_tls_accept' => [
			'column' => 'value_int',
			'default' => 1
		],
		'blink_period' => [
			'column' => 'value_str',
			'default' => '2m',
			'length' => 32
		],
		'compress_older' => [
			'column' => 'value_str',
			'default' => '7d',
			'length' => 32
		],
		'compression_status' => [
			'column' => 'value_int',
			'default' => 0
		],
		'connect_timeout' => [
			'column' => 'value_str',
			'default' => '3s',
			'length' => 32
		],
		'custom_color' => [
			'column' => 'value_int',
			'default' => 0
		],
		'db_extension' => [
			'column' => 'value_str',
			'default' => '',
			'length' => 32
		],
		'dbversion_status' => [
			'column' => 'value_str',
			'default' => '',
			'length' => 65
		],
		'default_inventory_mode' => [
			'column' => 'value_int',
			'default' => HOST_INVENTORY_DISABLED
		],
		'default_lang' => [
			'column' => 'value_str',
			'default' => 'en_US',
			'length' => 5
		],
		'default_theme' => [
			'column' => 'value_str',
			'default' => 'blue-theme',
			'length' => 128
		],
		'default_timezone' => [
			'column' => 'value_str',
			'default' => 'system',
			'length' => 50
		],
		'disabled_usrgrpid' => [
			'column' => 'value_usrgrpid'
		],
		'discovery_groupid' => [
			'column' => 'value_hostgroupid'
		],
		'geomaps_attribution' => [
			'column' => 'value_str',
			'default' => '',
			'length' => 1024
		],
		'geomaps_max_zoom' => [
			'column' => 'value_int',
			'default' => 0
		],
		'geomaps_tile_provider' => [
			'column' => 'value_str',
			'default' => '',
			'length' => 255
		],
		'geomaps_tile_url' => [
			'column' => 'value_str',
			'default' => '',
			'length' => 2048
		],
		'ha_failover_delay' => [
			'column' => 'value_str',
			'default' => '1m',
			'length' => 32
		],
		'history_period' => [
			'column' => 'value_str',
			'default' => '24h',
			'length' => 32
		],
		'hk_audit_mode' => [
			'column' => 'value_int',
			'default' => 1
		],
		'hk_audit' => [
			'column' => 'value_str',
			'default' => '31d',
			'length' => 32
		],
		'hk_events_autoreg' => [
			'column' => 'value_str',
			'default' => '1d',
			'length' => 32
		],
		'hk_events_discovery' => [
			'column' => 'value_str',
			'default' => '1d',
			'length' => 32
		],
		'hk_events_internal' => [
			'column' => 'value_str',
			'default' => '1d',
			'length' => 32
		],
		'hk_events_mode' => [
			'column' => 'value_int',
			'default' => 1
		],
		'hk_events_service' => [
			'column' => 'value_str',
			'default' => '1d',
			'length' => 32
		],
		'hk_events_trigger' => [
			'column' => 'value_str',
			'default' => '365d',
			'length' => 32
		],
		'hk_history_global' => [
			'column' => 'value_int',
			'default' => 0
		],
		'hk_history_mode' => [
			'column' => 'value_int',
			'default' => 1
		],
		'hk_history' => [
			'column' => 'value_str',
			'default' => '31d',
			'length' => 32
		],
		'hk_services_mode' => [
			'column' => 'value_int',
			'default' => 1
		],
		'hk_services' => [
			'column' => 'value_str',
			'default' => '365d',
			'length' => 32
		],
		'hk_sessions_mode' => [
			'column' => 'value_int',
			'default' => 1
		],
		'hk_sessions' => [
			'column' => 'value_str',
			'default' => '365d',
			'length' => 32
		],
		'hk_trends_global' => [
			'column' => 'value_int',
			'default' => 0
		],
		'hk_trends_mode' => [
			'column' => 'value_int',
			'default' => 1
		],
		'hk_trends' => [
			'column' => 'value_str',
			'default' => '365d',
			'length' => 32
		],
		'http_auth_enabled' => [
			'column' => 'value_int',
			'default' => 0
		],
		'http_case_sensitive' => [
			'column' => 'value_int',
			'default' => 1
		],
		'http_login_form' => [
			'column' => 'value_int',
			'default' => 0
		],
		'http_strip_domains' => [
			'column' => 'value_str',
			'default' => '',
			'length' => 2048
		],
		'iframe_sandboxing_enabled' => [
			'column' => 'value_int',
			'default' => 1
		],
		'iframe_sandboxing_exceptions' => [
			'column' => 'value_str',
			'default' => '',
			'length' => 255
		],
		'instanceid' => [
			'column' => 'value_str',
			'default' => '',
			'length' => 32
		],
		'item_test_timeout' => [
			'column' => 'value_str',
			'default' => '60s',
			'length' => 32
		],
		'jit_provision_interval' => [
			'column' => 'value_str',
			'default' => '1h',
			'length' => 32
		],
		'ldap_auth_enabled' => [
			'column' => 'value_int',
			'default' => 0
		],
		'ldap_case_sensitive' => [
			'column' => 'value_int',
			'default' => 1
		],
		'ldap_jit_status' => [
			'column' => 'value_int',
			'default' => 0
		],
		'ldap_userdirectoryid' => [
			'column' => 'value_userdirectoryid'
		],
		'login_attempts' => [
			'column' => 'value_int',
			'default' => 5
		],
		'login_block' => [
			'column' => 'value_str',
			'default' => '30s',
			'length' => 32
		],
		'max_in_table' => [
			'column' => 'value_int',
			'default' => 50
		],
		'max_overview_table_size' => [
			'column' => 'value_int',
			'default' => 50
		],
		'max_period' => [
			'column' => 'value_str',
			'default' => '2y',
			'length' => 32
		],
		'media_type_test_timeout' => [
			'column' => 'value_str',
			'default' => '65s',
			'length' => 32
		],
		'mfa_status' => [
			'column' => 'value_int',
			'default' => 0
		],
		'mfaid' => [
			'column' => 'value_mfaid'
		],
		'ok_ack_color' => [
			'column' => 'value_str',
			'default' => '009900',
			'length' => 6
		],
		'ok_ack_style' => [
			'column' => 'value_int',
			'default' => 1
		],
		'ok_period' => [
			'column' => 'value_str',
			'default' => '5m',
			'length' => 32
		],
		'ok_unack_color' => [
			'column' => 'value_str',
			'default' => '009900',
			'length' => 6
		],
		'ok_unack_style' => [
			'column' => 'value_int',
			'default' => 1
		],
		'passwd_check_rules' => [
			'column' => 'value_int',
			'default' => 8
		],
		'passwd_min_length' => [
			'column' => 'value_int',
			'default' => 8
		],
		'period_default' => [
			'column' => 'value_str',
			'default' => '1h',
			'length' => 32
		],
		'problem_ack_color' => [
			'column' => 'value_str',
			'default' => 'CC0000',
			'length' => 6
		],
		'problem_ack_style' => [
			'column' => 'value_int',
			'default' => 1
		],
		'problem_unack_color' => [
			'column' => 'value_str',
			'default' => 'CC0000',
			'length' => 6
		],
		'problem_unack_style' => [
			'column' => 'value_int',
			'default' => 1
		],
		'proxy_secrets_provider' => [
			'column' => 'value_int',
			'default' => 0
		],
		'report_test_timeout' => [
			'column' => 'value_str',
			'default' => '60s',
			'length' => 32
		],
		'saml_auth_enabled' => [
			'column' => 'value_int',
			'default' => 0
		],
		'saml_case_sensitive' => [
			'column' => 'value_int',
			'default' => 0
		],
		'saml_jit_status' => [
			'column' => 'value_int',
			'default' => 0
		],
		'script_timeout' => [
			'column' => 'value_str',
			'default' => '60s',
			'length' => 32
		],
		'search_limit' => [
			'column' => 'value_int',
			'default' => 1000
		],
		'server_check_interval' => [
			'column' => 'value_int',
			'default' => 10
		],
		'server_status' => [
			'column' => 'value_str',
			'default' => '',
			'length' => 65535
		],
		'session_key' => [
			'column' => 'value_str',
			'default' => '',
			'length' => 32
		],
		'severity_color_0' => [
			'column' => 'value_str',
			'default' => '97AAB3',
			'length' => 6
		],
		'severity_color_1' => [
			'column' => 'value_str',
			'default' => '7499FF',
			'length' => 6
		],
		'severity_color_2' => [
			'column' => 'value_str',
			'default' => 'FFC859',
			'length' => 6
		],
		'severity_color_3' => [
			'column' => 'value_str',
			'default' => 'FFA059',
			'length' => 6
		],
		'severity_color_4' => [
			'column' => 'value_str',
			'default' => 'E97659',
			'length' => 6
		],
		'severity_color_5' => [
			'column' => 'value_str',
			'default' => 'E45959',
			'length' => 6
		],
		'severity_name_0' => [
			'column' => 'value_str',
			'default' => 'Not classified',
			'length' => 32
		],
		'severity_name_1' => [
			'column' => 'value_str',
			'default' => 'Information',
			'length' => 32
		],
		'severity_name_2' => [
			'column' => 'value_str',
			'default' => 'Warning',
			'length' => 32
		],
		'severity_name_3' => [
			'column' => 'value_str',
			'default' => 'Average',
			'length' => 32
		],
		'severity_name_4' => [
			'column' => 'value_str',
			'default' => 'High',
			'length' => 32
		],
		'severity_name_5' => [
			'column' => 'value_str',
			'default' => 'Disaster',
			'length' => 32
		],
		'show_technical_errors' => [
			'column' => 'value_int',
			'default' => 0
		],
		'snmptrap_logging' => [
			'column' => 'value_int',
			'default' => 1
		],
		'socket_timeout' => [
			'column' => 'value_str',
			'default' => '3s',
			'length' => 32
		],
		'software_update_check_data' => [
			'column' => 'value_str',
			'default' => '',
			'length' => 65535
		],
		'software_update_checkid' => [
			'column' => 'value_str',
			'default' => '',
			'length' => 32
		],
		'timeout_browser' => [
			'column' => 'value_str',
			'default' => '60s',
			'length' => 255
		],
		'timeout_db_monitor' => [
			'column' => 'value_str',
			'default' => '3s',
			'length' => 255
		],
		'timeout_external_check' => [
			'column' => 'value_str',
			'default' => '3s',
			'length' => 255
		],
		'timeout_http_agent' => [
			'column' => 'value_str',
			'default' => '3s',
			'length' => 255
		],
		'timeout_script' => [
			'column' => 'value_str',
			'default' => '3s',
			'length' => 255
		],
		'timeout_simple_check' => [
			'column' => 'value_str',
			'default' => '3s',
			'length' => 255
		],
		'timeout_snmp_agent' => [
			'column' => 'value_str',
			'default' => '3s',
			'length' => 255
		],
		'timeout_ssh_agent' => [
			'column' => 'value_str',
			'default' => '3s',
			'length' => 255
		],
		'timeout_telnet_agent' => [
			'column' => 'value_str',
			'default' => '3s',
			'length' => 255
		],
		'timeout_zabbix_agent' => [
			'column' => 'value_str',
			'default' => '3s',
			'length' => 255
		],
		'uri_valid_schemes' => [
			'column' => 'value_str',
			'default' => 'http,https,ftp,file,mailto,tel,ssh',
			'length' => 255
		],
		'url' => [
			'column' => 'value_str',
			'default' => '',
			'length' => 2048
		],
		'validate_uri_schemes' => [
			'column' => 'value_int',
			'default' => 1
		],
		'vault_provider' => [
			'column' => 'value_int',
			'default' => 0
		],
		'work_period' => [
			'column' => 'value_str',
			'default' => '1-5,09:00-18:00',
			'length' => 255
		],
		'x_frame_options' => [
			'column' => 'value_str',
			'default' => 'SAMEORIGIN',
			'length' => 255
		]
	];

	public static function getFieldLength(string $parameter): int {
		return self::PARAMETERS[$parameter]['length'];
	}

	public static function getDefault(string $parameter) {
		return self::PARAMETERS[$parameter]['default'];
	}

	public static function getDbType(string $parameter): int {
		return self::DB_FIELD_TYPES[self::PARAMETERS[$parameter]['column']];
	}
}