<?php /**
 * Kadence\Elementor\Component class
 *
 * @package kadence
 */

namespace Kadence\Elementor;

use Kadence\Component_Interface;
use Elementor;
use function Kadence\kadence;
use function add_action;
use function add_theme_support;
use function have_posts;
use function the_post;
use function apply_filters;
use function get_template_part;
use function get_post_type;
use Elementor\Controls_Manager;
use Elementor\Core\Kits\Controls\Repeater as Global_Style_Repeater;
use Elementor\Repeater;
use Elementor\Plugin;


/**
 * Class for adding Elementor plugin support.
 */
class Component implements Component_Interface {

	/**
	 * Gets the unique identifier for the theme component.
	 *
	 * @return string Component slug.
	 */
	public function get_slug() : string {
		return 'elementor';
	}

	/**
	 * Adds the action and filter hooks to integrate with WordPress.
	 */
	public function initialize() {
		// Add support for Header and Footer Plugin.
		add_action( 'after_setup_theme', array( $this, 'init_header_footer_support' ), 30 );
		add_filter( 'body_class', array( $this, 'add_body_class' ) );
		//add_action( 'init', array( $this, 'elementor_add_theme_colors' ), 1 );
		add_action( 'elementor/editor/init', array( $this, 'elementor_add_theme_colors' ) );
		//add_action( 'elementor/element/kit/section_global_colors/before_section_start', array( $this, 'elementor_remove_theme_colors' ) );
		add_action( 'elementor/element/kit/section_global_colors/after_section_end', array( $this, 'elementor_add_theme_color_controls' ), 10, 2 );
		// Set page to best pagebuilder settings when first loading.
		add_action( 'wp', array( $this, 'elementor_page_meta_setting' ), 20 );
		add_action( 'elementor/preview/init', array( $this, 'elementor_page_meta_setting' ) );
		// Add Scripts for elementor.
		add_action( 'elementor/editor/before_enqueue_scripts', array( $this, 'elementor_add_scripts' ) );
		//add_action( 'wp_enqueue_scripts', array( $this, 'add_styles' ), 60 );
		add_action( 'elementor/document/after_save', array( $this, 'elementor_after_save' ), 10, 2 );
		add_filter( 'body_class', array( $this, 'filter_body_classes_add_editing_class' ) );
	}
	/**
	 * Adds a link style class to the array of body classes.
	 *
	 * @param array $classes Classes for the body element.
	 * @return array Filtered body classes.
	 */
	public function add_body_class( $classes ) {
		$classes[] = 'kadence-elementor-colors';

		return $classes;
	}
	/**
	 * Adds a 'el-is-editing' class to the array of body classes for when we are in elementor editing.
	 *
	 * @param array $classes Classes for the body element.
	 * @return array Filtered body classes.
	 */
	public function filter_body_classes_add_editing_class( array $classes ) : array {
		if ( \Elementor\Plugin::$instance->preview-&gt;is_preview_mode() ) {
			$classes[] = 'el-is-editing';
		}

		return $classes;
	}
	public function elementor_after_save( $object, $data ) {
		if ( apply_filters( 'kadence_add_global_colors_to_elementor', true ) ) {
			// Prevent Errors.
			if ( ! current_user_can( 'edit_theme_options' ) ) {
				return;
			}
			if ( $data &amp;&amp; isset( $data['settings'] ) &amp;&amp; is_array( $data['settings'] ) &amp;&amp; isset( $data['settings']['kadence_colors'] ) &amp;&amp; is_array( $data['settings']['kadence_colors'] ) ) {
				$update_palette = false;
				$palette = json_decode( kadence()-&gt;get_palette(), true );
				if ( isset( $palette['active'] ) &amp;&amp; ! empty( $palette['active'] ) ) {
					$active = $palette['active'];
				} else {
					$palette = json_decode( kadence()-&gt;get_default_palette(), true );
					$active  = $palette['active'];
				}
				foreach ( $data['settings']['kadence_colors'] as $key =&gt; $value ) {
					if ( 'palette1' == $value['_id'] &amp;&amp; ! empty( $value['color'] ) ) {
						$palette[$active][0]['color'] = $value['color'];
						$update_palette = true;
					}
					if ( 'palette2' == $value['_id'] &amp;&amp; ! empty( $value['color'] ) ) {
						$palette[$active][1]['color'] = $value['color'];
						$update_palette = true;
					}
					if ( 'palette3' == $value['_id'] &amp;&amp; ! empty( $value['color'] ) ) {
						$palette[$active][2]['color'] = $value['color'];
						$update_palette = true;
					}
					if ( 'palette4' == $value['_id'] &amp;&amp; ! empty( $value['color'] ) ) {
						$palette[$active][3]['color'] = $value['color'];
						$update_palette = true;
					}
					if ( 'palette5' == $value['_id'] &amp;&amp; ! empty( $value['color'] ) ) {
						$palette[$active][4]['color'] = $value['color'];
						$update_palette = true;
					}
					if ( 'palette6' == $value['_id'] &amp;&amp; ! empty( $value['color'] ) ) {
						$palette[$active][5]['color'] = $value['color'];
						$update_palette = true;
					}
					if ( 'palette7' == $value['_id'] &amp;&amp; ! empty( $value['color'] ) ) {
						$palette[$active][6]['color'] = $value['color'];
						$update_palette = true;
					}
					if ( 'palette8' == $value['_id'] &amp;&amp; ! empty( $value['color'] ) ) {
						$palette[$active][7]['color'] = $value['color'];
						$update_palette = true;
					}
					if ( 'palette9' == $value['_id'] &amp;&amp; ! empty( $value['color'] ) ) {
						$palette[$active][8]['color'] = $value['color'];
						$update_palette = true;
					}
				}
				$current = \Elementor\Plugin::$instance-&gt;kits_manager-&gt;get_current_settings();
				if ( $current &amp;&amp; isset( $current['custom_colors'] ) &amp;&amp; $update_palette ) {
					$custom_colors = $current['custom_colors'];
					$kadence_add = true;
					$kadence = array( 'kadence1', 'kadence2', 'kadence3', 'kadence4', 'kadence5', 'kadence6', 'kadence7', 'kadence8', 'kadence9' );
					foreach ( $custom_colors as $key =&gt; $value ) {
						if ( is_array( $value ) &amp;&amp; isset( $value['_id'] ) &amp;&amp; in_array( $value['_id'], $kadence ) ) {
							$kadence_add = false;
							if ( $value['_id'] == 'kadence1' ) {
								$custom_colors[ $key ]['color'] = $palette[$active][0]['color'];
							}
							if ( $value['_id'] == 'kadence2' ) {
								$custom_colors[ $key ]['color'] = $palette[$active][1]['color'];
							}
							if ( $value['_id'] == 'kadence3' ) {
								$custom_colors[ $key ]['color'] = $palette[$active][2]['color'];
							}
							if ( $value['_id'] == 'kadence4' ) {
								$custom_colors[ $key ]['color'] = $palette[$active][3]['color'];
							}
							if ( $value['_id'] == 'kadence5' ) {
								$custom_colors[ $key ]['color'] = $palette[$active][4]['color'];
							}
							if ( $value['_id'] == 'kadence6' ) {
								$custom_colors[ $key ]['color'] = $palette[$active][5]['color'];
							}
							if ( $value['_id'] == 'kadence7' ) {
								$custom_colors[ $key ]['color'] = $palette[$active][6]['color'];
							}
							if ( $value['_id'] == 'kadence8' ) {
								$custom_colors[ $key ]['color'] = $palette[$active][7]['color'];
							}
							if ( $value['_id'] == 'kadence9' ) {
								$custom_colors[ $key ]['color'] = $palette[$active][8]['color'];
							}
						}
					}
					if ( $kadence_add ) {
						\Elementor\Plugin::$instance-&gt;kits_manager-&gt;update_kit_settings_based_on_option( 'custom_colors', $custom_colors );
					}
				}
				if ( $update_palette ) {
					update_option( 'kadence_global_palette', json_encode( $palette ) );
				}
			}
		}
	}
	/**
	 * Add some css styles for elementor.
	 */
	public function add_styles() {
		wp_enqueue_style( 'kadence-elementor', get_theme_file_uri( '/assets/css/elementor.min.css' ), array(), KADENCE_VERSION );
	}
	/**
	 * Add some css styles for elementor admin.
	 */
	public function elementor_add_scripts() {
		if ( apply_filters( 'kadence_add_global_colors_to_elementor', true ) ) {
			wp_enqueue_style( 'kadence-elementor-admin', get_theme_file_uri( '/assets/css/elementor-admin.min.css' ), array(), KADENCE_VERSION );
		}
	}
	/**
	 * Add some css styles for Restrict Content Pro
	 */
	public function elementor_add_theme_colors() {
		if ( apply_filters( 'kadence_add_global_colors_to_elementor', true ) ) {
			// // Prevent Errors.
			if ( ! current_user_can( 'edit_theme_options' ) ) {
				return;
			}
			$theme_colors = array(
				array(
					'_id' =&gt; 'kadence1',
					'title'  =&gt; __( 'Theme Accent', 'kadence' ),
					'color' =&gt; kadence()-&gt;palette_option( 'palette1' ),
				),
				array(
					'_id' =&gt; 'kadence2',
					'title'  =&gt; __( 'Theme Accent - alt', 'kadence' ),
					'color' =&gt; kadence()-&gt;palette_option( 'palette2' ),
				),
				array(
					'_id' =&gt; 'kadence3',
					'title'  =&gt; __( 'Strongest text', 'kadence' ),
					'color' =&gt; kadence()-&gt;palette_option( 'palette3' ),
				),
				array(
					'_id' =&gt; 'kadence4',
					'title'  =&gt; __( 'Strong Text', 'kadence' ),
					'color' =&gt; kadence()-&gt;palette_option( 'palette4' ),
				),
				array(
					'_id' =&gt; 'kadence5',
					'title'  =&gt; __( 'Medium text', 'kadence' ),
					'color' =&gt; kadence()-&gt;palette_option( 'palette5' ),
				),
				array(
					'_id' =&gt; 'kadence6',
					'title'  =&gt; __( 'Subtle Text', 'kadence' ),
					'color' =&gt; kadence()-&gt;palette_option( 'palette6' ),
				),
				array(
					'_id' =&gt; 'kadence7',
					'title'  =&gt; __( 'Subtle Background', 'kadence' ),
					'color' =&gt; kadence()-&gt;palette_option( 'palette7' ),
				),
				array(
					'_id' =&gt; 'kadence8',
					'title'  =&gt; __( 'Lighter Background', 'kadence' ),
					'color' =&gt; kadence()-&gt;palette_option( 'palette8' ),
				),
				array(
					'_id' =&gt; 'kadence9',
					'title'  =&gt; __( 'White or offwhite', 'kadence' ),
					'color' =&gt; kadence()-&gt;palette_option( 'palette9' ),
				),
			);
			$theme_placeholder_colors = array(
				array(
					'_id' =&gt; 'palette1',
					'title'  =&gt; __( 'Theme Accent', 'kadence' ),
					'color' =&gt; kadence()-&gt;palette_option( 'palette1' ),
				),
				array(
					'_id' =&gt; 'palette2',
					'title'  =&gt; __( 'Theme Accent - alt', 'kadence' ),
					'color' =&gt; kadence()-&gt;palette_option( 'palette2' ),
				),
				array(
					'_id' =&gt; 'palette3',
					'title'  =&gt; __( 'Strongest text', 'kadence' ),
					'color' =&gt; kadence()-&gt;palette_option( 'palette3' ),
				),
				array(
					'_id' =&gt; 'palette4',
					'title'  =&gt; __( 'Strong Text', 'kadence' ),
					'color' =&gt; kadence()-&gt;palette_option( 'palette4' ),
				),
				array(
					'_id' =&gt; 'palette5',
					'title'  =&gt; __( 'Medium text', 'kadence' ),
					'color' =&gt; kadence()-&gt;palette_option( 'palette5' ),
				),
				array(
					'_id' =&gt; 'palette6',
					'title'  =&gt; __( 'Subtle Text', 'kadence' ),
					'color' =&gt; kadence()-&gt;palette_option( 'palette6' ),
				),
				array(
					'_id' =&gt; 'palette7',
					'title'  =&gt; __( 'Subtle Background', 'kadence' ),
					'color' =&gt; kadence()-&gt;palette_option( 'palette7' ),
				),
				array(
					'_id' =&gt; 'palette8',
					'title'  =&gt; __( 'Lighter Background', 'kadence' ),
					'color' =&gt; kadence()-&gt;palette_option( 'palette8' ),
				),
				array(
					'_id' =&gt; 'palette9',
					'title'  =&gt; __( 'White or offwhite', 'kadence' ),
					'color' =&gt; kadence()-&gt;palette_option( 'palette9' ),
				),
			);
			// Prevent Errors.
			if ( ! method_exists( \Elementor\Plugin::$instance-&gt;kits_manager, 'get_current_settings' ) ) {
				return;
			}
			$current = \Elementor\Plugin::$instance-&gt;kits_manager-&gt;get_current_settings();
			if ( $current &amp;&amp; isset( $current['custom_colors'] ) ) {
				$custom_colors = $current['custom_colors'];
				$kadence_add_array = array(
					'kadence1' =&gt; true,
					'kadence2' =&gt; true,
					'kadence3' =&gt; true,
					'kadence4' =&gt; true,
					'kadence5' =&gt; true,
					'kadence6' =&gt; true,
					'kadence7' =&gt; true,
					'kadence8' =&gt; true,
					'kadence9' =&gt; true,
				);
				$kadence_add = true;
				$clear_cache = false;
				$kadence = array( 'kadence1', 'kadence2', 'kadence3', 'kadence4', 'kadence5', 'kadence6', 'kadence7', 'kadence8', 'kadence9' );
				foreach ( $custom_colors as $key =&gt; $value ) {
					if ( is_array( $value ) &amp;&amp; isset( $value['_id'] ) &amp;&amp; in_array( $value['_id'], $kadence ) ) {
						$kadence_add = false;
						if ( $value['_id'] == 'kadence1' ) {
							if ( $custom_colors[ $key ]['color'] !== $theme_colors[0]['color'] ) {
								$clear_cache = true;
							}
							$kadence_add_array['kadence1'] = false;
							$custom_colors[ $key ] = $theme_colors[0];
						}
						if ( $value['_id'] == 'kadence2' ) {
							if ( $custom_colors[ $key ]['color'] !== $theme_colors[1]['color'] ) {
								$clear_cache = true;
							}
							$kadence_add_array['kadence2'] = false;
							$custom_colors[ $key ] = $theme_colors[1];
						}
						if ( $value['_id'] == 'kadence3' ) {
							if ( $custom_colors[ $key ]['color'] !== $theme_colors[2]['color'] ) {
								$clear_cache = true;
							}
							$kadence_add_array['kadence3'] = false;
							$custom_colors[ $key ] = $theme_colors[2];
						}
						if ( $value['_id'] == 'kadence4' ) {
							if ( $custom_colors[ $key ]['color'] !== $theme_colors[3]['color'] ) {
								$clear_cache = true;
							}
							$kadence_add_array['kadence4'] = false;
							$custom_colors[ $key ] = $theme_colors[3];
						}
						if ( $value['_id'] == 'kadence5' ) {
							if ( $custom_colors[ $key ]['color'] !== $theme_colors[4]['color'] ) {
								$clear_cache = true;
							}
							$kadence_add_array['kadence5'] = false;
							$custom_colors[ $key ] = $theme_colors[4];
						}
						if ( $value['_id'] == 'kadence6' ) {
							if ( $custom_colors[ $key ]['color'] !== $theme_colors[5]['color'] ) {
								$clear_cache = true;
							}
							$kadence_add_array['kadence6'] = false;
							$custom_colors[ $key ] = $theme_colors[5];
						}
						if ( $value['_id'] == 'kadence7' ) {
							if ( $custom_colors[ $key ]['color'] !== $theme_colors[6]['color'] ) {
								$clear_cache = true;
							}
							$kadence_add_array['kadence7'] = false;
							$custom_colors[ $key ] = $theme_colors[6];
						}
						if ( $value['_id'] == 'kadence8' ) {
							if ( $custom_colors[ $key ]['color'] !== $theme_colors[7]['color'] ) {
								$clear_cache = true;
							}
							$kadence_add_array['kadence8'] = false;
							$custom_colors[ $key ] = $theme_colors[7];
						}
						if ( $value['_id'] == 'kadence9' ) {
							if ( $custom_colors[ $key ]['color'] !== $theme_colors[8]['color'] ) {
								$clear_cache = true;
							}
							$kadence_add_array['kadence9'] = false;
							$custom_colors[ $key ] = $theme_colors[8];
						}
					}
				}
				if ( $kadence_add ) {
					$custom_colors = array_merge( $theme_colors, $custom_colors );
				} else {
					$i       = 0;
					$new_add = array();
					foreach ( $kadence_add_array as $key =&gt; $value ) {
						if ( $value ) {
							$new_add[] = $theme_colors[ $i ];
						}
						$i++;
					}
					// Somehow colors were removed so we need to add them back in.
					if ( ! empty( $new_add ) ) {
						$custom_colors = array_merge( $new_add, $custom_colors );
					}
				}
				// error_log( 'Here is the error?' );
				\Elementor\Plugin::$instance-&gt;kits_manager-&gt;update_kit_settings_based_on_option( 'custom_colors', $custom_colors );
				\Elementor\Plugin::$instance-&gt;kits_manager-&gt;update_kit_settings_based_on_option( 'kadence_colors', $theme_placeholder_colors );
				// Refresh cache.
				if ( $clear_cache ) {
					// If the palette was updated in the customizer then we need to clear all the css.
					\Elementor\Plugin::instance()-&gt;files_manager-&gt;clear_cache();
				}
			}
		}
	}
	/**
	 * Add in new Custom Controls for Theme Colors.
	 */
	public function elementor_add_theme_color_controls( $tab, $args ) {
		if ( apply_filters( 'kadence_add_global_colors_to_elementor', true ) ) {
			$tab-&gt;start_controls_section(
				'section_theme_global_colors',
				array(
					'label' =&gt; __( 'Theme Global Colors', 'kadence' ),
					'tab' =&gt; 'global-colors',
				)
			);

			$repeater = new Repeater();

			$repeater-&gt;add_control(
				'title',
				array(
					'type' =&gt; Controls_Manager::TEXT,
					'label_block' =&gt; true,
					'required' =&gt; true,
				)
			);

			// Color Value
			$repeater-&gt;add_control(
				'color',
				array(
					'type' =&gt; Controls_Manager::COLOR,
					'label_block' =&gt; true,
					'dynamic' =&gt; [],
					'selectors' =&gt; array(
						'{{WRAPPER}}.el-is-editing' =&gt; '--global-{{_id.VALUE}}: {{VALUE}}',
					),
					'global' =&gt; array(
						'active' =&gt; false,
					),
				)
			);

			$theme_colors = array(
				array(
					'_id' =&gt; 'palette1',
					'title'  =&gt; __( 'Theme Accent', 'kadence' ),
					'color' =&gt; kadence()-&gt;palette_option( 'palette1' ),
				),
				array(
					'_id' =&gt; 'palette2',
					'title'  =&gt; __( 'Theme Accent - alt', 'kadence' ),
					'color' =&gt; kadence()-&gt;palette_option( 'palette2' ),
				),
				array(
					'_id' =&gt; 'palette3',
					'title'  =&gt; __( 'Strongest text', 'kadence' ),
					'color' =&gt; kadence()-&gt;palette_option( 'palette3' ),
				),
				array(
					'_id' =&gt; 'palette4',
					'title'  =&gt; __( 'Strong Text', 'kadence' ),
					'color' =&gt; kadence()-&gt;palette_option( 'palette4' ),
				),
				array(
					'_id' =&gt; 'palette5',
					'title'  =&gt; __( 'Medium text', 'kadence' ),
					'color' =&gt; kadence()-&gt;palette_option( 'palette5' ),
				),
				array(
					'_id' =&gt; 'palette6',
					'title'  =&gt; __( 'Subtle Text', 'kadence' ),
					'color' =&gt; kadence()-&gt;palette_option( 'palette6' ),
				),
				array(
					'_id' =&gt; 'palette7',
					'title'  =&gt; __( 'Subtle Background', 'kadence' ),
					'color' =&gt; kadence()-&gt;palette_option( 'palette7' ),
				),
				array(
					'_id' =&gt; 'palette8',
					'title'  =&gt; __( 'Lighter Background', 'kadence' ),
					'color' =&gt; kadence()-&gt;palette_option( 'palette8' ),
				),
				array(
					'_id' =&gt; 'palette9',
					'title'  =&gt; __( 'White or offwhite', 'kadence' ),
					'color' =&gt; kadence()-&gt;palette_option( 'palette9' ),
				),
			);

			$tab-&gt;add_control(
				'kadence_colors',
				array(
					'type' =&gt; Global_Style_Repeater::CONTROL_TYPE,
					'fields' =&gt; $repeater-&gt;get_controls(),
					'default' =&gt; $theme_colors,
					'item_actions' =&gt; array(
						'add' =&gt; false,
						'remove' =&gt; false,
					),
				)
			);
			$tab-&gt;end_controls_section();
		}
	}
	/**
	 * Make sure it's not a post, then set the meta if the content is empty and we are in elementor.
	 */
	public function elementor_page_meta_setting() {
		if ( ! apply_filters( 'kadence_theme_elementor_default', true ) || 'post' === get_post_type() ) {
			return;
		}
		if ( ! $this-&gt;is_elementor() ) {
			return;
		}
		global $post;
		$page_id = get_the_ID();

		$page_builder_layout = get_post_meta( $page_id, '_kad_pagebuilder_layout_flag', true );
		if ( isset( $post ) &amp;&amp; empty( $page_builder_layout ) &amp;&amp; ( is_admin() || is_singular() ) ) {
			if ( empty( $post-&gt;post_content ) &amp;&amp; $this-&gt;is_built_with_elementor( $page_id ) ) {
				update_post_meta( $page_id, '_kad_pagebuilder_layout_flag', 'disabled' );
				update_post_meta( $page_id, '_kad_post_title', 'hide' );
				update_post_meta( $page_id, '_kad_post_content_style', 'unboxed' );
				update_post_meta( $page_id, '_kad_post_vertical_padding', 'hide' );
				update_post_meta( $page_id, '_kad_post_feature', 'hide' );
				$post_layout = get_post_meta( $page_id, '_kad_post_layout', true );
				if ( empty( $post_layout ) || 'default' === $post_layout ) {
					update_post_meta( $page_id, '_kad_post_layout', 'fullwidth' );
				}
				$post_title = get_post_meta( $page_id, '_kad_post_title', true );
				if ( empty( $post_title ) || 'default' === $post_title ) {
					update_post_meta( $page_id, '_kad_post_title', 'hide' );
				}
			}
		}
	}
	/**
	 * Check if page is built with elementor
	 *
	 * @return boolean true if elementor edit false if not.
	 */
	private function is_built_with_elementor( $page_id ) {
		return Elementor\Plugin::$instance-&gt;db-&gt;is_built_with_elementor( $page_id );
	}
	/**
	 * Check if in elementor editor.
	 *
	 * @return boolean true if elementor edit false if not.
	 */
	private function is_elementor() {
		if ( ( isset( $_REQUEST['action'] ) &amp;&amp; 'elementor' === $_REQUEST['action'] ) || isset( $_REQUEST['elementor-preview'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			return true;
		}

		return false;
	}
	/**
	 * Check for use. Then
	 * Run all the Actions / Filters.
	 */
	public function init_header_footer_support() {
		add_theme_support( 'header-footer-elementor' );
		add_action( 'wp', array( $this, 'loading_header_footer_support' ) );
	}
		/**
	 * Check for use. Then
	 * Run all the Actions / Filters.
	 */
	public function loading_header_footer_support() {
		if ( function_exists( 'hfe_header_enabled' ) ) {
			if ( hfe_header_enabled() ) {
				add_action( 'template_redirect', array( $this, 'remove_theme_header' ) );
				add_action( 'kadence_header', 'hfe_render_header' );
			}
		}
		if ( function_exists( 'hfe_footer_enabled' ) ) {
			if ( hfe_footer_enabled() ) {
				add_action( 'template_redirect', array( $this, 'remove_theme_footer' ) );
				add_action( 'kadence_footer', 'hfe_render_footer' );
			}
		}
	}
	/**
	 * Disable header from the theme.
	 */
	public function remove_theme_header() {
		remove_action( 'kadence_header', 'Kadence\header_markup' );
	}
	/**
	 * Disable header from the theme.
	 */
	public function remove_theme_footer() {
		remove_action( 'kadence_footer', 'Kadence\footer_markup' );
	}

}
