<?php

class OsSettingsHelper {

	public static $loaded_values;


	private static $encrypted_settings = [
		'license',
		'google_calendar_client_secret',
		'facebook_app_secret',
		'google_client_secret',
		'braintree_secret_key',
		'braintree_merchant_id',
		'paypal_client_secret'
	];

	private static $settings_to_autoload = [
		'enable_google_login',
		'time_system',
		'date_format',
		'currency_symbol_before',
		'currency_symbol_after',
		'phone_format',
		'steps_show_timezone_selector',
		'show_booking_end_time',
		'stripe_publishable_key',
		'enable_facebook_login',
		'earliest_possible_booking',
		'enable_payments_local',
		'color_scheme_for_booking_form',
		'latest_possible_booking',
		'facebook_app_id',
		'google_client_id',
		'paypal_client_id',
		'paypal_currency_iso_code',
		'paypal_use_braintree_api',
		'stripe_secret_key',
		'steps_hide_agent_info',
		'booking_hash',
		'payments_environment',
		'list_of_phone_countries',
		'included_phone_countries',
		'wp_users_as_customers',
		'thousand_separator',
		'decimal_separator',
		'number_of_decimals',
		'default_phone_country'
	];

	private static $defaults = [
		'date_format'            => LATEPOINT_DEFAULT_DATE_FORMAT,
		'time_system'            => LATEPOINT_DEFAULT_TIME_SYSTEM,
		'currency_symbol_before' => '$'
	];

	public static function get_business_logo_url() {
		$default_logo_url = LATEPOINT_IMAGES_URL . 'logo.png';

		return OsImageHelper::get_image_url_by_id( OsSettingsHelper::get_settings_value( 'business_logo' ), 'thumbnail', $default_logo_url );
	}

	public static function get_business_logo_image( $height = '50px' ) {
		$url = self::get_business_logo_url();

		return '<img src="' . $url . '" style="height: ' . $height . '; width: auto"/>';
	}

	public static function get_encrypted_settings() {
		$encrypted_settings = apply_filters( 'latepoint_encrypted_settings', self::$encrypted_settings );

		return $encrypted_settings;
	}


	public static function get_active_addons(): array {
		return json_decode( OsSettingsHelper::get_settings_value( 'active_addons', '' ) ) ?? [];
	}

    public static function get_earliest_possible_booking_restriction($service_id = 0) {
        if(!empty($service_id)) {
            $service = new OsServiceModel($service_id);
            if(!$service->is_new_record() && !empty($service->earliest_possible_booking) && OsTimeHelper::is_valid_date($service->earliest_possible_booking)) {
                return $service->earliest_possible_booking;
            }
        }
        $restriction_from_general_settings = OsSettingsHelper::get_settings_value( 'earliest_possible_booking', '' );
        if(OsTimeHelper::is_valid_date($restriction_from_general_settings)) {
            return $restriction_from_general_settings;
        }else{
            return '';
        }
    }

    public static function get_latest_possible_booking_restriction($service_id = 0) {
        if(!empty($service_id)) {
            $service = new OsServiceModel($service_id);
            if(!$service->is_new_record() && !empty($service->latest_possible_booking) && OsTimeHelper::is_valid_date($service->latest_possible_booking)) {
                return $service->latest_possible_booking;
            }
        }
        $restriction_from_general_settings = OsSettingsHelper::get_settings_value( 'latest_possible_booking', '' );
        if(OsTimeHelper::is_valid_date($restriction_from_general_settings)) {
            return $restriction_from_general_settings;
        }else{
            return '';
        }
    }

