<?php

use WPML\UIPage;

/**
 * @author OnTheGo Systems
 */
class WPML_TM_Scripts_Factory {
	private $ate;
	private $ams_api;
	private $auth;
	private $endpoints;
	private $http;
	private $strings;

	public function init_hooks() {
		add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) );
		add_filter( 'wpml_tm_translators_view_strings', array( $this, 'filter_translators_view_strings' ), 10, 2 );
	}

	/**
	 * @throws \InvalidArgumentException
	 */
	public function admin_enqueue_scripts() {
		$this->register_otgs_notices();

		wp_register_script(
			'wpml-tm-settings',
			WPML_TM_URL . '/dist/js/settings/app.js',
			array(),
			WPML_TM_VERSION
		);
		wp_register_script(
			'ate-translation-editor-classic',
			WPML_TM_URL . '/dist/js/ate-translation-editor-classic/app.js',
			array(),
			false,
			true
		);

		if ( WPML_TM_Page::is_tm_dashboard() ) {
			$this->localize_script( 'wpml-tm-dashboard' );
			wp_enqueue_script( 'wpml-tm-dashboard' );
		}
		if (
			WPML_TM_Page::is_tm_translators()
			|| UIPage::isTroubleshooting( $_GET )
		) {
			wp_enqueue_style( 'otgs-notices' );
			$this->localize_script( 'wpml-tm-settings' );
			wp_enqueue_script( 'wpml-tm-settings' );

			$this->create_ate()->init_hooks();
		}
		if ( WPML_TM_Page::is_settings() ) {
			wp_enqueue_style( 'otgs-notices' );
			$this->localize_script( 'wpml-settings-ui' );
			$this->create_ate()->init_hooks();
		}

		if ( WPML_TM_Page::is_translation_queue() && WPML_TM_ATE_Status::is_enabled() ) {
			$this->localize_script( 'ate-translation-queue' );
			wp_enqueue_script( 'ate-translation-queue' );
			wp_enqueue_script( 'ate-translation-editor-classic' );
			wp_enqueue_style( 'otgs-notices' );
		}

		if ( WPML_TM_Page::is_dashboard() ) {
			$this->load_pick_up_box_scripts();
		}

		if ( WPML_TM_Page::is_settings() ) {
			wp_enqueue_style(
				'wpml-tm-multilingual-content-setup',
				WPML_TM_URL . '/res/css/multilingual-content-setup.css',
				array(),
				WPML_TM_VERSION
			);
		}

		if ( WPML_TM_Page::is_notifications_page() ) {
			wp_enqueue_style(
				'wpml-tm-translation-notifications',
				WPML_TM_URL . '/res/css/translation-notifications.css',
				array(),
				WPML_TM_VERSION
			);
		}
	}

	private function load_pick_up_box_scripts() {
		wp_enqueue_style( 'otgs-notices' );

		wp_register_script(
			'wpml-tm-dashboard',
			WPML_TM_URL . '/dist/js/translationDashboard/app.js',
			array(),
			false,
			true
		);

		global $iclTranslationManagement;

		$this->localize_script(
			'wpml-tm-dashboard',
			array(
				'strings'     => array(
					'numberOfTranslationStringsSingle' => __( '%d translation job', 'wpml-translation-management' ),
					'numberOfTranslationStringsMulti'  => __( '%d translation jobs', 'wpml-translation-management' ),
					'stringsSentToTranslationSingle'   => __(
						'%s has been sent to remote translators',
						'wpml-translation-management'
					),
					'stringsSentToTranslationMulti'    => __(
						'%s have been sent to remote translators',
						'wpml-translation-management'
					),

					'buttonText'                       => __( 'Check status and get translations', 'wpml-translation-management' ),
					'progressText'                     => __(
						"Checking translation jobs status. Please don't close this page!",
						'wpml-translation-management'
					),
					'progressJobsCount'                => __( 'You are downloading %d jobs', 'wpml-translation-management' ),

					'statusChecked'                    => __( 'Status checked:', 'wpml-translation-management' ),
					'dismissNotice'                    => __( 'Dismiss this notice.', 'wpml-translation-management' ),
					'noTranslationsDownloaded'         => __(
						'none of your translation jobs have been completed',
						'wpml-translation-management'
					),
					'translationsDownloaded'           => __(
						'%d translation jobs have been finished and applied.',
						'wpml-translation-management'
					),

					'errorMessage'                     => __(
						'A communication error has appeared. Please wait a few minutes and try again.',
						'wpml-translation-management'
					),

					'lastCheck'                        => __( 'Last check: %s', 'wpml-translation-management' ),
					'never'                            => __( 'never', 'wpml-translation-management' ),
				),
				'debug'       => defined( 'WPML_POLLING_BOX_DEBUG_MODE' ) && WPML_POLLING_BOX_DEBUG_MODE,
				'statusIcons' => array(
					'completed'   => $iclTranslationManagement->status2icon_class( ICL_TM_COMPLETE, false ),
					'canceled'    => $iclTranslationManagement->status2icon_class( ICL_TM_NOT_TRANSLATED, false ),
					'progress'    => $iclTranslationManagement->status2icon_class( ICL_TM_IN_PROGRESS, false ),
					'needsUpdate' => $iclTranslationManagement->status2icon_class( ICL_TM_NEEDS_UPDATE, false ),
				),
			)
		);
		wp_enqueue_script( 'wpml-tm-dashboard' );
	}

	public function register_otgs_notices() {
		if ( ! wp_style_is( 'otgs-notices', 'registered' ) ) {
			wp_register_style(
				'otgs-notices',
				ICL_PLUGIN_URL . '/res/css/otgs-notices.css',
				array( 'sitepress-style' )
			);
		}
	}

	/**
	 * @param $handle
	 *
	 * @throws \InvalidArgumentException
	 */
	public function localize_script( $handle, $additional_data = array() ) {
		wp_localize_script( $handle, 'WPML_TM_SETTINGS', $this->build_localize_script_data( $additional_data ) );
	}

	public function build_localize_script_data($additional_data = array()  ) {
		$data = array(
			'hasATEEnabled' => WPML_TM_ATE_Status::is_enabled(),
			'restUrl'       => untrailingslashit( rest_url() ),
			'restNonce'     => wp_create_nonce( 'wp_rest' ),
			'ate'           => $this->create_ate()
			                        ->get_script_data(),
			'currentUser'   => null,
		);

		$data = array_merge( $data, $additional_data );

		$current_user = wp_get_current_user();
		if ( $current_user && $current_user->ID > 0 ) {
			$data['currentUser'] = $current_user;
		}

		return $data;
	}

	/**
	 * @return WPML_TM_MCS_ATE
	 * @throws \InvalidArgumentException
	 */
	public function create_ate() {
		if ( ! $this->ate ) {
			$this->ate = new WPML_TM_MCS_ATE(
				$this->get_authentication(),
				$this->get_endpoints(),
				$this->create_ate_strings()
			);
		}

		return $this->ate;
	}

	private function get_authentication() {
		if ( ! $this->auth ) {
			$this->auth = new WPML_TM_ATE_Authentication();
		}

		return $this->auth;
	}

	private function get_endpoints() {
		if ( ! $this->endpoints ) {
			$this->endpoints = WPML\Container\make( 'WPML_TM_ATE_AMS_Endpoints' );
		}

		return $this->endpoints;
	}

	private function create_ate_strings() {
		if ( ! $this->strings ) {
			$this->strings = new WPML_TM_MCS_ATE_Strings( $this->get_authentication(), $this->get_endpoints() );
		}

		return $this->strings;
	}

	/**
	 * @param array $strings
	 * @param bool  $all_users_have_subscription
	 *
	 * @return array
	 */
	public function filter_translators_view_strings( array $strings, $all_users_have_subscription ) {
		if ( WPML_TM_ATE_Status::is_enabled() ) {
			$strings['ate'] = $this->create_ate_strings()
								->get_status_HTML(
									$this->get_ate_activation_status(),
									$all_users_have_subscription
								);
		}

		return $strings;
	}

	/**
	 * @return string
	 */
	private function get_ate_activation_status() {
		$status = $this->create_ate_strings()
					   ->get_status();
		if ( $status !== WPML_TM_ATE_Authentication::AMS_STATUS_ACTIVE ) {
			$status = $this->fetch_and_update_ate_activation_status();
		}

		return $status;
	}

	/**
	 * @return string
	 */
	private function fetch_and_update_ate_activation_status() {
		$ams_api = WPML\Container\make( WPML_TM_AMS_API::class );
		$ams_api->get_status();

		return $this->create_ate_strings()
					->get_status();
	}
}
