<?php
/**
 * QrCdr Blueprint class
 *
 * Defines the structure and inputs for tabs and features.
 *
 * @since  1.0.0
 *
 * @category  WordPress_Plugin
 * @package   QrCdr
 * @author    Nicola Franchini
 * @link      https://veno.es
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

if ( ! class_exists( 'QrCdr_Blueprint' ) ) {
	/**
	 * QrCdr_Blueprint class
	 */
	class QrCdr_Blueprint {

		/**
		 * Cache for the features array.
		 *
		 * @var array|null
		 */
		protected $features = null;

		/**
		 * Cache for the tabs
		 *
		 * @var array|null
		 */
		protected $tabs = null;

		/**
		 * Holds an instance of the object
		 *
		 * @var instance
		 */
		protected static $instance = null;

		/**
		 * Returns the running object
		 *
		 * @return QrCdr_Blueprint
		 */
		public static function get_instance() {
			if ( null === self::$instance ) {
				self::$instance = new self();
			}
			return self::$instance;
		}

		/**
		 * Get default tabs with their inputs
		 *
		 * @return array
		 */
		public function get_default_tabs() {
			return array(
				'bitcoin'  => array(
					'label'     => 'Bitcoin',
					'inputs'    => array(
						'btc_account' => array(
							'label'      => __( 'Bitcoin address', 'qrcdr' ),
							'name'       => 'btc_account',
							'type'       => 'text',
							'default'    => '',
							'class'      => '',
							'attributes' => array(
								'required' => true,
							),
						),
						'btc_amount'  => array(
							'label'      => '',
							'name'       => 'btc_amount',
							'type'       => 'text',
							'default'    => '',
							'class'      => '',
							'attributes' => array(
								'required' => true,
							),
						),
						'btc_label'   => array(
							'label'      => __( 'Title', 'qrcdr' ),
							'name'       => 'btc_label',
							'type'       => 'text',
							'default'    => '',
							'class'      => '',
							'attributes' => array(),
						),
						'btc_message' => array(
							'label'      => __( 'Message', 'qrcdr' ),
							'name'       => 'btc_message',
							'type'       => 'textarea',
							'default'    => '',
							'class'      => '',
							'attributes' => array(
								'rows' => '2',
							),
						),
					),
				),
				'email'    => array(
					'label'     => __( 'E-mail', 'qrcdr' ),
					'inputs'    => array(
						'mailto'  => array(
							'label'      => __( 'Send to', 'qrcdr' ),
							'name'       => 'mailto',
							'type'       => 'email',
							'default'    => '',
							'class'      => '',
							'attributes' => array(
								'required' => true,
								'placeholder' => __( 'E-mail', 'qrcdr' ),
							),
						),
						'subject' => array(
							'label'      => __( 'Subject', 'qrcdr' ),
							'name'       => 'subject',
							'type'       => 'text',
							'default'    => '',
							'class'      => '',
							'attributes' => array(
								'required' => true,
							),
						),
						'body'    => array(
							'label'      => __( 'Message', 'qrcdr' ),
							'name'       => 'body',
							'type'       => 'textarea',
							'default'    => '',
							'class'      => 'mb-2',
							'attributes' => array(
								'required' => true,
								'maxlength' => '1000',
							),
						),
					),
				),
				'event'    => array(
					'label'     => __( 'Event', 'qrcdr' ),
					'inputs'    => array(
						'eventtitle'     => array(
							'label'      => __( 'Event title', 'qrcdr' ),
							'name'       => 'eventtitle',
							'type'       => 'text',
							'default'    => '',
							'class'      => '',
							'attributes' => array(
								'required' => true,
							),
						),
						'eventlocation'  => array(
							'label'      => __( 'Event location', 'qrcdr' ),
							'name'       => 'eventlocation',
							'type'       => 'text',
							'default'    => '',
							'class'      => '',
							'attributes' => array(),
						),
						'eventstarttime' => array(
							'label'      => __( 'Start time', 'qrcdr' ),
							'name'       => 'eventstarttime',
							'type'       => 'datepicker',
							'default'    => '',
							'class'      => '',
							'attributes' => array(
								'required' => true,
								'placeholder' => __( 'Select date', 'qrcdr' ),
							),
						),
						'eventendtime'   => array(
							'label'      => __( 'End time', 'qrcdr' ),
							'name'       => 'eventendtime',
							'type'       => 'datepicker',
							'default'    => '',
							'class'      => '',
							'attributes' => array(
								'placeholder' => __( 'Select date', 'qrcdr' ),
							),
						),
						'eventreminder'  => array(
							'label'      => __( 'Reminder', 'qrcdr' ),
							'name'       => 'eventreminder',
							'type'       => 'select',
							'default'    => '',
							'class'      => '',
							'attributes' => array(),
							'options' => array(
								''       => '--',
								'PT0M' => __( 'When the event starts', 'qrcdr' ),
								'-PT5M' => __( '5 Minutes before', 'qrcdr' ),
								'-PT10M' => __( '10 Minutes before', 'qrcdr' ),
								'-PT15M' => __( '15 Minutes before', 'qrcdr' ),
								'-PT30M' => __( '30 Minutes before', 'qrcdr' ),
								'-PT60M' => __( '1 hour before', 'qrcdr' ),
								'-PT12H' => __( '12 hours before', 'qrcdr' ),
								'-P1D'   => __( '1 day before', 'qrcdr' ),
								'-P1W'   => __( '1 week before', 'qrcdr' ),
							),
						),
						'eventlink'      => array(
							'label'      => __( 'Link', 'qrcdr' ),
							'name'       => 'eventlink',
							'type'       => 'text',
							'default'    => '',
							'class'      => '',
							'attributes' => array(
								'placeholder' => 'http://',
							),
						),
						'eventnote'      => array(
							'label'      => __( 'Description', 'qrcdr' ),
							'name'       => 'eventnote',
							'type'       => 'textarea',
							'default'    => '',
							'class'      => 'mb-2',
							'attributes' => array(
								'maxlength' => '500',
								'rows' => '3',
							),
						),
					),
				),
				'link'     => array(
					'label'     => __( 'Link', 'qrcdr' ),
					'inputs'    => array(
						'link' => array(
							'label'      => 'URL',
							'name'       => 'link',
							'type'       => 'text',
							'default'    => '',
							'class'      => '',
							'attributes' => array(
								'placeholder' => 'http://',
								'required'    => true,
							),
						),
					),
				),
				'location' => array(
					'label'     => __( 'Location', 'qrcdr' ),
					'inputs'    => array(
						'lat'            => array(
							'name'       => 'lat',
							'type'       => 'text',
							'default'    => '',
							'class'      => 'qrcdr-get-lat setinput-latlon no-validate',
							'attributes' => array(
								'autocomplete' => 'off',
								'placeholder' => __( 'Latitude', 'qrcdr' ),
							),
						),
						'lng'            => array(
							'name'       => 'lng',
							'type'       => 'text',
							'default'    => '',
							'class'      => 'qrcdr-get-lon setinput-latlon no-validate',
							'attributes' => array(
								'autocomplete' => 'off',
								'placeholder' => __( 'Longitude', 'qrcdr' ),
							),
						),
					),
				),
				'paypal'   => array(
					'label'     => 'PayPal',
					'inputs'    => array(
						'pp_type'     => array(
							'label'      => __( 'Type', 'qrcdr' ),
							'name'       => 'pp_type',
							'type'       => 'select',
							'default'    => '_donations',
							'class'      => '',
							'attributes' => array(),
							'options' => array(
								'_donations' => __( 'Donations', 'qrcdr' ),
								'_xclick'    => __( 'Buy Now', 'qrcdr' ),
								'_cart'      => __( 'Add to Cart', 'qrcdr' ),
							),
						),
						'pp_email'    => array(
							'label'      => __( 'E-mail', 'qrcdr' ),
							'name'       => 'pp_email',
							'type'       => 'email',
							'default'    => '',
							'class'      => '',
							'attributes' => array(
								'required' => true,
							),
						),
						'pp_name'     => array(
							'label'      => __( 'Item name', 'qrcdr' ),
							'name'       => 'pp_name',
							'type'       => 'text',
							'default'    => '',
							'class'      => '',
							'attributes' => array(
								'required' => true,
							),
						),
						'pp_id'     => array(
							'label'      => __( 'Item ID', 'qrcdr' ),
							'name'       => 'pp_id',
							'type'       => 'text',
							'default'    => '',
							'class'      => '',
							'attributes' => array(),
						),
						'pp_price'    => array(
							'label'      => __( 'Amount', 'qrcdr' ),
							'name'       => 'pp_price',
							'type'       => 'text',
							'default'    => '',
							'class'      => '',
							'attributes' => array(
								'placeholder' => '0.00',
							),
						),
						'pp_currency' => array(
							'label'      => __( 'Currency', 'qrcdr' ),
							'name'       => 'pp_currency',
							'type'       => 'select',
							'default'    => 'USD',
							'class'      => '',
							'attributes' => array(
								'data-target' => '.getcurrency',
								'autocomplete' => 'off',
							),
							'options' => array(
								'USD' => __( 'U.S. dollar', 'qrcdr' ),
								'EUR' => __( 'Euro', 'qrcdr' ),
								'AUD' => __( 'Australian dollar', 'qrcdr' ),
								'BRL' => __( 'Brazilian real', 'qrcdr' ),
								'CAD' => __( 'Canadian dollar', 'qrcdr' ),
								'CNY' => __( 'Chinese Renmenbi', 'qrcdr' ),
								'CZK' => __( 'Czech koruna', 'qrcdr' ),
								'DKK' => __( 'Danish krone', 'qrcdr' ),
								'HKD' => __( 'Hong Kong dollar', 'qrcdr' ),
								'HUF' => __( 'Hungarian forint', 'qrcdr' ),
								'INR' => __( 'Indian rupee', 'qrcdr' ),
								'ILS' => __( 'Israeli new shekel', 'qrcdr' ),
								'JPY' => __( 'Japanese yen', 'qrcdr' ),
								'MYR' => __( 'Malaysian ringgit', 'qrcdr' ),
								'MXN' => __( 'Mexican peso', 'qrcdr' ),
								'TWD' => __( 'New Taiwan dollar', 'qrcdr' ),
								'NZD' => __( 'New Zealand dollar', 'qrcdr' ),
								'NOK' => __( 'Norwegian krone', 'qrcdr' ),
								'PHP' => __( 'Philippine peso', 'qrcdr' ),
								'PLN' => __( 'Polish złoty', 'qrcdr' ),
								'GBP' => __( 'Pound sterling', 'qrcdr' ),
								'RUB' => __( 'Russian ruble', 'qrcdr' ),
								'SGD' => __( 'Singapore dollar', 'qrcdr' ),
								'SEK' => __( 'Swedish krona', 'qrcdr' ),
								'CHF' => __( 'Swiss franc', 'qrcdr' ),
								'THB' => __( 'Thai baht', 'qrcdr' ),
							),
						),
						'pp_shipping' => array(
							'label'      => __( 'Shipping', 'qrcdr' ),
							'name'       => 'pp_shipping',
							'type'       => 'text',
							'default'    => '',
							'class'      => '',
							'attributes' => array(
								'placeholder' => '0.00',
							),
						),
						'pp_tax'      => array(
							'name'       => 'pp_tax',
							'type'       => 'text',
							'default'    => '',
							'class'      => '',
							'attributes' => array(
								'placeholder' => '0',
							),
						),
					),
				),
				'skype'    => array(
					'label'     => 'Skype',
					'inputs'    => array(
						'skype'     => array(
							'label'      => __( 'Skype username', 'qrcdr' ),
							'name'       => 'skype',
							'type'       => 'text',
							'default'    => '',
							'class'      => '',
							'attributes' => array(
								'required' => true,
							),
						),
						'skype_type' => array(
							'label'      => __( 'Action', 'qrcdr' ),
							'name'       => 'skype_type',
							'type'       => 'radio',
							'default'    => 'chat',
							'class'      => '',
							'attributes' => array(),
							'options' => array(
								'chat' => __( 'Chat', 'qrcdr' ),
								'call' => __( 'Call', 'qrcdr' ),
							),
						),
					),
				),
				'sms'      => array(
					'label'     => 'SMS',
					'inputs'    => array(
						'countrycodesms' => array(
							'label'      => __( 'Country code', 'qrcdr' ),
							'name'       => 'countrycodesms',
							'type'       => 'countrycodes',
							'default'    => '',
							'class'      => '',
							'attributes' => array(),
						),
						'sms'            => array(
							'label'      => __( 'Phone number', 'qrcdr' ),
							'name'       => 'sms',
							'type'       => 'text',
							'default'    => '',
							'class'      => '',
							'attributes' => array(
								'required' => true,
							),
						),
						'bodysms'   => array(
							'label'      => __( 'Message', 'qrcdr' ),
							'name'       => 'bodysms',
							'type'       => 'textarea',
							'default'    => '',
							'class'      => '',
							'attributes' => array(
								'maxlength' => '160',
								'rows' => '3',
							),
						),
					),
				),
				'tel'      => array(
					'label'     => __( 'Phone', 'qrcdr' ),
					'inputs'    => array(
						'countrycodetel' => array(
							'label'      => __( 'Country code', 'qrcdr' ),
							'name'       => 'countrycodetel',
							'type'       => 'countrycodes',
							'default'    => '',
							'class'      => '',
							'attributes' => array(),
						),
						'tel'            => array(
							'label'      => __( 'Phone number', 'qrcdr' ),
							'name'       => 'tel',
							'type'       => 'text',
							'default'    => '',
							'class'      => '',
							'attributes' => array(
								'required' => true,
							),
						),
					),
				),
				'text'     => array(
					'label'     => __( 'Text', 'qrcdr' ),
					'inputs'    => array(
						'data' => array(
							'label'      => __( 'Message', 'qrcdr' ),
							'name'       => 'data',
							'type'       => 'textarea',
							'default'    => '',
							'class'      => 'mb-2',
							'attributes' => array(
								'required' => true,
								'maxlength' => '1000',
								'rows' => '3',
							),
						),
					),
				),
				'vcard' => array(
					'label'     => __( 'V-card', 'qrcdr' ),
					'inputs'    => array(
						'vversion'           => array(
							'label'      => __( 'Version', 'qrcdr' ),
							'name'       => 'vversion',
							'type'       => 'select',
							'default'    => '3.0',
							'class'      => '',
							'attributes' => array(),
							'options' => array(
								'2.1' => '2.1',
								'3.0' => '3.0',
							),
						),
						'vnametitle'         => array(
							'label'      => __( 'Title', 'qrcdr' ),
							'name'       => 'vnametitle',
							'type'       => 'text',
							'default'    => '',
							'class'      => '',
							'attributes' => array(),
						),
						'vname'              => array(
							'label'      => __( 'First name', 'qrcdr' ),
							'name'       => 'vname',
							'type'       => 'text',
							'default'    => '',
							'class'      => '',
							'attributes' => array(
								'required' => true,
							),
						),
						'vlast'              => array(
							'label'      => __( 'Last name', 'qrcdr' ),
							'name'       => 'vlast',
							'type'       => 'text',
							'default'    => '',
							'class'      => '',
							'attributes' => array(),
						),
						'countrycodevphone' => array(
							'label'      => __( 'Country code', 'qrcdr' ),
							'name'       => 'countrycodevphone',
							'type'       => 'countrycodes',
							'default'    => '',
							'class'      => '',
							'attributes' => array(),
						),
						'vphone'            => array(
							'label'      => __( 'Number', 'qrcdr' ),
							'name'       => 'vphone',
							'type'       => 'number',
							'default'    => '',
							'class'      => '',
							'attributes' => array(),
						),
						'countrycodevmobile' => array(
							'label'      => __( 'Country code', 'qrcdr' ),
							'name'       => 'countrycodevmobile',
							'type'       => 'countrycodes',
							'default'    => '',
							'class'      => '',
							'attributes' => array(),
						),
						'vmobile'            => array(
							'label'      => __( 'Number', 'qrcdr' ),
							'name'       => 'vmobile',
							'type'       => 'number',
							'default'    => '',
							'class'      => '',
							'attributes' => array(),
						),
						'vemail'             => array(
							'label'      => __( 'E-mail', 'qrcdr' ),
							'name'       => 'vemail',
							'type'       => 'email',
							'default'    => '',
							'class'      => '',
							'attributes' => array(),
						),
						'vurl'               => array(
							'label'      => __( 'Website (URL)', 'qrcdr' ),
							'name'       => 'vurl',
							'type'       => 'text',
							'default'    => '',
							'class'      => '',
							'attributes' => array(
								'placeholder' => 'http://',
							),
						),
						'vcompany'           => array(
							'label'      => __( 'Company', 'qrcdr' ),
							'name'       => 'vcompany',
							'type'       => 'text',
							'default'    => '',
							'class'      => '',
							'attributes' => array(),
						),
						'vtitle'             => array(
							'label'      => __( 'job title', 'qrcdr' ),
							'name'       => 'vtitle',
							'type'       => 'text',
							'default'    => '',
							'class'      => '',
							'attributes' => array(),
						),
						'countrycodevoffice' => array(
							'label'      => __( 'Country code', 'qrcdr' ),
							'name'       => 'countrycodevoffice',
							'type'       => 'countrycodes',
							'default'    => '',
							'class'      => '',
							'attributes' => array(
								'options' => 'country_codes',
							),
						),
						'vofficephone'       => array(
							'label'      => __( 'Number', 'qrcdr' ),
							'name'       => 'vofficephone',
							'type'       => 'number',
							'default'    => '',
							'class'      => '',
							'attributes' => array(),
						),
						'countrycodevfax' => array(
							'label'      => __( 'Country code', 'qrcdr' ),
							'name'       => 'countrycodevfax',
							'type'       => 'countrycodes',
							'default'    => '',
							'class'      => '',
							'attributes' => array(
								'options' => 'country_codes',
							),
						),
						'vfax'            => array(
							'label'      => __( 'Number', 'qrcdr' ),
							'name'       => 'vfax',
							'type'       => 'number',
							'default'    => '',
							'class'      => '',
							'attributes' => array(),
						),
						'vaddress'           => array(
							'label'      => __( 'Address', 'qrcdr' ),
							'name'       => 'vaddress',
							'type'       => 'textarea',
							'default'    => '',
							'class'      => '',
							'attributes' => array(
								'rows' => '2',
							),
						),
						'vcap'               => array(
							'label'      => __( 'Post code', 'qrcdr' ),
							'name'       => 'vcap',
							'type'       => 'text',
							'default'    => '',
							'class'      => '',
							'attributes' => array(),
						),
						'vcity'              => array(
							'label'      => __( 'City', 'qrcdr' ),
							'name'       => 'vcity',
							'type'       => 'text',
							'default'    => '',
							'class'      => '',
							'attributes' => array(),
						),
						'vstate'             => array(
							'label'      => __( 'State', 'qrcdr' ),
							'name'       => 'vstate',
							'type'       => 'text',
							'default'    => '',
							'class'      => '',
							'attributes' => array(),
						),
						'vcountry'           => array(
							'label'      => __( 'Country', 'qrcdr' ),
							'name'       => 'vcountry',
							'type'       => 'text',
							'default'    => '',
							'class'      => '',
							'attributes' => array(),
						),
					),
				),
				'whatsapp' => array(
					'label'     => 'WhatsApp',
					'inputs'    => array(
						'wapp_countrycode' => array(
							'label'      => __( 'Country code', 'qrcdr' ),
							'name'       => 'wapp_countrycode',
							'type'       => 'countrycodes',
							'default'    => '',
							'class'      => '',
							'attributes' => array(
								'options' => 'country_codes',
							),
						),
						'wapp_number'      => array(
							'label'      => __( 'Phone number', 'qrcdr' ),
							'name'       => 'wapp_number',
							'type'       => 'text',
							'default'    => '',
							'class'      => '',
							'attributes' => array(
								'required' => true,
							),
						),
						'wapp_message' => array(
							'label'      => __( 'Message', 'qrcdr' ),
							'name'       => 'wapp_message',
							'type'       => 'textarea',
							'default'    => '',
							'class'      => 'mb-2',
							'attributes' => array(
								'maxlength' => '750',
								'rows' => '3',
							),
						),
					),
				),
				'wifi'     => array(
					'label'     => __( 'WiFi', 'qrcdr' ),
					'inputs'    => array(
						'ssid'        => array(
							'label'      => __( 'Network name (SSID)', 'qrcdr' ),
							'name'       => 'ssid',
							'type'       => 'text',
							'default'    => '',
							'class'      => '',
							'attributes' => array(
								'required' => true,
							),
						),
						'wifipass'    => array(
							'label'      => __( 'Password', 'qrcdr' ),
							'name'       => 'wifipass',
							'type'       => 'text',
							'default'    => '',
							'class'      => '',
							'attributes' => array(),
						),
						'networktype' => array(
							'label'      => __( 'Encryption', 'qrcdr' ),
							'name'       => 'networktype',
							'type'       => 'select',
							'default'    => 'WPA',
							'class'      => '',
							'attributes' => array(),
							'options' => array(
								'WPA'    => 'WPA/WPA2',
								'WEP'    => 'WEP',
								'' => __( 'None', 'qrcdr' ),
							),
						),
						'wifihidden'  => array(
							'label'      => __( 'Hidden', 'qrcdr' ),
							'name'       => 'wifihidden',
							'type'       => 'checkbox',
							'default'    => false,
							'class'      => '',
							'attributes' => array(),
						),
					),
				),
				'zoom'     => array(
					'label'     => 'Zoom',
					'inputs'    => array(
						'zoom_id'  => array(
							'label'      => __( 'Meeting ID', 'qrcdr' ),
							'name'       => 'zoom_id',
							'type'       => 'text',
							'default'    => '',
							'class'      => '',
							'attributes' => array(
								'required' => true,
							),
						),
						'zoom_pwd' => array(
							'label'      => __( 'Password', 'qrcdr' ),
							'name'       => 'zoom_pwd',
							'type'       => 'text',
							'default'    => '',
							'class'      => '',
							'attributes' => array(
								'required' => true,
							),
						),
					),
				),
			);
		}

		/**
		 * Get default features with their inputs
		 *
		 * @return array
		 */
		public function get_default_features() {
			return array(
				'colors'  => array(
					'label'     => __( 'Colors', 'qrcdr' ),
					'inputs'    => array(
						'backcolor'   => array(
							'label'      => __( 'Background', 'qrcdr' ),
							'name'       => 'backcolor',
							'type'       => 'color',
							'default'    => qrcdr_settings()->get_option( 'qr_bgcolor', '#ffffff' ),
							'class'      => '',
							'attributes' => array(),
						),
						'transparent' => array(
							'label'      => __( 'Transparent background', 'qrcdr' ),
							'name'       => 'transparent',
							'type'       => 'switch',
							'default'    => false,
							'class'      => 'trans-bg',
							'attributes' => array(),
						),
						'frontcolor'  => array(
							'label'      => __( 'Foreground', 'qrcdr' ),
							'name'       => 'frontcolor',
							'type'       => 'color',
							'default'    => qrcdr_settings()->get_option( 'qr_color', '#000000' ),
							'class'      => '',
							'attributes' => array(),
						),
						'gradient'    => array(
							'label'      => __( 'Gradient', 'qrcdr' ),
							'name'       => 'gradient',
							'type'       => 'switch',
							'default'    => false,
							'class'      => 'gradient-bg',
							'attributes' => array(
								'id' => 'gradient-bg-{form_id}',
								'toggle' => true,
							),
						),
						'gradient_color' => array(
							'label'      => __( 'Second color', 'qrcdr' ),
							'name'       => 'gradient_color',
							'type'       => 'color',
							'default'    => '#8900D5',
							'class'      => 'qrcolorpicker_bg',
							'attributes' => array(),
						),
						'radial'         => array(
							'label'      => __( 'Radial', 'qrcdr' ),
							'name'       => 'radial',
							'type'       => 'switch',
							'default'    => false,
							'class'      => '',
							'attributes' => array(),
						),
						'transparent_code' => array(
							'label'      => __( 'Background image', 'qrcdr' ),
							'name'       => 'transparent_code',
							'type'       => 'switch',
							'default'    => false,
							'class'      => '',
							'attributes' => array(),
						),
						'bg_image'  => array(
							'label'      => '',
							'name'       => 'bg_image',
							'type'       => 'text',
							'default'    => '',
							'class'      => '',
							'attributes' => array(),
						),
						'negative_qr'         => array(
							'label'      => __( 'Masked', 'qrcdr' ),
							'name'       => 'negative_qr',
							'type'       => 'switch',
							'default'    => false,
							'class'      => '',
							'attributes' => array(),
						),
					),
				),
				'design'  => array(
					'label'     => __( 'Patterns', 'qrcdr' ),
					'inputs'    => array(
						'pattern'                 => array(
							'label'      => '',
							'name'       => 'pattern',
							'type'       => 'pattern_picker',
							'default'    => 'default',
							'class'      => '',
							'attributes' => array(),
						),
						'marker_out'              => array(
							'label'      => __( 'Marker border', 'qrcdr' ),
							'name'       => 'marker_out',
							'type'       => 'marker_picker',
							'default'    => 'default',
							'class'      => '',
							'attributes' => array(),
						),
						'marker_in'               => array(
							'label'      => __( 'Marker center', 'qrcdr' ),
							'name'       => 'marker_in',
							'type'       => 'marker_picker',
							'default'    => 'default',
							'class'      => '',
							'attributes' => array(),
						),
						'markers_color'           => array(
							'label'      => __( 'Custom markers color', 'qrcdr' ),
							'name'       => 'markers_color',
							'type'       => 'switch',
							'default'    => false,
							'class'      => '',
							'attributes' => array(),
						),
						'marker_out_color'        => array(
							'name'       => 'marker_out_color',
							'type'       => 'color',
							'default'    => qrcdr_settings()->get_option( 'qr_color', '#000000' ),
							'class'      => '',
							'attributes' => array(),
						),
						'marker_in_color'         => array(
							'name'       => 'marker_in_color',
							'type'       => 'color',
							'default'    => qrcdr_settings()->get_option( 'qr_color', '#000000' ),
							'class'      => '',
							'attributes' => array(),
						),
						'different_markers_color' => array(
							'label'      => __( 'Different markers colors', 'qrcdr' ),
							'name'       => 'different_markers_color',
							'type'       => 'switch',
							'default'    => false,
							'class'      => '',
							'attributes' => array(),
						),
						'marker_top_right_outline' => array(
							'name'       => 'marker_top_right_outline',
							'type'       => 'color',
							'default'    => qrcdr_settings()->get_option( 'qr_color', '#000000' ),
							'class'      => '',
							'attributes' => array(),
						),
						'marker_top_right_center' => array(
							'name'       => 'marker_top_right_center',
							'type'       => 'color',
							'default'    => qrcdr_settings()->get_option( 'qr_color', '#000000' ),
							'class'      => '',
							'attributes' => array(),
						),
						'marker_bottom_left_outline' => array(
							'name'       => 'marker_bottom_left_outline',
							'type'       => 'color',
							'default'    => qrcdr_settings()->get_option( 'qr_color', '#000000' ),
							'class'      => '',
							'attributes' => array(),
						),
						'marker_bottom_left_center' => array(
							'name'       => 'marker_bottom_left_center',
							'type'       => 'color',
							'default'    => qrcdr_settings()->get_option( 'qr_color', '#000000' ),
							'class'      => '',
							'attributes' => array(),
						),
					),
				),
				'frame'   => array(
					'label'     => __( 'Frame', 'qrcdr' ),
					'inputs'    => array(
						'outer_frame'       => array(
							'label'      => '',
							'name'       => 'outer_frame',
							'type'       => 'text',
							'default'    => 'none',
							'class'      => '',
							'attributes' => array(),
						),
						'custom_frame_color' => array(
							'label'      => __( 'Custom frame color', 'qrcdr' ),
							'name'       => 'custom_frame_color',
							'type'       => 'switch',
							'default'    => false,
							'class'      => '',
							'attributes' => array(),
						),
						'framecolor'         => array(
							'label'      => __( 'Frame color', 'qrcdr' ),
							'name'       => 'framecolor',
							'type'       => 'color',
							'default'    => qrcdr_settings()->get_option( 'qr_color', '#000000' ),
							'class'      => '',
							'attributes' => array(),
						),
						'framelabel'         => array(
							'label'      => __( 'Frame label', 'qrcdr' ),
							'name'       => 'framelabel',
							'type'       => 'text',
							'default'    => __( 'Scan Me', 'qrcdr' ),
							'class'      => '',
							'attributes' => array(),
						),
						'label_font'         => array(
							'label'      => __( 'Font', 'qrcdr' ),
							'name'       => 'label_font',
							'type'       => 'select',
							'default'    => '',
							'class'      => '',
							'attributes' => array(),
							'options' => qrcdr_fonts()->get_fonts(),
						),
						'labelcolor'    => array(
							'label'      => __( 'Label text color', 'qrcdr' ),
							'name'       => 'labelcolor',
							'type'       => 'color',
							'default'    => qrcdr_settings()->get_option( 'qr_bgcolor', '#FFFFFF' ),
							'class'      => '',
							'attributes' => array(),
						),
						'label_text_size'    => array(
							'label'      => __( 'Text size', 'qrcdr' ),
							'name'       => 'label_text_size',
							'type'       => 'range',
							'default'    => 100,
							'class'      => '',
							'attributes' => array(
								'min' => 50,
								'max' => 100,
								'data-qrcdr-unit' => '%',
							),
						),
					),
				),
				'logo'    => array(
					'label'     => __( 'Logo', 'qrcdr' ),
					'inputs'    => array(
						'logo_size' => array(
							'label'      => __( 'Logo size', 'qrcdr' ),
							'name'       => 'logo_size',
							'type'       => 'range',
							'default'    => 100,
							'class'      => '',
							'attributes' => array(
								'min' => 50,
								'max' => 100,
								'data-qrcdr-unit' => '%',
							),
						),
						'no_logo_bg' => array(
							'label'      => __( 'Remove pattern behind logo', 'qrcdr' ),
							'name'       => 'no_logo_bg',
							'type'       => 'switch',
							'default'    => false,
							'class'      => '',
							'attributes' => array(),
						),
					),
				),
				'options' => array(
					'label'     => __( 'Options', 'qrcdr' ),
					'inputs'    => array(
						'size'  => array(
							'label'      => __( 'Size', 'qrcdr' ),
							'name'       => 'size',
							'type'       => 'select',
							'default'    => '24',
							'class'      => '',
							'attributes' => array(),
							'options' => array(
								'8' => '200',
								'16' => '400',
								'24' => '600',
								'32' => '800',
							),
						),
						'level' => array(
							'label'      => __( 'Precision', 'qrcdr' ),
							'name'       => 'level',
							'type'       => 'select',
							'default'    => qrcdr_settings()->get_option( 'precision', 'Q' ),
							'class'      => '',
							'attributes' => array(),
							'options' => array(
								'L' => 'L - ' . __( 'Smallest', 'qrcdr' ),
								'M' => 'M - ' . __( 'Medium', 'qrcdr' ),
								'Q' => 'Q - ' . __( 'High', 'qrcdr' ),
								'H' => 'H - ' . __( 'Best', 'qrcdr' ),
							),
						),
					),
				),
			);
		}

		/**
		 * Get available tabs (filtered and cached)
		 *
		 * @return array
		 */
		public function get_tabs() {
			if ( null === $this->tabs ) {
				$this->tabs = apply_filters( 'qrcdr_available_tabs', $this->get_default_tabs() );
			}
			return $this->tabs;
		}

		/**
		 * Get available features (filtered and cached)
		 *
		 * @return array
		 */
		public function get_features() {
			if ( null === $this->features ) {
				$this->features = apply_filters( 'qrcdr_available_features', $this->get_default_features() );
			}
			return $this->features;
		}

		/**
		 * Get all available tabs and features (using internal cache)
		 *
		 * @return array
		 */
		public function get_all() {
			return array(
				'tabs'     => $this->get_tabs(), // Chiama il metodo che gestisce già la cache.
				'features' => $this->get_features(), // Chiama il metodo che gestisce già la cache.
			);
		}
	}
}