	/**
	 * @param array $tables
	 *
	 * @return string
	 */
	public static function export_data( array $tables = [] ): string {

		if ( empty( $tables ) ) {
			$tables = OsDatabaseHelper::get_all_latepoint_tables();
		}

		global $wpdb;

		$output = [];

		foreach ( $tables as $table ) {
			// Check if table exists
			$table_exists = $wpdb->get_var( "SHOW TABLES LIKE '{$table}'" );

			if ( ! $table_exists ) {
				continue; // Skip this table if it doesn't exist
			}
			// Get all rows from the table
			$rows = $wpdb->get_results( "SELECT * FROM {$table}", ARRAY_A );

			if ( $rows ) {
				// Get table create statement
				$create_table = $wpdb->get_row( "SHOW CREATE TABLE {$table}", ARRAY_N );
                $var_table = str_replace($wpdb->prefix, '{{TABLE_PREFIX}}', $table);
                $create_table = str_replace($table, $var_table, $create_table);

				$output[ $var_table ] = [
					'create' => $create_table[1],
                    'prefix' => $wpdb->prefix,
					'data'   => $rows
				];
			}
		}

		// Generate filename
		$filename = 'latepoint_backup_' . date( 'Y-m-d_H-i-s' ) . '.json';

        $json = wp_json_encode($output, JSON_PRETTY_PRINT);

		// Send headers for file download
		header( 'Content-Type: application/json' );
		header( 'Content-Disposition: attachment; filename="' . $filename . '"' );
		header( 'Content-Length: ' . strlen( $json ) );
		header( 'Pragma: no-cache' );

		return $json;
	}

	/**
	 * @param string $data
	 *
	 * @return bool
	 * @throws Exception
	 */
	public static function import_data( string $data ): bool {
		global $wpdb;

		if ( empty( $data ) ) {
			throw new Exception( __( 'Error reading uploaded file', 'latepoint' ) );
		}

        // update table name from original to new prefix
        $data = str_replace('{{TABLE_PREFIX}}', $wpdb->prefix, $data);

		$data = json_decode( $data, true );
		if ( json_last_error() !== JSON_ERROR_NONE ) {
			throw new Exception( __( 'Invalid JSON file format', 'latepoint' ) );
		}

		foreach ( $data as $table => $table_data ) {
			// Drop table if exists
			$wpdb->query( "DROP TABLE IF EXISTS {$table}" );

			// Create table
			$wpdb->query( $table_data['create'] );

			// Insert data
			foreach ( $table_data['data'] as $row ) {
				$wpdb->insert( $table, $row );
			}

			// Find auto-increment columns and their max values
			$columns = $wpdb->get_results( "SHOW COLUMNS FROM {$table} WHERE Extra = 'auto_increment'" );
			foreach ( $columns as $column ) {
				// Get the maximum value for this column
				$max_id = $wpdb->get_var( "SELECT MAX({$column->Field}) FROM {$table}" );

				// Set the auto_increment value to max + 1
				if ( $max_id ) {
					$wpdb->query( "ALTER TABLE {$table} AUTO_INCREMENT = " . ( $max_id + 1 ) );
				}
			}
		}

		return true;
	}

	public static function run_autoload() {
		/**
		 * Default settings to be used in SettingsHelper when no value exists in DB
		 *
		 * @param {array} $default_settings Array of key => value pairs of setting names and their default values
		 * @returns {array} The filtered array of default settings
		 *
		 * @since 4.7.2
		 * @hook latepoint_settings_defaults
		 *
		 */
		self::$defaults = apply_filters( 'latepoint_settings_defaults', self::$defaults );
		foreach ( self::$defaults as $name => $default ) {
			self::$loaded_values[ $name ] = $default;
		}

		$settings_model = new OsSettingsModel();

		/**
		 * Settings to autoload in SettingsHelper on every page load, this is done to reduce the number of queries to DB
		 *
		 * @param {array} $settings Array of setting names to autoload
		 * @returns {array} The filtered array of setting names
		 *
		 * @since 4.7.2
		 * @hook latepoint_settings_to_autoload
		 *
		 */
		self::$settings_to_autoload = apply_filters( 'latepoint_settings_to_autoload', self::$settings_to_autoload );
		$settings_arr               = $settings_model->select( 'name, value' )->where( array( 'name' => self::$settings_to_autoload ) )->get_results();


		if ( $settings_arr && is_array( $settings_arr ) ) {
			foreach ( $settings_arr as $setting ) {
				if ( in_array( $setting->name, self::get_encrypted_settings() ) ) {
					self::$loaded_values[ $setting->name ] = OsEncryptHelper::decrypt_value( $setting->value );
				} else {
					self::$loaded_values[ $setting->name ] = $setting->value;
				}
			}
		}
	}


