<?php
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * The Gutentor theme hooks callback functionality of the plugin.
 *
 * @link       https://www.gutentor.com/
 * @since      1.0.0
 *
 * @package    Gutentor
 */

/**
 * The Gutentor theme hooks callback functionality of the plugin.
 *
 * Since Gutentor theme is hooks base theme, this file is main callback to add/remove/edit the functionality of the Gutentor Plugin
 *
 * @package    Gutentor
 * @author     Gutentor <info@gutentor.com>
 */
class Gutentor_Hooks {

	/**
	 * The ID of this plugin.
	 *
	 * @since    1.0.0
	 * @access   private
	 * @var      string    $plugin_name    The ID of this plugin.
	 */
	private $plugin_name;

	/**
	 * The version of this plugin.
	 *
	 * @since    1.0.0
	 * @access   private
	 * @var      string    $version    The current version of this plugin.
	 */
	private $version;

	/**
	 * Library loaded
	 * Check it Library Loaded
	 *
	 * @since    2.1.2
	 * @access   public
	 * @var      string    $library_loaded
	 */
	public $library_loaded = false;

	/**
	 * Initialize the class and set its properties.
	 *
	 * @since    1.0.0
	 */
	public function __construct() {}

	/**
	 * Main Gutentor_Hooks Instance
	 * Initialize the class and set its properties.
	 *
	 * @since    1.0.0
	 * @return object $instance Gutentor_Hooks Instance
	 */
	public static function instance() {

		// Store the instance locally to avoid private static replication.
		static $instance = null;

		// Only run these methods if they haven't been ran previously.
		if ( null === $instance ) {
			$instance              = new Gutentor_Hooks();
			$instance->plugin_name = GUTENTOR_PLUGIN_NAME;
			$instance->version     = GUTENTOR_VERSION;
		}

		// Always return the instance.
		return $instance;
	}

	/**
	 * Get Thumbnail all sizes.
	 *
	 * @since 2.0.0
	 */
	public static function get_thumbnail_all_sizes() {

		$sizes       = get_intermediate_image_sizes();
		$image_sizes = array();

		$image_sizes[] = array(
			'value' => 'full',
			'label' => esc_html__( 'Full', 'gutentor' ),
		);

		foreach ( $sizes as $size ) {
			if ( in_array( $size, array( 'thumbnail', 'medium', 'medium_large', 'large' ), true ) ) {
				$image_sizes[] = array(
					'value' => $size,
					'label' => ucwords( trim( str_replace( array( '-', '_' ), array( ' ', ' ' ), $size ) ) ),
				);
			}
		}
		return $image_sizes;
	}

	/**
	 * Get Thumbnail all sizes.
	 *
	 * @since 2.0.0
	 */
	public static function get_updated_thumbnail_all_sizes() {

		$sizes       = get_intermediate_image_sizes();
		$image_sizes = array();

		$image_sizes[] = array(
			'value' => 'full',
			'label' => esc_html__( 'Full', 'gutentor' ),
		);

		foreach ( $sizes as $size ) {
			$image_sizes[] = array(
				'value' => $size,
				'label' => ucwords( trim( str_replace( array( '-', '_' ), array( ' ', ' ' ), $size ) ) ),
			);
		}
		return $image_sizes;
	}

	/**
	 * Callback functions for block_categories,
	 * Adding Block Categories
	 *
	 * @since    1.0.0
	 * @access   public
	 *
	 * @param array $categories
	 * @return array
	 */
	public function add_block_categories( $categories ) {

		return array_merge(
			array(
				array(
					'slug'  => 'gutentor-elements',
					'title' => __( 'Gutentor Elements', 'gutentor' ),
				),
				array(
					'slug'  => 'gutentor-modules',
					'title' => __( 'Gutentor Modules', 'gutentor' ),
				),
				array(
					'slug'  => 'gutentor-posts',
					'title' => __( 'Gutentor Posts', 'gutentor' ),
				),
				array(
					'slug'  => 'gutentor-terms',
					'title' => __( 'Gutentor Terms', 'gutentor' ),
				),
				array(
					'slug'  => 'gutentor',
					'title' => __( 'Gutentor Widgets', 'gutentor' ),
				),
			),
			$categories
		);
	}

