<?php

namespace Depicter\WordPress;

use Averta\Core\Utility\Arr;
use Averta\WordPress\Utility\JSON;
use Elementor\Plugin;

class AdminBarService
{

	protected array $documentIDs = [];

	public function register(){
		add_action('admin_bar_menu', [ $this, 'init'], 99);
	}

	public function init( $wpAdminBar ) {

		$conditionalDocumentIDs = \Depicter::document()->getConditionalDocumentIDs();
		if ( ! empty( $conditionalDocumentIDs ) ) {
			$this->documentIDs = Arr::merge( $this->documentIDs, $conditionalDocumentIDs );
		}

		$this->checkForElementorWidget();
		$this->checkForGutenbergWidget();
		$this->checkForDiviWidget();
		$this->checkForBeaverWidget();

		$this->documentIDs = array_unique( $this->documentIDs );

		if ( !empty( $this->documentIDs ) ) {
			$wpAdminBar->add_node([
                'id'    => 'depicter-menu',
                'title' => __( 'Depicter', 'depicter' ),
                'href'  => '#',
            ]);
			foreach ( $this->documentIDs as $documentID ) {
				$wpAdminBar->add_node([
                    'id'    => 'depicter-submenu-' . $documentID,
                    'title' => \Depicter::documentRepository()->getFieldValue( $documentID, 'name' ),
                    'parent' => 'depicter-menu',
                    'href'  => admin_url('post.php?document=' . $documentID . '&action=depicter')
                ]);
			}
		}
	}

	public function checkForElementorWidget(){
		if ( ! class_exists('\Elementor\Plugin') ) {
			return;
		}

		if (!is_page() && !is_singular()) {
			return;
		}

		$document = Plugin::$instance->documents->get( get_the_ID() );
		if ( ! $document || ! $document->is_built_with_elementor() ) {
			return;
		}

		$elementor_data = get_post_meta( get_the_ID(), '_elementor_data', true );
		$elementor_data = JSON::isJson( $elementor_data ) ? $elementor_data : JSON::encode( $elementor_data );
		preg_match_all( '/"slider_id":"#(\d+)"/', $elementor_data, $sliderIDs, PREG_SET_ORDER );
		if ( ! empty( $sliderIDs ) ) {
			foreach( $sliderIDs as $sliderID ) {
				if ( !empty( $sliderID[1] ) ) {
					$this->documentIDs[] = $sliderID[1];
				}
			}
		}

		preg_match_all( '/\[depciter id="(\d+)"/', $elementor_data, $sliders, PREG_SET_ORDER );
		if ( ! empty( $sliders ) ) {
			foreach ( $sliders as $slider ) {
				if ( ! empty( $slider[1] ) ) {
					$this->documentIDs[] = $slider[1];
				}
			}
		}
	}

	public function checkForGutenbergWidget(){
		if (!is_page() && !is_singular()) {
			return;
		}

		$post_content = get_post( get_the_ID() )->post_content;
		if (strpos($post_content, 'wp:depicter/slider') === false && strpos($post_content, '[depicter id="') === false) {
			return;
		}

		preg_match_all( '/wp:depicter\/slider \{"id":(\d+)\}/', $post_content, $sliders, PREG_SET_ORDER );
		if ( ! empty( $sliders ) ) {
			foreach ( $sliders as $slider ) {
				if ( ! empty( $slider[1] ) ) {
					$this->documentIDs[] = $slider[1];
				}
			}
		}

		preg_match_all( '/\[depciter id="(\d+)"/', $post_content, $sliders, PREG_SET_ORDER );
		if ( ! empty( $sliders ) ) {
			foreach ( $sliders as $slider ) {
				if ( ! empty( $slider[1] ) ) {
					$this->documentIDs[] = $slider[1];
				}
			}
		}
	}

	public function checkForBeaverWidget() {
		if (!is_page() && !is_singular()) {
			return;
		}

		$flbuilder_data = get_post_meta( get_the_ID(), '_fl_builder_data', true);
		$flbuilder_data = is_array( $flbuilder_data ) ? maybe_serialize( $flbuilder_data ) : $flbuilder_data;
		preg_match_all( '/document_id";s:\d+:"(\d+)"/', $flbuilder_data, $sliderIDs, PREG_SET_ORDER );
		foreach( $sliderIDs as $key => $sliderID ) {
			if ( !empty( $sliderID[1] ) ) {
				$this->documentIDs[] = $sliderID[1];
			}
		}
	}

	public function checkForDiviWidget(){

		if ( ! function_exists( 'et_core_is_builder_used_on_current_request' ) ) {
			return;
		}

		if (!is_page() && !is_singular() && ! et_core_is_builder_used_on_current_request()) {
			return;
		}

		$post_content = get_post( get_the_ID() )->post_content;
		preg_match_all( '/document_id="(\d+)"/', $post_content, $sliderIDs, PREG_SET_ORDER );
		foreach( $sliderIDs as $key => $sliderID ) {
			if ( !empty( $sliderID[1] ) ) {
				$this->documentIDs[] = $sliderID[1];
			}
		}
	}
}