	// ENVIRONMENT SETTINGS

	// BASE ENVIRONMENT
	public static function is_env_live() {
		return ( LATEPOINT_ENV == LATEPOINT_ENV_LIVE );
	}

	public static function is_env_dev() {
		return ( LATEPOINT_ENV == LATEPOINT_ENV_DEV );
	}

	public static function is_env_demo() {
		return ( LATEPOINT_ENV == LATEPOINT_ENV_DEMO );
	}

	// SMS, EMAILS

	public static function is_sms_allowed() {
		return LATEPOINT_ALLOW_SMS;
	}

	public static function is_whatsapp_allowed() {
		return LATEPOINT_ALLOW_WHATSAPP;
	}

	public static function is_email_allowed() {
		return LATEPOINT_ALLOW_EMAILS;
	}

	// PAYMENTS ENVIRONMENT
	public static function is_env_payments_live() {
		return ( self::get_payments_environment() == LATEPOINT_PAYMENTS_ENV_LIVE );
	}

	public static function is_env_payments_dev() {
		return ( self::get_payments_environment() == LATEPOINT_PAYMENTS_ENV_DEV );
	}

	public static function is_env_payments_demo() {
		return ( self::get_payments_environment() == LATEPOINT_PAYMENTS_ENV_DEMO );
	}

	public static function get_payments_environment() {
		return self::get_settings_value( 'payments_environment', LATEPOINT_PAYMENTS_ENV_LIVE );
	}


	public static function append_payment_env_key( string $string, string $force_env = '' ): string {
		if ( $force_env ) {
			if ( $force_env == LATEPOINT_PAYMENTS_ENV_DEV ) {
				$string .= LATEPOINT_PAYMENTS_DEV_SUFFIX;
			}
		} else {
			if ( self::is_env_payments_dev() ) {
				$string .= LATEPOINT_PAYMENTS_DEV_SUFFIX;
			}
		}

		return $string;
	}

	public static function set_menu_layout_style( $layout ) {
        $layout = in_array($layout, ['compact', 'full']) ? $layout : 'full';
        update_user_meta(get_current_user_id(), 'latepoint_admin_menu_style', $layout);
	}

	public static function get_menu_layout_style() : string {
        $menu_style = get_user_meta(get_current_user_id(), 'latepoint_admin_menu_style', true);

        // Set default if not set
        if (empty($menu_style)) {
            $menu_style = 'full'; // default value
        }
        return $menu_style;
	}

	public static function get_time_system() {
		return self::get_settings_value( 'time_system', LATEPOINT_DEFAULT_TIME_SYSTEM );
	}

	public static function get_date_format() {
		return self::get_settings_value( 'date_format', LATEPOINT_DEFAULT_DATE_FORMAT );
	}

	public static function get_date_format_for_js() {
		$format = strtolower( self::get_date_format() );

		return str_replace( [ 'd', 'm', 'y' ], [ 'dd', 'mm', 'yyyy' ], $format );
	}

	public static function get_readable_datetime_format( $no_year = false, $no_seconds = true ) {
		return self::get_readable_date_format( $no_year ) . ', ' . self::get_readable_time_format( $no_seconds );
	}

	public static function get_order_types_list_for_any_agent_logic(): array {
		$order_types = [
			LATEPOINT_ANY_AGENT_ORDER_RANDOM     => __( 'Randomly picked agent', 'latepoint' ),
			LATEPOINT_ANY_AGENT_ORDER_PRICE_HIGH => __( 'Most expensive agent', 'latepoint' ),
			LATEPOINT_ANY_AGENT_ORDER_PRICE_LOW  => __( 'Least expensive agent', 'latepoint' ),
			LATEPOINT_ANY_AGENT_ORDER_BUSY_HIGH  => __( 'Agent with the most bookings on that day', 'latepoint' ),
			LATEPOINT_ANY_AGENT_ORDER_BUSY_LOW   => __( 'Agent with the least bookings on that day', 'latepoint' )
		];

		/**
		 * Get the list of order types for agent selection logic when "ANY" agent is pre-selected in the booking form
		 *
		 * @param {array} $order_types Array of order types
		 *
		 * @returns {array} Filtered array of order types
		 * @since 4.7.6
		 * @hook latepoint_get_order_types_list_for_any_agent_logic
		 *
		 */
		return apply_filters( 'latepoint_get_order_types_list_for_any_agent_logic', $order_types );
	}