	/**
	 * Callback functions for after_setup_theme,
	 * Add Gutentor global color palette
	 *
	 * @since    3.0.0
	 * @access   public
	 *
	 * @return void
	 */
	public function add_color_palette() {
		$global_colors = gutentor_get_options( 'color-palettes' );
		if ( ! empty( $global_colors ) ) {

			// Get the current set of colors.
			$colors = get_theme_support( 'editor-color-palette' );
			if ( isset( $colors[0] ) ) {
				$colors = $colors[0];
			}

			// If no colors, create defaults.
			if ( empty( $colors ) ) {
				$colors = array(
					array(
						'name'  => __( 'Black', 'gutentor' ),
						'slug'  => 'black',
						'color' => '#000000',
					),
					array(
						'name'  => __( 'Dark Gray', 'gutentor' ),
						'slug'  => 'dark-gray',
						'color' => '#A9A9A9',
					),
					array(
						'name'  => __( 'Silver', 'gutentor' ),
						'slug'  => 'silver',
						'color' => '#C0C0C0',
					),
					array(
						'name'  => __( 'White Smoke', 'gutentor' ),
						'slug'  => 'white-smoke',
						'color' => '#F5F5F5',
					),
					array(
						'name'  => __( 'White', 'gutentor' ),
						'slug'  => 'white',
						'color' => '#ffffff',
					),
					array(
						'name'  => __( 'Pink', 'gutentor' ),
						'slug'  => 'pink',
						'color' => '#FFC0CB',
					),
					array(
						'name'  => __( 'LightPink', 'gutentor' ),
						'slug'  => 'light-pink',
						'color' => '#FFB6C1',
					),
					array(
						'name'  => __( 'Orchid', 'gutentor' ),
						'slug'  => 'orchid',
						'color' => '#DA70D6',
					),
					array(
						'name'  => __( 'Violet', 'gutentor' ),
						'slug'  => 'violet',
						'color' => '#EE82EE',
					),
					array(
						'name'  => __( 'Sky Blue', 'gutentor' ),
						'slug'  => 'sky-blue',
						'color' => '#87CEEB',
					),
					array(
						'name'  => __( 'Light Cyan', 'gutentor' ),
						'slug'  => 'light-cyan',
						'color' => '#E0FFFF',
					),
					array(
						'name'  => __( 'PaleGreen', 'gutentor' ),
						'slug'  => 'pale-green',
						'color' => '#98FB98',
					),
					array(
						'name'  => __( 'Blue', 'gutentor' ),
						'slug'  => 'blue',
						'color' => '#0000FF',
					),
					array(
						'name'  => __( 'Navy', 'gutentor' ),
						'slug'  => 'navy',
						'color' => '#000080',
					),
					array(
						'name'  => __( 'Orange', 'gutentor' ),
						'slug'  => 'orange',
						'color' => '#FFA500',
					),
					array(
						'name'  => __( 'Dark Orange	', 'gutentor' ),
						'slug'  => 'dark-orange	',
						'color' => '#FF8C00',
					),
					array(
						'name'  => __( 'Tomato	', 'gutentor' ),
						'slug'  => 'tomato',
						'color' => '#FF6347',
					),
					array(
						'name'  => __( 'Maroon	', 'gutentor' ),
						'slug'  => 'maroon',
						'color' => '#800000',
					),

				);
			}

			if ( empty( $global_colors ) ) {
				$global_colors = array();
			}

			// Append our global colors with the theme/default ones.
			if ( is_array( $global_colors ) ) {
				$colors = array_merge( $colors, $global_colors );
			}
			add_theme_support( 'editor-color-palette', $colors );
		}
	}

