<?php

class Blocksy_Translations_Manager {
	public function init() {
		add_action(
			'customize_save_after',
			[$this, 'register_wpml_translation_keys']
		);

		if (is_admin()) {
			add_action(
				'admin_init',
				[$this, 'register_translation_keys']
			);
		}

		add_action(
			'init',
			function () {
				if (! class_exists('PLL_Translate_Option')) {
					return;
				}

				$prefixes = blocksy_manager()->screen->get_single_prefixes();

				$all_keys = [];

				foreach ($prefixes as $prefix) {
					if (
						$prefix === 'single_blog_post'
						||
						$prefix === 'single_page'
					) {
						continue;
					}

					$related_label = blocksy_get_theme_mod(
						$prefix . '_related_label',
						'__empty__'
					);

					if ($related_label === '__empty__') {
						continue;
					}

					$all_keys[$prefix . '_related_label'] = 1;
				}

				if (empty($all_keys)) {
					return;
				}

				new PLL_Translate_Option('theme_mods_blocksy', $all_keys);
				new PLL_Translate_Option('theme_mods_blocksy-child', $all_keys);

				blocksy_manager()->db->wipe_cache();
			}
		);
	}

	public function get_all_translation_keys() {
		$builder_keys = Blocksy_Manager::instance()->builder->translation_keys();

		foreach (['blog', 'categories', 'search', 'author'] as $prefix) {
			$archive_order = blocksy_get_theme_mod($prefix . '_archive_order', null);

			if (! $archive_order) {
				continue;
			}

			foreach ($archive_order as $single_archive_component) {
				if ($single_archive_component['id'] !== 'read_more') {
					continue;
				}

				if (blocksy_akg('read_more_text', $single_archive_component)) {
					$builder_keys[] = [
						'key' => $prefix . '_archive_read_more_text',
						'value' => blocksy_akg(
							'read_more_text',
							$single_archive_component
						)
					];
				}
			}
		}

		foreach (['blog', 'single_blog_post', 'single_page'] as $prefix) {
			$hero_elements = blocksy_get_theme_mod($prefix . '_hero_elements', null);

			if (! $hero_elements) {
				continue;
			}

			foreach ($hero_elements as $single_hero_component) {
				if (
					$single_hero_component['id'] === 'custom_meta'
					&&
					is_array($single_hero_component['meta_elements'])
				) {
					foreach ($single_hero_component['meta_elements'] as $single_meta_element) {
						if (empty($single_meta_element['label'])) {
							continue;
						}

						$builder_keys[] = [
							'key' => $prefix . '_hero_meta_' . $single_meta_element['id'] . '_label',
							'value' => $single_meta_element['label']
						];
					}
				}

				if (
					$single_hero_component['id'] === 'custom_title'
					&&
					blocksy_akg('title', $single_hero_component)
				) {
					$builder_keys[] = [
						'key' => $prefix . '_hero_custom_title',
						'value' => blocksy_akg('title', $single_hero_component)
					];
				}

				if (
					$single_hero_component['id'] === 'custom_description'
					&&
					blocksy_akg('description', $single_hero_component)
				) {
					$builder_keys[] = [
						'key' => $prefix . '_hero_custom_description',
						'value' => blocksy_akg('description', $single_hero_component)
					];
				}
			}
		}

		return apply_filters(
			'blocksy:translations-manager:all-translation-keys',
			$builder_keys
		);
	}

	public function register_translation_keys() {
		if (! function_exists('pll_register_string')) {
			return;
		}

		$builder_keys = $this->get_all_translation_keys();

		foreach ($builder_keys as $single_key) {
			if (! is_string($single_key['value'])) {
				continue;
			}

			pll_register_string(
				$single_key['key'],
				$single_key['value'],
				'Blocksy',
				isset($single_key['multiline']) ? $single_key['multiline'] : false
			);
		}
	}

	public function register_wpml_translation_keys() {
		if (! function_exists('icl_object_id')) {
			return;
		}

		$builder_keys = $this->get_all_translation_keys();

		foreach ($builder_keys as $single_key) {
			if (! is_string($single_key['value'])) {
				continue;
			}

			do_action(
				'wpml_register_single_string',
				'Blocksy',
				$single_key['key'],
				$single_key['value']
			);
		}
	}
}