	public static function get_readable_time_format( $no_seconds = true ) {
		$seconds = $no_seconds ? '' : ':s';
		$format  = ( self::get_time_system() == '12' ) ? "g:i$seconds a" : "G:i$seconds";

		return $format;
	}

	public static function get_readable_date_format( $no_year = false, $short_month = false ) {
		if ( OsSettingsHelper::is_on( 'disable_verbose_date_output' ) ) {
			return self::get_date_format();
		}
		$format = ( $no_year ) ? 'F j' : 'M j, Y';
		switch ( self::get_date_format() ) {
			case 'm/d/Y':
			case 'm.d.Y':
				$format = ( $no_year ) ? 'F j' : 'M j, Y';
				break;
			case 'd.m.Y':
			case 'd/m/Y':
				$format = ( $no_year ) ? 'j F' : 'j M, Y';
				break;
			case 'Y-m-d':
				$format = ( $no_year ) ? 'F j' : 'Y, M j';
				break;
		}
        if($short_month){
            // if short month is requested - use month shorthand;
            $format = str_replace('F', 'M', $format);
        }

		return $format;
	}


	public static function get_booking_template_for_calendar() {
		return OsSettingsHelper::get_settings_value( 'booking_template_for_calendar', '{{service_name}}' );
	}


	public static function get_selected_columns_for_bookings_table() {
		return OsSettingsHelper::get_settings_value( 'bookings_table_columns', [] );
	}

	public static function get_available_columns_for_bookings_table() {
		$available_columns = [];

		$available_columns['customer'] = [
			'email' => __( 'Email', 'latepoint' ),
			'phone' => __( 'Phone', 'latepoint' )
		];

		$available_columns['booking'] = [
			'booking_code'    => __( 'Code', 'latepoint' ),
			'duration'        => __( 'Duration', 'latepoint' ),
			'source_id'       => __( 'Source ID', 'latepoint' ),
			'payment_method'  => __( 'Payment Method', 'latepoint' ),
			'payment_portion' => __( 'Payment Portion', 'latepoint' ),
			'formatted_price' => __( 'Price', 'latepoint' )
		];

		$available_columns = apply_filters( 'latepoint_bookings_table_columns', $available_columns );

		return $available_columns;
	}

	public static function force_bite( $request ) {
	}

	public static function read_encoded( $str ) {
		return base64_decode( $str );
	}

	public static function get_db_version() {
		return get_option( 'latepoint_db_version' );
	}

	public static function force_release( $request ) {
	}

	public static function is_enabled_show_dial_code_with_flag() {
		return ( self::get_settings_value( 'show_dial_code_with_flag', LATEPOINT_VALUE_ON ) == LATEPOINT_VALUE_ON );
	}

	public static function is_using_google_login() {
		return self::is_on( 'enable_google_login' );
	}

	public static function is_using_facebook_login() {
		return self::is_on( 'enable_facebook_login' );
	}

	public static function is_using_social_login() {
		return ( self::is_using_google_login() || self::is_using_facebook_login() );
	}

	public static function get_steps_support_text() {
		$default = '<h5>Questions?</h5><p>Call (858) 939-3746 for help</p>';

		return self::get_settings_value( 'steps_support_text', $default );
	}