	/**
	 * Callback functions for init,
	 * Register scripts and styles
	 *
	 * @since    2.1.2
	 * @access   public
	 *
	 * @return void
	 */
    function register_script_style(){ // phpcs:ignore
		/*Animate CSS*/
		wp_register_style(
			'animate',
			GUTENTOR_URL . 'assets/library/animatecss/animate.min.css',
			array(),
			'3.7.2'
		);

		/*CountUP JS*/
		wp_register_script(
			'countUp', // Handle.
			GUTENTOR_URL . 'assets/library/countUp/countUp.min.js',
			array( 'jquery' ), // Dependencies.
			'1.9.3', // Version.
			true // Enqueue the script in the footer.
		);

		/*flexMenu*/
		wp_register_script(
			'flexMenu', // Handle.
			GUTENTOR_URL . 'assets/library/flexMenu/flexmenu.min.js',
			array( 'jquery' ), // Dependencies
			'1.6.2', // Version: File modification time.
			true // Enqueue the script in the footer.
		);

		/*FontAwesome CSS*/
		if ( 4 == gutentor_get_options( 'fa-version' ) ) {
			wp_register_style(
				'fontawesome', // Handle.
				GUTENTOR_URL . 'assets/library/font-awesome-4.7.0/css/font-awesome.min.css',
				array(),
				'4'
			);
		} else {
			wp_register_style(
				'fontawesome', // Handle.
				GUTENTOR_URL . 'assets/library/fontawesome/css/all.min.css',
				array(),
				'5.12.0'
			);
		}

		/*Isotope Js*/
		wp_register_script(
			'isotope', // Handle.
			GUTENTOR_URL . 'assets/library/isotope/isotope.pkgd.min.js',
			array( 'jquery' ), // Dependencies, defined above.
			'3.0.6', // Version: File modification time.
			true // Enqueue the script in the footer.
		);

		/*jquery-easypiechart Js*/
		wp_register_script(
			'jquery-easypiechart', // Handle.
			GUTENTOR_URL . 'assets/library/jquery-easypiechart/jquery.easypiechart.min.js',
			array( 'jquery' ), // Dependencies, defined above.
			'2.1.7', // Version: File modification time.
			true // Enqueue the script in the footer.
		);

		/*Magnific Popup CSS*/
		wp_register_style(
			'magnific-popup',
			GUTENTOR_URL . 'assets/library/magnific-popup/magnific-popup.min.css',
			array(),
			'1.8.0'
		);
		wp_style_add_data( 'magnific-popup', 'rtl', 'replace' );

		/*Magnific Popup JS*/
		wp_register_script(
			'magnific-popup', // Handle.
			GUTENTOR_URL . 'assets/library/magnific-popup/jquery.magnific-popup.min.js',
			array( 'jquery' ), // Dependencies, defined above.
			'1.8.0', // Version: File modification time.
			true // Enqueue the script in the footer.
		);

		/*Slick CSS*/
		wp_register_style(
			'slick',
			GUTENTOR_URL . 'assets/library/slick/slick.min.css',
			array(),
			'1.8.1'
		);

		/*Slick JS*/
		wp_register_script(
			'slick', // Handle.
			GUTENTOR_URL . 'assets/library/slick/slick.min.js',
			array( 'jquery' ), // Dependencies, defined above.
			'1.8.1', // Version: File modification time.
			true // Enqueue the script in the footer.
		);

		/*sticky sidebar*/
		wp_register_script(
			'theia-sticky-sidebar', // Handle.
			GUTENTOR_URL . 'assets/library/theia-sticky-sidebar/theia-sticky-sidebar.min.js',
			array( 'jquery' ), // Dependencies
			'1.7.0', // Version
			true // Enqueue the script in the footer.
		);

		/*Wow js*/
		wp_register_script(
			'wow', // Handle.
			GUTENTOR_URL . 'assets/library/wow/wow.min.js',
			array( 'jquery' ), // Dependencies
			'1.2.1', // Version: File modification time.
			true // Enqueue the script in the footer.
		);

		/*AcmeTicker*/
		wp_register_script(
			'acmeticker', // Handle.
			GUTENTOR_URL . 'assets/library/acmeticker/acmeticker.min.js',
			array( 'jquery' ), // Dependencies
			'1.0.0', // Version
			true // Enqueue the script in the footer.
		);
		/* Wpness Grid Styles*/
		wp_register_style(
			'wpness-grid',
			GUTENTOR_URL . 'assets/library/wpness-grid/wpness-grid' . GUTENTOR_SCRIPT_PREFIX . '.css',
			array(),
			'1.0.0'
		);
		/*
		Gutentor Specific CSS/JS */
		wp_register_style(
			'gutentor', // Handle.
			GUTENTOR_URL . 'dist/blocks.style.build.css',
			array( 'wp-editor', 'dashicons' ), // Dependency to include the CSS after it.
			GUTENTOR_VERSION // Version: File modification time.
		);

		/*Gutentor Woo CSS/JS*/
		wp_register_style(
			'gutentor-woo', // Handle.
			GUTENTOR_URL . 'dist/gutentor-woocommerce.css',
			array( 'wp-editor' ), // Dependency to include the CSS after it.
			GUTENTOR_VERSION // Version: File modification time.
		);

		/*Gutentor Edd CSS/JS*/
		wp_register_style(
			'gutentor-edd', // Handle.
			GUTENTOR_URL . 'dist/gutentor-edd.css',
			array( 'wp-editor' ), // Dependency to include the CSS after it.
			GUTENTOR_VERSION // Version: File modification time.
		);

		/*
			Google Map JS
			Load Frontend only
			Used By:
			gutentor/google-map
			gutentor/e4
			*/
		// Get the API key
		if ( gutentor_get_options( 'map-api' ) ) {
			$apikey = gutentor_get_options( 'map-api' );
		} else {
			$apikey = false;
		}

		// Don't output anything if there is no API key.
		if ( ! ( null === $apikey || empty( $apikey ) ) ) {
			wp_register_script(
				'gutentor-google-maps',
				GUTENTOR_URL . 'assets/js/google-map-loader' . GUTENTOR_SCRIPT_PREFIX . '.js',
				array( 'jquery' ), // Dependencies, defined above.
				'1.0.0',
				true
			);

			wp_register_script(
				'google-maps',
				'https://maps.googleapis.com/maps/api/js?key=' . $apikey . '&libraries=places&callback=initMapScript',
				array( 'gutentor-google-maps' ),
				'1.0.0',
				true
			);
		}

		wp_register_script(
			'gutentor-block', // Handle.
			GUTENTOR_URL . 'assets/js/gutentor' . GUTENTOR_SCRIPT_PREFIX . '.js',
			array( 'jquery' ), // Dependencies, defined above.
			GUTENTOR_VERSION, // Version: File modification time.
			true // Enqueue the script in the footer.
		);
		/*CSS for default/popular themes*/
		$templates        = array( 'twentynineteen', 'twentytwenty', 'generatepress', 'astra' );
		$current_template = get_template();
		if ( in_array( $current_template, $templates ) ) {
			wp_register_style(
				'gutentor-theme-' . esc_attr( $current_template ), // Handle.
				GUTENTOR_URL . 'dist/gutentor-' . esc_attr( $current_template ) . '.css',
				array(), // Dependency to include the CSS after it.
				GUTENTOR_VERSION // Version: File modification time.
			);
			wp_style_add_data( 'gutentor-theme-' . esc_attr( $current_template ), 'rtl', 'replace' );
		}
	}