if (! function_exists('blocksy_get_all_i18n_languages')) {
	function blocksy_get_all_i18n_languages() {
		$result = [];

		if (function_exists('pll_languages_list')) {
			$locales = pll_languages_list(['fields' => '']);

			foreach ($locales as $locale) {
				$result[] = [
					'id' => $locale->locale,
					'name' => $locale->name
				];
			}
		}

		if (
			! function_exists('pll_languages_list')
			&&
			function_exists('icl_get_languages')
		) {
			$locales = icl_get_languages();

			foreach ($locales as $locale_key => $locale) {
				$result[] = [
					'id' => $locale['default_locale'],
					'name' => $locale['native_name']
				];
			}
		}

		if (class_exists('TRP_Translate_Press')) {
			$settings = new TRP_Settings();
			$settings_array = $settings->get_settings();

			$trp = TRP_Translate_Press::get_trp_instance();

			$trp_languages = $trp->get_component('languages');

			if (current_user_can(apply_filters(
				'trp_translating_capability',
				'manage_options'
			))) {
				$languages_to_display = $settings_array['translation-languages'];
			} else {
				$languages_to_display = $settings_array['publish-languages'];
			}

			$languages_info = $trp_languages->get_language_names(
				$languages_to_display
			);

			foreach ($languages_to_display as $code) {
				$result[] = [
					'id' => $code,
					'name' => $languages_info[$code]
				];
			}
		}

		if (function_exists('weglot_get_current_language')) {
			$languages_available = array_values((array)weglot_get_languages_available())[0];
			$original_language = weglot_get_original_language();
			$destination_languages = array_map(function ($object) {
				return $object['language_to'];
			}, weglot_get_destination_languages());
			$languages_to_display = array_merge(array($original_language), $destination_languages);

			foreach ($languages_to_display as $code) {
				$result[] = [
					'id' => $languages_available[$code]->getExternalCode(),
					'name' => $languages_available[$code]->getLocalName()
				];
			}
		}

		return $result;
	}
}

if (! function_exists('blocksy_get_current_language')) {
	function blocksy_get_current_language($format = 'locale') {
		if ($format === 'slug') {
			if (function_exists('pll_current_language')) {
				return pll_current_language();
			}

			return '__NOT_KNOWN__';
		}

		if (function_exists('pll_current_language')) {
			return pll_current_language('locale');
		}

		if (
			function_exists('icl_get_languages')
			&&
			defined('ICL_LANGUAGE_CODE')
			&&
			isset(icl_get_languages()[ICL_LANGUAGE_CODE])
		) {
			return icl_get_languages()[ICL_LANGUAGE_CODE]['default_locale'];
		}

		global $TRP_LANGUAGE;

		if (
			class_exists('TRP_Translate_Press')
			&&
			isset($TRP_LANGUAGE)
		) {
			return $TRP_LANGUAGE;
		}

		if (function_exists('weglot_get_current_language')) {
			return weglot_get_current_language();
		}

		return '__NOT_KNOWN__';
	}
}

if (! function_exists('blocksy_translate_dynamic')) {
	function blocksy_translate_dynamic($text, $key = null) {
		if (function_exists('pll__')) {
			return pll__($text); // PHPCS:ignore WordPress.WP.I18n
		}

		if ($key) {
			return apply_filters(
				'wpml_translate_single_string',
				$text,
				'Blocksy',
				$key
			);
		}

		return $text;
	}
}

function blocksy_safe_sprintf($format, ...$args) {
	$result = $format;

	$is_error = false;

	// vsprintf() triggers a warning on PHP < 8 and throws an exception on PHP 8+
	// We need to handle both.
	// https://www.php.net/manual/en/function.vsprintf.php#refsect1-function.vsprintf-errors

	set_error_handler(function () use (&$is_error) {
		$is_error = true;
	});

	if (interface_exists('Throwable')) {
		try {
			$result = vsprintf($format, $args);
		} catch (\Throwable $e) {
			$is_error = true;
		}
	} else {
		$result = vsprintf($format, $args);
	}

	restore_error_handler();

	if ($is_error) {
		// TODO: maybe cleanup format from %s, %d, etc
		return $format;
	}

	return $result;
}