	public static function get_default_fields_for_customer() {
		$default_fields = [
			'first_name' => [ 'label' => __( 'First Name', 'latepoint' ), 'required' => true, 'width' => 'os-col-6', 'active' => true ],
			'last_name'  => [ 'label' => __( 'Last Name', 'latepoint' ), 'required' => true, 'width' => 'os-col-6', 'active' => true ],
			'email'      => [ 'label' => __( 'Email Address', 'latepoint' ), 'required' => true, 'width' => 'os-col-6', 'active' => true ],
			'phone'      => [ 'label' => __( 'Phone Number', 'latepoint' ), 'required' => false, 'width' => 'os-col-6', 'active' => true ],
			'notes'      => [ 'label' => __( 'Comments', 'latepoint' ), 'required' => false, 'width' => 'os-col-12', 'active' => true ]
		];

		$fields_from_db     = OsSettingsHelper::get_settings_value( 'default_fields_for_customer', '' );
		$fields_from_db_arr = json_decode( $fields_from_db, true );
		if ( $fields_from_db_arr ) {
			foreach ( $fields_from_db_arr as $name => $field_from_db ) {
				if ( isset( $default_fields[ $name ] ) ) {
					$default_fields[ $name ] = $field_from_db;
				}
			}
		}
		$default_fields = apply_filters( 'latepoint_default_fields_for_customer', $default_fields );

		return $default_fields;
	}

	public static function remove_setting_by_name( $name ) {
		$settings_model = new OsSettingsModel();
		$settings_model = $settings_model->delete_where( array( 'name' => $name ) );
		self::reset_loaded_value( $name );
	}

	public static function save_setting_by_name( $name, $value ) {
		$settings_model = new OsSettingsModel();
		$settings_model = $settings_model->where( array( 'name' => $name ) )->set_limit( 1 )->get_results_as_models();
		if ( $settings_model ) {
			$settings_model->value = self::prepare_value( $name, $value );
		} else {
			$settings_model        = new OsSettingsModel();
			$settings_model->name  = $name;
			$settings_model->value = self::prepare_value( $name, $value );
		}
		self::reset_loaded_value( $name );

		return $settings_model->save();
	}

	public static function reset_loaded_value( $name ) {
		unset( self::$loaded_values[ $name ] );
	}

	public static function prepare_value( $name, $value ) {
		if ( in_array( $name, self::get_encrypted_settings() ) ) {
			$value = OsEncryptHelper::encrypt_value( $value );
		}
		if ( is_array( $value ) ) {
			$value = maybe_serialize( $value );
		}

		return $value;
	}

	public static function get_settings_value( $name, $default = false ) {
		if ( isset( self::$loaded_values[ $name ] ) ) {
			return self::$loaded_values[ $name ];
		}
		$settings_model = new OsSettingsModel();
		$settings_model = $settings_model->where( array( 'name' => $name ) )->set_limit( 1 )->get_results_as_models();
		if ( $settings_model ) {
			if ( in_array( $name, self::get_encrypted_settings() ) ) {
				$value = OsEncryptHelper::decrypt_value( $settings_model->value );
			} else {
				$value = maybe_unserialize( $settings_model->value );
			}
		} else {
			$value = $default;
		}
		self::$loaded_values[ $name ] = $value;

		return self::$loaded_values[ $name ];
	}


	public static function get_any_agent_order() {
		return self::get_settings_value( 'any_agent_order', LATEPOINT_ANY_AGENT_ORDER_RANDOM );
	}

	public static function get_day_calendar_min_height() {
		$height = preg_replace( '/\D/', '', self::get_settings_value( 'day_calendar_min_height', 700 ) );
		if ( ! $height ) {
			$height = 700;
		}

		return $height;
	}

	public static function get_default_timeblock_interval() {
		$timeblock_interval = self::get_settings_value( 'timeblock_interval', LATEPOINT_DEFAULT_TIMEBLOCK_INTERVAL );
		if ( empty( $timeblock_interval ) ) {
			$timeblock_interval = LATEPOINT_DEFAULT_TIMEBLOCK_INTERVAL;
		}

		return intval( $timeblock_interval );
	}

	public static function get_customer_dashboard_url( $include_site_url = true ) {
		$path = self::get_settings_value( 'page_url_customer_dashboard', '/customer-dashboard' );

		return ( $include_site_url ) ? site_url( $path ) : $path;
	}

	public static function get_customer_login_url( $include_site_url = true ) {
		$path = self::get_settings_value( 'page_url_customer_login', '/customer-login' );

		return ( $include_site_url ) ? site_url( $path ) : $path;
	}


	// BOOKING STEPS

	public static function steps_show_service_categories() {
		return ( self::get_settings_value( 'steps_show_service_categories', 'on' ) == 'on' );
	}