	/**
	 * Load scripts and styles
	 *
	 * @since    2.1.2
	 * @access   public
	 *
	 * @return void
	 */
	function load_lib_assets() {

		if ( ! is_admin() ) {

			/*
			fontawesome CSS
			load front end and backend
			Reason: Common for many blocks
			*/
			wp_enqueue_style( 'fontawesome' );
			wp_style_add_data( 'fontawesome', 'rtl', 'replace' );

			/*
			wpness grid Needed for Admin and Frontend.
			Reason: Common for many blocks*/
			wp_enqueue_style( 'wpness-grid' );
			wp_style_add_data( 'wpness-grid', 'rtl', 'replace' );

			/*
			Animate CSS
			load front
			Reason: needed on all blocks since animate option is everywhere
			*/
			wp_enqueue_style( 'animate' );
			wp_style_add_data( 'animate', 'rtl', 'replace' );

			/*
			Wow is needed for Animate CSS
			Reason: needed on all blocks since animate option is everywhere*/
			wp_enqueue_script( 'wow' );

		} else {
			/*
			fontawesome CSS
			load front end and backend
			Reason: Common for many blocks
			*/
			wp_enqueue_style( 'fontawesome' );
			wp_style_add_data( 'fontawesome', 'rtl', 'replace' );

			/*wpness grid Needed for Admin and Frontend*/
			wp_enqueue_style( 'wpness-grid' );
			wp_style_add_data( 'wpness-grid', 'rtl', 'replace' );
		}

		$this->library_loaded = true;
		if ( gutentor_is_edit_page() ) {
			$this->load_last_scripts();
		} else {
			/* Check this TODO */
			wp_enqueue_style( 'gutentor' );
			wp_style_add_data( 'gutentor', 'rtl', 'replace' );
		}
	}
	/**
	 * Callback functions for enqueue_block_assets,
	 * Enqueue Gutenberg block assets for both frontend + backend.
	 *
	 * @since    1.0.0
	 * @access   public
	 *
	 * @return void
	 */
	function block_assets() { // phpcs:ignore

		$this->load_lib_assets();

		// Editor styles loaded via enqueue_block_assets for apiVersion 3 iframe compatibility.
		if ( is_admin() ) {
			wp_enqueue_style(
				'gutentor-editor',
				GUTENTOR_URL . 'dist/blocks.editor.build.css',
				array( 'wp-edit-blocks', 'dashicons', 'fontawesome' ),
				GUTENTOR_VERSION
			);
			wp_style_add_data( 'gutentor-editor', 'rtl', 'replace' );
		}
	}

