<?php
defined( 'ABSPATH' ) or die( "you do not have acces to this page!" );

if ( ! class_exists( "cmplz_tc_config" ) ) {

	class cmplz_tc_config {
		private static $_this;
		public $fields = array();
		public $sections;
		public $pages;
		public $warning_types;
		public $yes_no;
		public $countries;
		public $regions;
		public $eu_countries;
		public $languages;
		public $language_codes;
		public $steps;

		function __construct() {
			if ( isset( self::$_this ) ) {
				wp_die( sprintf( '%s is a singleton class and you cannot create a second instance.',
					get_class( $this ) ) );
			}

			self::$_this = $this;


			//common options type
			$this->yes_no = array(
				'yes' => __( 'Yes', 'complianz-terms-conditions' ),
				'no'  => __( 'No', 'complianz-terms-conditions' ),
			);

			$this->languages = $this->get_supported_languages();


				/* config files */
			require_once( cmplz_tc_path . '/config/countries.php' );
			require_once( cmplz_tc_path . '/config/steps.php' );
			require_once( cmplz_tc_path . '/config/questions-wizard.php' );
			require_once( cmplz_tc_path . '/config/documents/documents.php' );
			require_once( cmplz_tc_path . '/config/documents/terms-conditions.php' );

			/**
			 * Preload fields with a filter, to allow for overriding types
			 */
			add_action( 'plugins_loaded', array( $this, 'preload_init' ), 10 );

			/**
			 * The integrations are loaded with priority 10
			 * Because we want to initialize after that, we use 15 here
			 */
			add_action( 'plugins_loaded', array( $this, 'init' ), 15 );
		}

		static function this() {
			return self::$_this;
		}


		public function get_section_by_id( $id ) {

			$steps = $this->steps['terms-conditions'];
			foreach ( $steps as $step ) {
				if ( ! isset( $step['sections'] ) ) {
					continue;
				}
				$sections = $step['sections'];

				//because the step arrays start with one instead of 0, we increase with one
				return array_search( $id, array_column( $sections, 'id' ) ) + 1;
			}

		}

		public function get_step_by_id( $id ) {
			$steps = $this->steps['terms-conditions'];

			//because the step arrays start with one instead of 0, we increase with one
			return array_search( $id, array_column( $steps, 'id' ) ) + 1;
		}


		public function fields(
			$page = false, $step = false, $section = false,
			$get_by_fieldname = false
		) {

			$output = array();
			$fields = $this->fields;
			if ( $page ) {
				$fields = cmplz_tc_array_filter_multidimensional( $this->fields,
					'source', $page );
			}

			foreach ( $fields as $fieldname => $field ) {
				if ( $get_by_fieldname && $fieldname !== $get_by_fieldname ) {
					continue;
				}

				if ( $step ) {
					if ( $section && isset( $field['section'] ) ) {
						if ( ( $field['step'] == $step
						       || ( is_array( $field['step'] )
						            && in_array( $step, $field['step'] ) ) )
						     && ( $field['section'] == $section )
						) {
							$output[ $fieldname ] = $field;
						}
					} else {
						if ( ( $field['step'] == $step )
						     || ( is_array( $field['step'] )
						          && in_array( $step, $field['step'] ) )
						) {
							$output[ $fieldname ] = $field;
						}
					}
				}
				if ( ! $step ) {
					$output[ $fieldname ] = $field;
				}

			}

			return $output;
		}

		public function has_sections( $page, $step ) {
			if ( isset( $this->steps[ $page ][ $step ]["sections"] ) ) {
				return true;
			}

			return false;
		}

		public function preload_init(){
			$this->fields = apply_filters( 'cmplz_fields_load_types', $this->fields );
		}

		public function init() {
			$this->fields = apply_filters( 'cmplz_fields', $this->fields );
			if ( ! is_admin() ) {
				$regions = cmplz_tc_get_regions();
				foreach ( $regions as $region => $label ) {
					if ( !isset( $this->pages[ $region ] ) ) continue;

					foreach ( $this->pages[ $region ] as $type => $data ) {
						$this->pages[ $region ][ $type ]['document_elements']
							= apply_filters( 'cmplz_document_elements',
							$this->pages[ $region ][ $type ]['document_elements'],
							$region, $type, $this->fields() );
					}
				}
			}
		}

		/**
		 * Get an array of languages used on this site in format array('en' => 'en')
		 *
		 * @param bool $count
		 *
		 * @return int|array
		 */

		public function get_supported_languages( $count = false ) {
			$site_locale = cmplz_tc_sanitize_language( get_locale() );

			$languages = array( $site_locale => $site_locale );

			if ( function_exists( 'icl_register_string' ) ) {
				$wpml = apply_filters( 'wpml_active_languages', null, array( 'skip_missing' => 0 ) );
				/**
				 * WPML has changed the index from 'language_code' to 'code' so
				 * we check for both.
				 */
				$wpml_test_index = reset( $wpml );
				if ( isset( $wpml_test_index['language_code'] ) ) {
					$wpml = wp_list_pluck( $wpml, 'language_code' );
				} elseif ( isset( $wpml_test_index['code'] ) ) {
					$wpml = wp_list_pluck( $wpml, 'code' );
				} else {
					$wpml = array();
				}
				$languages = array_merge( $wpml, $languages );
			}

			/**
			 * TranslatePress support
			 * There does not seem to be an easy accessible API to get the languages, so we retrieve from the settings directly
			 */

			if ( class_exists( 'TRP_Translate_Press' ) ) {
				$trp_settings = get_option( 'trp_settings', array() );
				if ( isset( $trp_settings['translation-languages'] ) ) {
					$trp_languages = $trp_settings['translation-languages'];
					foreach ( $trp_languages as $language_code ) {
						$key               = substr( $language_code, 0, 2 );
						$languages[ $key ] = $key;
					}
				}
			}

			if ( $count ) {
				return count( $languages );
			}

			$languages = array_map(array($this, 'format_code_lang'), $languages);
			return $languages;
		}


		/**
		 * Returns the language for a language code.
		 *
		 * @since 3.0.0
		 *
		 * @param string $code Optional. The two-letter language code. Default empty.
		 * @return string The language corresponding to $code if it exists. If it does not exist,
		 *                then the first two letters of $code is returned.
		 */
		public function format_code_lang( $code = '' ) {
			$code       = strtolower( substr( $code, 0, 2 ) );
			$lang_codes = array(
				'aa' => __('Afar','complianz-terms-conditions'),
				'ab' => __('Abkhazian','complianz-terms-conditions'),
				'af' => __('Afrikaans','complianz-terms-conditions'),
				'ak' => __('Akan','complianz-terms-conditions'),
				'sq' => __('Albanian','complianz-terms-conditions'),
				'am' => __('Amharic','complianz-terms-conditions'),
				'ar' => __('Arabic','complianz-terms-conditions'),
				'an' => __('Aragonese','complianz-terms-conditions'),
				'hy' => __('Armenian','complianz-terms-conditions'),
				'as' => __('Assamese','complianz-terms-conditions'),
				'av' => __('Avaric','complianz-terms-conditions'),
				'ae' => __('Avestan','complianz-terms-conditions'),
				'ay' => __('Aymara','complianz-terms-conditions'),
				'az' => __('Azerbaijani','complianz-terms-conditions'),
				'ba' => __('Bashkir','complianz-terms-conditions'),
				'bm' => __('Bambara','complianz-terms-conditions'),
				'eu' => __('Basque','complianz-terms-conditions'),
				'be' => __('Belarusian','complianz-terms-conditions'),
				'bn' => __('Bengali','complianz-terms-conditions'),
				'bh' => __('Bihari','complianz-terms-conditions'),
				'bi' => __('Bislama','complianz-terms-conditions'),
				'bs' => __('Bosnian','complianz-terms-conditions'),
				'br' => __('Breton','complianz-terms-conditions'),
				'bg' => __('Bulgarian','complianz-terms-conditions'),
				'my' => __('Burmese','complianz-terms-conditions'),
				'ca' => __('Catalan; Valencian','complianz-terms-conditions'),
				'ch' => __('Chamorro','complianz-terms-conditions'),
				'ce' => __('Chechen','complianz-terms-conditions'),
				'zh' => __('Chinese','complianz-terms-conditions'),
				'cu' => __('Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic','complianz-terms-conditions'),
				'cv' => __('Chuvash','complianz-terms-conditions'),
				'kw' => __('Cornish','complianz-terms-conditions'),
				'co' => __('Corsican','complianz-terms-conditions'),
				'cr' => __('Cree','complianz-terms-conditions'),
				'cs' => __('Czech','complianz-terms-conditions'),
				'da' => __('Danish','complianz-terms-conditions'),
				'dv' => __('Divehi; Dhivehi; Maldivian','complianz-terms-conditions'),
				'nl' => __('Dutch','complianz-terms-conditions'),
				'dz' => __('Dzongkha','complianz-terms-conditions'),
				'en' => __('English','complianz-terms-conditions'),
				'eo' => __('Esperanto','complianz-terms-conditions'),
				'et' => __('Estonian','complianz-terms-conditions'),
				'ee' => __('Ewe','complianz-terms-conditions'),
				'fo' => __('Faroese','complianz-terms-conditions'),
				'fj' => __('Fijjian','complianz-terms-conditions'),
				'fi' => __('Finnish','complianz-terms-conditions'),
				'fr' => __('French','complianz-terms-conditions'),
				'fy' => __('Western Frisian','complianz-terms-conditions'),
				'ff' => __('Fulah','complianz-terms-conditions'),
				'ka' => __('Georgian','complianz-terms-conditions'),
				'de' => __('German','complianz-terms-conditions'),
				'gd' => __('Gaelic; Scottish Gaelic','complianz-terms-conditions'),
				'ga' => __('Irish','complianz-terms-conditions'),
				'gl' => __('Galician','complianz-terms-conditions'),
				'gv' => __('Manx','complianz-terms-conditions'),
				'el' => __('Greek, Modern','complianz-terms-conditions'),
				'gn' => __('Guarani','complianz-terms-conditions'),
				'gu' => __('Gujarati','complianz-terms-conditions'),
				'ht' => __('Haitian; Haitian Creole','complianz-terms-conditions'),
				'ha' => __('Hausa','complianz-terms-conditions'),
				'he' => __('Hebrew','complianz-terms-conditions'),
				'hz' => __('Herero','complianz-terms-conditions'),
				'hi' => __('Hindi','complianz-terms-conditions'),
				'ho' => __('Hiri Motu','complianz-terms-conditions'),
				'hu' => __('Hungarian','complianz-terms-conditions'),
				'ig' => __('Igbo','complianz-terms-conditions'),
				'is' => __('Icelandic','complianz-terms-conditions'),
				'io' => __('Ido','complianz-terms-conditions'),
				'ii' => __('Sichuan Yi','complianz-terms-conditions'),
				'iu' => __('Inuktitut','complianz-terms-conditions'),
				'ie' => __('Interlingue','complianz-terms-conditions'),
				'ia' => __('Interlingua (International Auxiliary Language Association)','complianz-terms-conditions'),
				'id' => __('Indonesian','complianz-terms-conditions'),
				'ik' => __('Inupiaq','complianz-terms-conditions'),
				'it' => __('Italian','complianz-terms-conditions'),
				'jv' => __('Javanese','complianz-terms-conditions'),
				'ja' => __('Japanese','complianz-terms-conditions'),
				'kl' => __('Kalaallisut; Greenlandic','complianz-terms-conditions'),
				'kn' => __('Kannada','complianz-terms-conditions'),
				'ks' => __('Kashmiri','complianz-terms-conditions'),
				'kr' => __('Kanuri','complianz-terms-conditions'),
				'kk' => __('Kazakh','complianz-terms-conditions'),
				'km' => __('Central Khmer','complianz-terms-conditions'),
				'ki' => __('Kikuyu; Gikuyu','complianz-terms-conditions'),
				'rw' => __('Kinyarwanda','complianz-terms-conditions'),
				'ky' => __('Kirghiz; Kyrgyz','complianz-terms-conditions'),
				'kv' => __('Komi','complianz-terms-conditions'),
				'kg' => __('Kongo','complianz-terms-conditions'),
				'ko' => __('Korean','complianz-terms-conditions'),
				'kj' => __('Kuanyama; Kwanyama','complianz-terms-conditions'),
				'ku' => __('Kurdish','complianz-terms-conditions'),
				'lo' => __('Lao','complianz-terms-conditions'),
				'la' => __('Latin','complianz-terms-conditions'),
				'lv' => __('Latvian','complianz-terms-conditions'),
				'li' => __('Limburgan; Limburger; Limburgish','complianz-terms-conditions'),
				'ln' => __('Lingala','complianz-terms-conditions'),
				'lt' => __('Lithuanian','complianz-terms-conditions'),
				'lb' => __('Luxembourgish; Letzeburgesch','complianz-terms-conditions'),
				'lu' => __('Luba-Katanga','complianz-terms-conditions'),
				'lg' => __('Ganda','complianz-terms-conditions'),
				'mk' => __('Macedonian','complianz-terms-conditions'),
				'mh' => __('Marshallese','complianz-terms-conditions'),
				'ml' => __('Malayalam','complianz-terms-conditions'),
				'mi' => __('Maori','complianz-terms-conditions'),
				'mr' => __('Marathi','complianz-terms-conditions'),
				'ms' => __('Malay','complianz-terms-conditions'),
				'mg' => __('Malagasy','complianz-terms-conditions'),
				'mt' => __('Maltese','complianz-terms-conditions'),
				'mo' => __('Moldavian','complianz-terms-conditions'),
				'mn' => __('Mongolian','complianz-terms-conditions'),
				'na' => __('Nauru','complianz-terms-conditions'),
				'nv' => __('Navajo; Navaho','complianz-terms-conditions'),
				'nr' => __('Ndebele, South; South Ndebele','complianz-terms-conditions'),
				'nd' => __('Ndebele, North; North Ndebele','complianz-terms-conditions'),
				'ng' => __('Ndonga','complianz-terms-conditions'),
				'ne' => __('Nepali','complianz-terms-conditions'),
				'nn' => __('Norwegian Nynorsk; Nynorsk, Norwegian','complianz-terms-conditions'),
				'nb' => __('Bokmål, Norwegian, Norwegian Bokmål','complianz-terms-conditions'),
				'no' => __('Norwegian','complianz-terms-conditions'),
				'ny' => __('Chichewa; Chewa; Nyanja','complianz-terms-conditions'),
				'oc' => __('Occitan, Provençal','complianz-terms-conditions'),
				'oj' => __('Ojibwa','complianz-terms-conditions'),
				'or' => __('Oriya','complianz-terms-conditions'),
				'om' => __('Oromo','complianz-terms-conditions'),
				'os' => __('Ossetian; Ossetic','complianz-terms-conditions'),
				'pa' => __('Panjabi; Punjabi','complianz-terms-conditions'),
				'fa' => __('Persian','complianz-terms-conditions'),
				'pi' => __('Pali','complianz-terms-conditions'),
				'pl' => __('Polish','complianz-terms-conditions'),
				'pt' => __('Portuguese','complianz-terms-conditions'),
				'ps' => __('Pushto','complianz-terms-conditions'),
				'qu' => __('Quechua','complianz-terms-conditions'),
				'rm' => __('Romansh','complianz-terms-conditions'),
				'ro' => __('Romanian','complianz-terms-conditions'),
				'rn' => __('Rundi','complianz-terms-conditions'),
				'ru' => __('Russian','complianz-terms-conditions'),
				'sg' => __('Sango','complianz-terms-conditions'),
				'sa' => __('Sanskrit','complianz-terms-conditions'),
				'sr' => __('Serbian','complianz-terms-conditions'),
				'hr' => __('Croatian','complianz-terms-conditions'),
				'si' => __('Sinhala; Sinhalese','complianz-terms-conditions'),
				'sk' => __('Slovak','complianz-terms-conditions'),
				'sl' => __('Slovenian','complianz-terms-conditions'),
				'se' => __('Northern Sami','complianz-terms-conditions'),
				'sm' => __('Samoan','complianz-terms-conditions'),
				'sn' => __('Shona','complianz-terms-conditions'),
				'sd' => __('Sindhi','complianz-terms-conditions'),
				'so' => __('Somali','complianz-terms-conditions'),
				'st' => __('Sotho, Southern','complianz-terms-conditions'),
				'es' => __('Spanish; Castilian','complianz-terms-conditions'),
				'sc' => __('Sardinian','complianz-terms-conditions'),
				'ss' => __('Swati','complianz-terms-conditions'),
				'su' => __('Sundanese','complianz-terms-conditions'),
				'sw' => __('Swahili','complianz-terms-conditions'),
				'sv' => __('Swedish','complianz-terms-conditions'),
				'ty' => __('Tahitian','complianz-terms-conditions'),
				'ta' => __('Tamil','complianz-terms-conditions'),
				'tt' => __('Tatar','complianz-terms-conditions'),
				'te' => __('Telugu','complianz-terms-conditions'),
				'tg' => __('Tajik','complianz-terms-conditions'),
				'tl' => __('Tagalog','complianz-terms-conditions'),
				'th' => __('Thai','complianz-terms-conditions'),
				'bo' => __('Tibetan','complianz-terms-conditions'),
				'ti' => __('Tigrinya','complianz-terms-conditions'),
				'to' => __('Tonga (Tonga Islands)','complianz-terms-conditions'),
				'tn' => __('Tswana','complianz-terms-conditions'),
				'ts' => __('Tsonga','complianz-terms-conditions'),
				'tk' => __('Turkmen','complianz-terms-conditions'),
				'tr' => __('Turkish','complianz-terms-conditions'),
				'tw' => __('Twi','complianz-terms-conditions'),
				'ug' => __('Uighur; Uyghur','complianz-terms-conditions'),
				'uk' => __('Ukrainian','complianz-terms-conditions'),
				'ur' => __('Urdu','complianz-terms-conditions'),
				'uz' => __('Uzbek','complianz-terms-conditions'),
				've' => __('Venda','complianz-terms-conditions'),
				'vi' => __('Vietnamese','complianz-terms-conditions'),
				'vo' => __('Volapük','complianz-terms-conditions'),
				'cy' => __('Welsh','complianz-terms-conditions'),
				'wa' => __('Walloon','complianz-terms-conditions'),
				'wo' => __('Wolof','complianz-terms-conditions'),
				'xh' => __('Xhosa','complianz-terms-conditions'),
				'yi' => __('Yiddish','complianz-terms-conditions'),
				'yo' => __('Yoruba','complianz-terms-conditions'),
				'za' => __('Zhuang; Chuang','complianz-terms-conditions'),
				'zu' => __('Zulu','complianz-terms-conditions'),
			);


			return strtr( $code, $lang_codes );
		}

	}



} //class closure
