<?php
/**
 * Elementor integration.
 *
 * @since      2.0.8
 * @package    RankMath
 * @subpackage RankMath\Core
 * @author     Rank Math <support@rankmath.com>
 */

namespace RankMathPro\Elementor;

use RankMath\Helper;
use RankMath\Traits\Hooker;
use Elementor\Controls_Manager;

defined( 'ABSPATH' ) || exit;

/**
 * Elementor class.
 */
class Elementor {

	use Hooker;

	/**
	 * Class constructor.
	 */
	public function __construct() {
		$this->action( 'elementor/editor/before_enqueue_scripts', 'editor_scripts' );
		$this->action( 'elementor/widgets/register', 'add_breadcrumb_widget' );
		$this->action( 'elementor/element/accordion/section_title/before_section_end', 'add_faq_setting', 99 );
		$this->filter( 'rank_math/json_ld', 'add_faq_schema', 99 );
	}

	/**
	 * Enqueue the editor scripts.
	 */
	public function editor_scripts() {

		wp_dequeue_script( 'rank-math-pro-metabox' );
		wp_enqueue_style(
			'rank-math-pro-editor',
			RANK_MATH_PRO_URL . 'assets/admin/css/elementor.css',
			[],
			RANK_MATH_PRO_VERSION
		);

		wp_enqueue_script(
			'rank-math-pro-editor',
			RANK_MATH_PRO_URL . 'assets/admin/js/elementor.js',
			[
				'rank-math-editor',
			],
			RANK_MATH_PRO_VERSION,
			true
		);
	}

	/**
	 * Add Breadcrumb Widget in Elementor Editor.
	 *
	 * @param Widgets_Manager $widget The widgets manager.
	 */
	public function add_breadcrumb_widget( $widget ) {
		$widget->register( new Widget_Breadcrumbs() );
	}

	/**
	 * Add toggle to enable/disable FAQ schema in Accordion Widget.
	 *
	 * @param Controls_Stack $widget The control.
	 */
	public function add_faq_setting( $widget ) {
		$widget->add_control(
			'rank_math_add_faq_schema',
			[
				'label'       => esc_html__( 'Add FAQ Schema Markup', 'rank-math-pro' ),
				'type'        => Controls_Manager::SWITCHER,
				'separator'   => 'before',
				'description' => esc_html__( 'Added by the Rank Math SEO Plugin.', 'rank-math-pro' ),
			]
		);
	}

	/**
	 * Add FAQ schema using the accordion content.
	 *
	 * @param array $data Array of json-ld data.
	 *
	 * @return array
	 */
	public function add_faq_schema( $data ) {
		if ( ! is_singular() ) {
			return $data;
		}

		global $post;
		$elementor_document = \Elementor\Plugin::$instance->documents->get( $post->ID );
		if ( ! $elementor_document || ! $elementor_document->is_built_with_elementor() ) {
			return $data;
		}

		$elementor_data = get_post_meta( $post->ID, '_elementor_data', true );
		if ( ! empty( $elementor_data ) && is_string( $elementor_data ) ) {
			$elementor_data = json_decode( $elementor_data, true );
		}

		$accordion_data = $this->get_accordion_data( $elementor_data );
		if ( empty( $accordion_data ) ) {
			return $data;
		}

		$data['faq-data'] = [
			'@type' => 'FAQPage',
		];

		foreach ( $accordion_data as $faqs ) {
			foreach ( $faqs as $faq ) {
				$data['faq-data']['mainEntity'][] = [
					'@type'          => 'Question',
					'name'           => $faq['tab_title'],
					'acceptedAnswer' => [
						'@type' => 'Answer',
						'text'  => $faq['tab_content'],
					],
				];
			}
		}

		return $data;
	}

	/**
	 * Get accordion data.
	 *
	 * @param array $elements Elements Data.
	 *
	 * @return array
	 */
	private function get_accordion_data( $elements ) {
		if ( ! is_array( $elements ) ) {
			return [];
		}

		$results = [];
		if (
			isset( $elements['rank_math_add_faq_schema'] ) &&
			'yes' === $elements['rank_math_add_faq_schema'] &&
			! empty( $elements['tabs'] )
		) {
			$results[] = $elements['tabs'];
		}

		foreach ( $elements as $element ) {
			$results = array_merge( $results, $this->get_accordion_data( $element ) );
		}

		return $results;
	}
}