	/**
	 * Load gutentor scripts at last
	 * Because it has lot of dependency
	 *
	 * @since    2.1.2
	 * @access   public
	 *
	 * @return void|boolean
	 */
	function load_last_scripts() {
		if ( ! $this->library_loaded && ! function_exists( 'gutentor_template' ) ) {
			return false;
		}

		/* Check this TODO */
		wp_enqueue_style( 'gutentor' );
		wp_style_add_data( 'gutentor', 'rtl', 'replace' );

		/*For WooCommerce*/
		if ( gutentor_is_woocommerce_active() ) {
			wp_enqueue_style( 'gutentor-woo' );
			wp_style_add_data( 'gutentor-woo', 'rtl', 'replace' );
		}

		/*For Edd*/
		if ( gutentor_is_edd_active() ) {
			wp_enqueue_style( 'gutentor-edd' );
			wp_style_add_data( 'gutentor-edd', 'rtl', 'replace' );
		}

		/*CSS for default/popular themes*/
		$templates        = array( 'twentynineteen', 'twentytwenty', 'generatepress', 'astra' );
		$current_template = get_template();
		if ( in_array( $current_template, $templates ) ) {
			wp_enqueue_style( 'gutentor-theme-' . esc_attr( $current_template ) );
			wp_style_add_data( 'gutentor-theme-' . esc_attr( $current_template ), 'rtl', 'replace' );
		}

		/*Reusable block fixed*/
		$reusable_blocks = gutentor_get_reusable_block_ids();
		if ( ! isset( $GLOBALS['GUTENTOR_GLOBAL']['reusable_block'] ) ) {
			$GLOBALS['GUTENTOR_GLOBAL']['reusable_block'] = $reusable_blocks;
		} else {
			$reusable_blocks                              = array_merge( $GLOBALS['GUTENTOR_GLOBAL']['reusable_block'], $reusable_blocks );
			$GLOBALS['GUTENTOR_GLOBAL']['reusable_block'] = $reusable_blocks;
		}
		if ( $reusable_blocks ) {
			$upload_dir = wp_upload_dir();
			foreach ( $reusable_blocks as $reusable_block ) {
				if ( file_exists( $upload_dir['basedir'] . '/gutentor/p-' . $reusable_block . '.css' ) ) {
					$css_info = get_post_meta( $reusable_block, 'gutentor_css_info', true );
					wp_enqueue_style( 'gutentor-dynamic-' . $reusable_block, trailingslashit( $upload_dir['baseurl'] ) . 'gutentor/p-' . $reusable_block . '.css', false, isset( $css_info['saved_version'] ) ? $css_info['saved_version'] : '' );
				}
			}
		}

		wp_enqueue_script( 'gutentor-block' );
		wp_localize_script(
			'gutentor-block',
			'gutentorLS',
			apply_filters(
				'gutentor_block_frontend_localize_data',
				array(
					'fontAwesomeVersion' => gutentor_get_options( 'fa-version' ),
					'restNonce'          => wp_create_nonce( 'wp_rest' ),
					'restUrl'            => esc_url_raw( rest_url() ),
				)
			)
		);
	}