	public static function steps_show_location_categories() {
		return ( self::get_settings_value( 'steps_show_location_categories', 'on' ) == 'on' );
	}

	public static function steps_show_agent_bio() {
		return ( self::get_settings_value( 'steps_show_agent_bio' ) == 'on' );
	}

	public static function get_booking_form_color_scheme() {
		return self::get_settings_value( 'color_scheme_for_booking_form', 'blue' );
	}

	public static function get_booking_form_border_radius() {
		return self::get_settings_value( 'border_radius', 'flat' );
	}

	public static function get_default_phone_country() {
		return OsSettingsHelper::get_settings_value( 'default_phone_country', 'us' );
	}

	public static function get_included_phone_countries(): array {
		if ( OsSettingsHelper::get_settings_value( 'list_of_phone_countries', LATEPOINT_ALL ) == LATEPOINT_ALL ) {
			return [];
		} else {
			return array_map( 'trim', explode( ',', OsSettingsHelper::get_settings_value( 'included_phone_countries', '' ) ) );
		}
	}


	public static function is_on( string $setting, $default = false ): bool {
		return ( self::get_settings_value( $setting, $default ) == LATEPOINT_VALUE_ON );
	}

	public static function is_off( string $setting, $default = false ): bool {
		return ( self::get_settings_value( $setting, $default ) != LATEPOINT_VALUE_ON );
	}

	public static function generate_default_form_fields( array $default_fields ) {
		?>
        <div class="os-default-fields" data-route="<?php echo esc_attr( OsRouterHelper::build_route_name( 'form_fields', 'update_default_fields' ) ); ?>">
            <form>
				<?php foreach ( $default_fields as $name => $default_field ) {
					$atts = [];
					?>
                    <div class="os-default-field <?php echo $default_field['active'] ? '' : 'is-disabled'; ?>">
						<?php
                            $active     = $default_field['active'] ? 'on' : 'off';
							$field_name = 'default_fields[' . $name . '][active]';
							echo '<div class="os-toggler ' . esc_attr( $active ) . '" data-for="' . esc_attr( OsFormHelper::name_to_id( $field_name ) ) . '"><div class="toggler-rail"><div class="toggler-pill"></div></div></div>';
							echo OsFormHelper::hidden_field( $field_name, $default_field['active'] );
                            ?>
                        <div class="os-field-name"><?php echo esc_html( $default_field['label'] ); ?></div>
                        <div class="os-field-setting">
							<?php echo OsFormHelper::checkbox_field( 'default_fields[' . $name . '][required]', __( 'Required?', 'latepoint' ), 'on', $default_field['required'], $atts ); ?>
                        </div>
                        <div class="os-field-setting">
							<?php echo OsFormHelper::select_field( 'default_fields[' . $name . '][width]', false, array(
								'os-col-12' => __( 'Full Width', 'latepoint' ),
								'os-col-6'  => __( 'Half Width', 'latepoint' )
							), $default_field['width'] ); ?>
                        </div>
                    </div>
				<?php } ?>
            </form>
        </div>
		<?php
	}


	/**
	 * Get value set for start of week in WordPress, can be from 1-7 (representing Monday-Sunday)
	 * @return mixed
	 */
	public static function get_start_of_week(): int {
		$wp_value = intval( get_option( 'start_of_week', 0 ) );

		return $wp_value ? $wp_value : 7; // in WordPress they start count on sunday and it's 0, we are using PHP Date library that starts week on Monday and it's 1-7
	}

	public static function get_number_of_records_per_page(): int {
		return intval( OsSettingsHelper::get_settings_value( 'number_of_records_per_page', 20 ) );
	}

	public static function can_download_records_as_csv(): bool {
		return OsAuthHelper::is_admin_logged_in() || self::is_on( 'allow_non_admins_download_csv' );
	}

	public static function get_link_attributes_for_premium_features() : string {
        return ' data-os-action="'.OsRouterHelper::build_route_name('settings', 'premium_modal').'" data-os-lightbox-classes="width-600" data-os-output-target="lightbox" ';
	}

	public static function generate_instant_booking_page_url( array $url_settings ) : string {
        $url_settings['latepoint'] = 'instant';
        return OsUtilHelper::get_site_url().'/?'.http_build_query($url_settings);
	}

