<?php


/**
 * Class Tribe__Events__Integrations__WPML__Utils
 *
 * A utility class offering WPML related convenience methods.
 */
class Tribe__Events__Integrations__WPML__Utils {

	/**
	 * Returns the translation of an array of strings using WPML supported languages to do so.
	 *
	 * @param array  $strings
	 *
	 * @param string $locale    Optional; the locale the strings should be translated to;
	 *                          should be in the "fr_FR" format.
	 *
	 * @return array
	 */
	public static function get_wpml_i18n_strings( array $strings, $locale = null, array $domains = null ) {
		array_multisort( $strings );
		$cache     = new Tribe__Cache();
		$cache_key = 'wpml-i18n-strings_' . md5( serialize( $strings ) . $locale . serialize( $domains ) );

		$cached_translations = $cache->get_transient( $cache_key, 'wpml_updates' );

		if ( ! empty( $cached_translations ) ) {
			return $cached_translations;
		}

		$tec     = Tribe__Events__Main::instance();
		$domains = apply_filters( 'tribe_events_rewrite_i18n_domains', [
			'default'             => true, // Default doesn't need file path
			'the-events-calendar' => $tec->pluginDir . 'lang/',
		] );

		/** @var SitePress $sitepress */
		global $sitepress;

		if ( null === $locale ) { // Grab all languages
			$langs = $sitepress->get_active_languages();

			$languages = [];

			foreach ( $langs as $lang ) {
				$languages[] = $sitepress->get_locale( $lang['code'] );
			}
		} else {
			$languages = [ $locale ];
		}

		// Prevent Duplicates and Empty langs
		$languages = array_filter( array_unique( $languages ) );

		// Query the Current Language
		$current_locale = $sitepress->get_locale( $sitepress->get_current_language() );

		// Get the strings on multiple Domains and Languages
		// WPML filter is unhooked to avoid the locale being set to the default one
		remove_filter( 'locale', [ $sitepress, 'locale_filter' ] );
		$translations = tribe( 'tec.i18n' )->get_i18n_strings( $strings, $languages, $domains, $current_locale );
		add_filter( 'locale', [ $sitepress, 'locale_filter' ] );

		// once an option is updated this cache is deprecated
		$cache->set_transient( $cache_key, $translations, 0, 'wpml_updates' );

		return $translations;
	}


	/**
	 * Fetches the optional post slug translations for a post type.
	 *
	 * WPML allows translating a custom post type slug  when the String Translation
	 * accessory plugin is active.
	 *
	 * @param string $type The custom post type slug.
	 *
	 * @return array An associative array in the format [ <language> => <translation> ] of
	 *               translations for the slug or an empty array if String Translation is not active or
	 *               the post type slug is not translated. Please note that the translation does not
	 *               include the original slug.
	 */
	public static function get_post_slug_translations_for( $type ) {
		/** @var SitePress $sitepress */
		global $sitepress;

		$post_slug_translation_settings = $sitepress->get_setting( 'posts_slug_translation', [] );

		if ( empty( $post_slug_translation_settings['types'][ $type ] )
		     || ! $sitepress->is_translated_post_type( $type )
		) {
			return [];
		}

		/** @var \wpdb $wpdb */
		global $wpdb;

		$results = $wpdb->get_results( $wpdb->prepare( "
						SELECT t.language, t.value
						FROM {$wpdb->prefix}icl_string_translations t
							JOIN {$wpdb->prefix}icl_strings s ON t.string_id = s.id
						WHERE s.name = %s AND t.status = %d
					", 'URL slug: ' . $type, ICL_TM_COMPLETE ) );

		if ( empty( $results ) ) {
			return [];
		}

		return array_combine( wp_list_pluck( $results, 'language' ), wp_list_pluck( $results, 'value' ) );
	}

	/**
	 * Returns an array of currently active locales (other than English).
	 *
	 * Example: [ 'fr_FR', 'de_DE', 'it_IT' ]
	 *
	 * @return array
	 */
	public static function get_active_locales() {
		global $sitepress;

		$locales   = [];
		$languages = $sitepress->get_active_languages();
		unset( $languages['en'] );

		foreach ( $languages as $language_definition ) {
			if ( isset( $language_definition['default_locale'] ) ) {
				$locales[] = $language_definition['default_locale'];
			}
		}

		return $locales;
	}
}