	/**
	 * Callback functions for enqueue_block_editor_assets,
	 * Enqueue Gutenberg block assets for backend only.
	 *
	 * @since    1.0.0
	 * @access   public
	 *
	 * @return void
	 */
	public function block_editor_assets() { // phpcs:ignore
		if ( ! is_admin() ) {
			return;
		}
		// edd wishlist scripts loads in backend
		if ( function_exists( 'edd_wl_print_scripts' ) ) {
			edd_wl_print_scripts();
		}
		global $pagenow;

		$dependencies = array( 'jquery', 'lodash', 'wp-api', 'wp-i18n', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-element', 'wp-keycodes', 'wp-plugins', 'wp-rich-text', 'wp-viewport' );
		if ( gutentor_is_edit_page() ) {
			array_push( $dependencies, 'wp-editor', 'wp-edit-post' );
		} elseif ( $pagenow === 'widgets.php' ) {
			array_push( $dependencies, 'wp-edit-widgets' );
		}

			// Scripts.
		wp_enqueue_script(
			'gutentor', // Handle.
			GUTENTOR_URL . 'dist/blocks.build.js', // Block.build.js: We register the block here. Built with Webpack.
			$dependencies, // Dependencies, defined above.
			GUTENTOR_VERSION, // Version: File modification time.
			true // Enqueue the script in the footer.
		);

		wp_set_script_translations( 'gutentor', 'gutentor' );
		$localize__data = apply_filters(
			'gutentor_block_editor_localize_data',
			array(
				'currentTheme'                    => get_template(),
				'currentScreen'                   => get_current_screen(),
				'postModuleGlobalCategoriesColor' => gutentor_pm_post_categories_color( true ),
				'thumbnailAllSizes'               => self::get_thumbnail_all_sizes(),
				'updatedThumbnailAllSizes'        => self::get_updated_thumbnail_all_sizes(),
				'mapsAPI'                         => gutentor_get_options( 'map-api' ),
				'dirUrl'                          => GUTENTOR_URL,
				'gutentorLogo'                    => GUTENTOR_URL . 'assets/img/gutentor-logo.png',
				'iconSvg'                         => GUTENTOR_URL . 'assets/img/block-icons/icon.svg',
				'singleColSvg'                    => GUTENTOR_URL . 'assets/img/block-icons/single-column.svg',
				'pricingSvg'                      => GUTENTOR_URL . 'assets/img/block-icons/pricing.svg',
				'simpleTextSvg'                   => GUTENTOR_URL . 'assets/img/block-icons/simple-text.svg',
				'coverSvg'                        => GUTENTOR_URL . 'assets/img/block-icons/cover.svg',
				'carouselSvg'                     => GUTENTOR_URL . 'assets/img/block-icons/carousel.svg',
				'sliderSvg'                       => GUTENTOR_URL . 'assets/img/block-icons/slider.svg',
				'openHoursSvg'                    => GUTENTOR_URL . 'assets/img/block-icons/opening-hours.svg',
				'notificationSvg'                 => GUTENTOR_URL . 'assets/img/block-icons/notification.svg',
				'advancedTextSvg'                 => GUTENTOR_URL . 'assets/img/block-icons/advance-text.svg',
				'featuredSvg'                     => GUTENTOR_URL . 'assets/img/block-icons/featured-block.svg',
				'tabSvg'                          => GUTENTOR_URL . 'assets/img/block-icons/tabs.svg',
				'counterSvg'                      => GUTENTOR_URL . 'assets/img/block-icons/counter.svg',
				'contentBoxSvg'                   => GUTENTOR_URL . 'assets/img/block-icons/content-box.svg',
				'buttonSvg'                       => GUTENTOR_URL . 'assets/img/block-icons/button.svg',
				'buttonGroupSvg'                  => GUTENTOR_URL . 'assets/img/block-icons/button-group.svg',
				'dynamicColSvg'                   => GUTENTOR_URL . 'assets/img/block-icons/dynamic-col.svg',
				'advancedColSvg'                  => GUTENTOR_URL . 'assets/img/block-icons/advanced-col.svg',
				'AdvPostSvg'                      => GUTENTOR_URL . 'assets/img/block-icons/advanced-post-module.svg',
				'newsTickerSvg'                   => GUTENTOR_URL . 'assets/img/block-icons/news-ticker.svg',
				'postFeaturedModuleSvg'           => GUTENTOR_URL . 'assets/img/block-icons/post-feature-module.svg',
				'postModuleSvg'                   => GUTENTOR_URL . 'assets/img/block-icons/post-module.svg',
				'duplexPostModuleSvg'             => GUTENTOR_URL . 'assets/img/block-icons/duplex-post-module.svg',
				/*widget blocks*/
				'aboutSvgW'                       => GUTENTOR_URL . 'assets/img/block-icons/about.svg',
				'authorSvgW'                      => GUTENTOR_URL . 'assets/img/block-icons/author.svg',
				'calltoactionSvgW'                => GUTENTOR_URL . 'assets/img/block-icons/calltoaction.svg',
				'countdownSvgW'                   => GUTENTOR_URL . 'assets/img/block-icons/countdown.svg',
				'dividerSvgW'                     => GUTENTOR_URL . 'assets/img/block-icons/divider.svg',
				'gallerySvgW'                     => GUTENTOR_URL . 'assets/img/block-icons/gallery.svg',
				'imageSvgW'                       => GUTENTOR_URL . 'assets/img/block-icons/image.svg',
				'listSvgW'                        => GUTENTOR_URL . 'assets/img/block-icons/list.svg',
				'mapSvgW'                         => GUTENTOR_URL . 'assets/img/block-icons/map.svg',
				'restaurantmenuSvgW'              => GUTENTOR_URL . 'assets/img/block-icons/restaurantmenu.svg',
				'progressbarSvgW'                 => GUTENTOR_URL . 'assets/img/block-icons/progressbar.svg',
				'ratingSvgW'                      => GUTENTOR_URL . 'assets/img/block-icons/rating.svg',
				'showmoreSvgW'                    => GUTENTOR_URL . 'assets/img/block-icons/showmore.svg',
				'socialSvgW'                      => GUTENTOR_URL . 'assets/img/block-icons/social.svg',
				'teamSvgW'                        => GUTENTOR_URL . 'assets/img/block-icons/team.svg',
				'testimonialsSvgW'                => GUTENTOR_URL . 'assets/img/block-icons/testimonial.svg',
				'timelineSvgW'                    => GUTENTOR_URL . 'assets/img/block-icons/timeline.svg',
				'videoSvgW'                       => GUTENTOR_URL . 'assets/img/block-icons/video.svg',
				'defaultImage'                    => GUTENTOR_URL . 'assets/img/default-image.jpg',
				'previewOnFrontendImg'            => GUTENTOR_URL . 'assets/img/preview-on-frontend.jpg',
				'gutentorSvg'                     => GUTENTOR_URL . 'assets/img/gutentor.svg',
				'gutentorWhiteSvg'                => GUTENTOR_URL . 'assets/img/gutentor-white-logo.svg',
				'gutentorBlackSvg'                => GUTENTOR_URL . 'assets/img/gutentor-black-logo.svg',
				'm6Svg'                           => GUTENTOR_URL . 'assets/img/block-icons/accordion-module.svg',
				'm9Svg'                           => GUTENTOR_URL . 'assets/img/block-icons/shortcode.svg',
				'templateLibrarySvg'              => GUTENTOR_URL . 'assets/img/block-icons/template-library.svg',
				'm12Svg'                          => GUTENTOR_URL . 'assets/img/block-icons/quote.svg',
				'm13Svg'                          => GUTENTOR_URL . 'assets/img/block-icons/toc.svg',
				'fontAwesomeVersion'              => gutentor_get_options( 'fa-version' ),
				'checkPostFormatSupport'          => gutentor_check_post_format_support_enable(),
				'postFormats'                     => gutentor_get_post_formats(),
				'postFormatsIcons'                => gutentor_get_all_post_format_icons(),
				'postFormatsColors'               => gutentor_post_format_colors( true ),
				'postFeaturedFormatsColors'       => gutentor_post_featured_format_colors(),
				'is_woocommerce_active'           => gutentor_is_woocommerce_active(),
				'enableEditorTemplateLibrary'     => gutentor_setting_enable_template_library(),
				'enableExportButton'              => gutentor_setting_enable_export_template_button(),
				'gutentorPro'                     => array(
					'active' => gutentor_pro_active(),
				),
				'edd'                             => array(
					'active'   => gutentor_is_edd_active(),
					'review'   => gutentor_is_edd_review_active(),
					'wishlist' => gutentor_is_edd_wishlist_active(),
				),
				'templateberg'                    => array(
					'active'  => gutentor_is_templateberg_active(),
					'account' => gutentor_templateberg_has_account(),
					'notice'  => gutentor_templateberg()->can_show_notification(),
					'loading' => false,
					'error'   => false,
				),
				'gActiveProTemplates'             => apply_filters(
					'gutentor_is_pro_active',
					array(
						'Gutentor' => false,
					)
				),
				'globalTypography'                => gutentor_get_global_typography(),
				'globalColor'                     => gutentor_get_global_color(),
				'globalContainerWidth'            => gutentor_get_global_container_width(),
				'blockNameShortFullForm'          => gutentor_block_name_short_full_form(),
				'typo-apply-options'              => gutentor_get_options( 'typo-apply-options' ),
				'color-palettes'                  => gutentor_get_options( 'color-palettes' ),
				'isEditPage'                      => gutentor_is_edit_page(),
				'nonce'                           => wp_create_nonce( 'gutentorNonce' ),
			)
		);
		wp_localize_script(
			'gutentor',
			'gutentor',
			$localize__data
		);

		// Scripts.
		wp_enqueue_script(
			'gutentor-editor', // Handle.
			GUTENTOR_URL . 'assets/js/block-editor' . GUTENTOR_SCRIPT_PREFIX . '.js',
			array( 'jquery' ), // Dependencies, defined above.
			GUTENTOR_VERSION, // Version: File modification time.
			true // Enqueue the script in the footer.
		);

		/*Frontend styles*/
		wp_enqueue_style( 'gutentor' );
		wp_style_add_data( 'gutentor', 'rtl', 'replace' );
	}

	/**
	 * Callback functions for customize_preview_init,
	 *
	 * @since    3.2.3
	 * @access   public
	 *
	 * @return void
	 */
	public function customize_preview_init() {
		wp_enqueue_script( 'gutentor-customizer', GUTENTOR_URL . '/assets/js/customizer.js', array( 'customize-preview', 'customize-selective-refresh', 'wp-data' ), GUTENTOR_VERSION, true );
	}

	/**
	 * Callback functions for body_class,
	 * Adding Body Class.
	 *
	 * @since    1.0.0
	 * @access   public
	 *
	 * @param array $classes array of classes.
	 * @return array
	 */
	function add_body_class( $classes ) {
		$classes[] = 'gutentor-active';
		return $classes;
	}

	/**
	 * Callback functions for admin_body_class,
	 * Adding Admin Body Class.
	 *
	 * @param string $classes space-separated string of classes.
	 * @return string
	 * @since    1.0.0
	 * @access   public
	 */
	function add_admin_body_class( $classes ) {
		$classes                 .= ' gutentor-active ';
		$disable_full_with_editor = gutentor_get_options( 'wide-width-editor' );
		if ( current_theme_supports( 'align-wide' ) && ! $disable_full_with_editor ) {
			$classes = gutentor_concat_space( $classes, ' gutentor-wide-width ' );
		}
		return $classes;
	}

	/**
	 * Create Page Template
	 *
	 * @param array $templates
	 * @return array
	 */
	function gutentor_add_page_template( $templates ) {
		$templates['template-gutentor-full-width.php'] = esc_html__( 'Gutentor Full Width', 'gutentor' );
		$templates['template-gutentor-canvas.php']     = esc_html__( 'Gutentor Canvas', 'gutentor' );
		return $templates;
	}

	/**
	 * Redirect Custom Page Template
	 *
	 * @param string $template
	 * @return string
	 */
	function gutentor_redirect_page_template( $template ) {
		$post          = get_post();
		$page_template = '';
		if ( $post->ID ) {
			$page_template = get_post_meta( $post->ID, '_wp_page_template', true );
		}
		$g_template = false;
		if ( 'template-gutentor-full-width.php' == basename( $page_template ) ) {
			$g_template = true;
			$template   = GUTENTOR_PATH . '/page-templates/template-gutentor-full-width.php';
		} elseif ( 'template-gutentor-canvas.php' == basename( $page_template ) ) {
			$g_template = true;
			$template   = GUTENTOR_PATH . '/page-templates/template-gutentor-canvas.php';
		}
		if ( $g_template ) {
			remove_action( 'template_include', array( 'WC_Template_Loader', 'template_loader' ) );
		}
		return $template;
	}

	/**
	 * Allowed style on post save
	 * Since gutentor add internal style per post page
	 *
	 * @param  array $allowedposttags
	 * @return  array
	 */
	public function allow_style_tags( $allowedposttags ) {
		$allowedposttags['style'] = array(
			'type' => true,
		);
		return $allowedposttags;
	}

	/**
	 * By default gutentor use fontawesome 5
	 * Changing default fontawesome to 4
	 * Quick fix for acmethemes
	 *
	 * @param  array $defaults, All default options of gutentor
	 * @return array $defaults, modified version of default
	 */
	function acmethemes_alter_default_options( $defaults ) {
		$current_theme        = wp_get_theme();
		$current_theme_author = $current_theme->get( 'Author' );
		if ( $current_theme_author != 'acmethemes' ) {
			return $defaults;
		}

		$defaults['fa-version'] = 4; /*default is fontawesome 5, we change here 4*/
		return $defaults;
	}

	/**
	 * Register Gutentor_Reusable_Block_Widget
	 */
	function register_gutentor_reusable_block_selector_widget() {
		register_widget( 'Gutentor_WP_Block_Widget' );
	}
}

/**
 * Begins execution of the hooks.
 *
 * @since    1.0.0
 */
function gutentor_hooks() {
	return Gutentor_Hooks::instance();
}
