<?php

namespace WCML\Multicurrency\Shipping;

class ShippingClasses {
	/**
	 * Adds shipping classes for currencies fields to shipping method wp-admin GUI.
	 *
	 * @param array               $field
	 * @param \WCML_Multi_Currency $wcmlMultiCurrency
	 *
	 * @return array
	 */
	public static function addFields( array $field, \WCML_Multi_Currency $wcmlMultiCurrency ) {
		$shippingClasses = WC()->shipping()->get_shipping_classes();
		if ( ! empty( $shippingClasses ) ) {
			foreach ( $wcmlMultiCurrency->get_currency_codes() as $currencyCode ) {
				if ( $wcmlMultiCurrency->get_default_currency() === $currencyCode ) {
					continue;
				}
				foreach ( $shippingClasses as $shippingClass ) {
					$classSourceLanguageCode = self::getSourceLanguageCode( $shippingClass );
					if ( $classSourceLanguageCode === null ) {
						$field = self::addShippingClassField( $field, $shippingClass, $currencyCode );
					} else {
						$field = self::askToSwitchLanguage( $field, $shippingClass, $classSourceLanguageCode );
					}
				}
				$field = self::addNoShippingClassField( $field, $currencyCode );
			}
		}
		return $field;
	}

	/**
	 * Returns source language of the shipping class which was created originally.
	 *
	 * @param \WP_Term $shippingClass
	 *
	 * @return string|null
	 */
	protected static function getSourceLanguageCode( $shippingClass ) {
		$classLanguageDetails = apply_filters( 'wpml_element_language_details', false, [
			'element_id' => $shippingClass->term_id,
			'element_type' => $shippingClass->taxonomy,
		] );
		return $classLanguageDetails->source_language_code ?? null;
	}

	/**
	 * Adds field to the GUI which explains user should switch to the other language to provide the data.
	 *
	 * @param array    $field
	 * @param \WP_Term $shippingClass
	 * @param string   $classSourceLanguageCode
	 *
	 * @return array
	 */
	protected static function askToSwitchLanguage( $field, $shippingClass, $classSourceLanguageCode ) {
		$field[ 'wcml_ask_to_switch_language_' . $shippingClass->term_id ] = [
			'title' => '',
			/* translators: %1$s is a shipping class name and %2$s is a language code */
			'description' => sprintf( __( 'Your shipping class %1$s has been created in %2$s language. Please switch your language if you want to provide shipping costs in different currencies for this class.', 'woocommerce-multilingual' ),
								$shippingClass->name,
								$classSourceLanguageCode),
			'type' => 'title'
		];
		return $field;
	}

	protected static function addShippingClassField( $field, $shippingClass, $currencyCode ) {
		$field[ 'class_cost_' . $shippingClass->term_id . '_' . $currencyCode ] = [
			/* translators: %1$s is a shipping class name and %2$s is a currency code */
			'title'             => sprintf( __( '"%1$s" shipping class cost in %2$s', 'woocommerce-multilingual' ), esc_html( $shippingClass->name ), esc_html( $currencyCode ) ),
			'type'              => 'text',
			'placeholder'       => __( 'N/A', 'woocommerce-multilingual' ),
			'class' => 'wcml-shipping-cost-currency'
		];
		return $field;
	}

	protected static function addNoShippingClassField( $field, $currencyCode ) {
		$field[ 'no_class_cost_' . $currencyCode ] = [
			/* translators: %s is a currency code */
			'title'             => sprintf( __( 'No shipping class cost in %s', 'woocommerce-multilingual' ), esc_html( $currencyCode ) ),
			'type'              => 'text',
			'placeholder'       => __( 'N/A', 'woocommerce-multilingual' ),
			'default'           => '',
			'class' => 'wcml-shipping-cost-currency'
		];
		return $field;
	}
}