    public static function instant_page_background_patterns(): array{
        return [
            'pattern_1' => 'background-color: transparent; background-size: auto; background-image: linear-gradient(45deg, #ff9a9e 0%, #fad0c4 99%, #fad0c4 100%);',
            'pattern_2' => 'background-color: transparent; background-size: auto; background-image: linear-gradient(to top, #a18cd1 0%, #fbc2eb 100%);',
            'pattern_3' => 'background-color: transparent; background-size: auto; background-image: linear-gradient(to top, #fbc2eb 0%, #a6c1ee 100%);',
            'pattern_4' => 'background-color: transparent; background-size: auto; background-image: linear-gradient(120deg, #f6d365 0%, #fda085 100%);',
            'pattern_5' => 'background-color: transparent; background-size: auto; background-image: linear-gradient(180deg, #2af598 0%, #009efd 100%);',
            'pattern_6' => 'background-color: transparent; background-size: auto; background-image: linear-gradient(to right, #6a11cb 0%, #2575fc 100%);',
            'pattern_7' => 'background-color: transparent; background-size: auto; background-color: #DCD9D4; background-image: linear-gradient(to bottom, rgba(255,255,255,0.50) 0%, rgba(0,0,0,0.50) 100%), radial-gradient(at 50% 0%, rgba(255,255,255,0.10) 0%, rgba(0,0,0,0.50) 50%); background-blend-mode: soft-light,screen;',
            'pattern_8' => 'background-color: transparent; background-size: auto; background-image: linear-gradient(to top, #f77062 0%, #fe5196 100%);',
            'pattern_9' => 'background-color: transparent; background-size: auto; background-image: linear-gradient(to top, #00c6fb 0%, #005bea 100%);',
            'pattern_10' => 'background-color: transparent; background-size: auto; background-image: linear-gradient(to top, #09203f 0%, #537895 100%);',
            'pattern_11' => 'background-color: transparent; background-size: auto; background-image: radial-gradient(73% 147%, #EADFDF 59%, #ECE2DF 100%), radial-gradient(91% 146%, rgba(255,255,255,0.50) 47%, rgba(0,0,0,0.50) 100%); background-blend-mode: screen;',
            'pattern_12' => 'background-color: transparent; background-size: auto; background-image: linear-gradient(to top, lightgrey 0%, lightgrey 1%, #e0e0e0 26%, #efefef 48%, #d9d9d9 75%, #bcbcbc 100%);',
            'pattern_13' => 'background-color: transparent; background-size: auto; background-image: linear-gradient(to top, #fddb92 0%, #d1fdff 100%);',
            'pattern_14' => 'background-color: transparent; background-size: auto; background-image: linear-gradient(to top, #dfe9f3 0%, white 100%);',
            'pattern_15' => 'background-color: transparent; background-size: auto; background-image: linear-gradient(-225deg, #5271C4 0%, #B19FFF 48%, #ECA1FE 100%);',
            'pattern_16' => 'background-color: transparent; background-size: auto; background: linear-gradient(to bottom, rgba(255,255,255,0.15) 0%, rgba(0,0,0,0.15) 100%), radial-gradient(at top center, rgba(255,255,255,0.40) 0%, rgba(0,0,0,0.40) 120%) #989898;background-blend-mode: multiply,multiply;',
            'pattern_17' => 'background-color: transparent; background-size: auto; background-image: linear-gradient(to top, #f43b47 0%, #453a94 100%);',
            'pattern_18' => 'background-color: transparent; background-size: auto; background-image: linear-gradient(to right, #222 0%, #111 100%);',
            'pattern_19' => 'background-color: transparent; background-size: auto; background-image: linear-gradient(-20deg, #d558c8 0%, #24d292 100%);',
        ];
    }

	public static function get_default_wp_role_for_new_customers() : string {
        if(!wp_roles()->is_role( LATEPOINT_WP_CUSTOMER_ROLE )){
            OsRolesHelper::register_customer_role();
        }
        return OsSettingsHelper::get_settings_value('default_wp_role_for_customer', LATEPOINT_WP_CUSTOMER_ROLE);
	}

}

?>