<?php
/**
 * Jet_Search_Bricks_Integration class
 *
 * @package   jet-search
 * @author    Zemez
 * @license   GPL-2.0+
 */

// If this file is called directly, abort.
if ( ! defined( 'WPINC' ) ) {
	die;
}

/**
 * Define Integration class
 */
class Jet_Search_Bricks_Integration {

	/**
	 * Frontend instance
	 *
	 * @var null
	 */
	public $frontend = null;

	/**
	 * A reference to an instance of this class.
	 *
	 * @since 3.1.0
	 * @var   Jet_Search_Bricks_Integration
	 */
	private static $instance = null;

	/**
	 * Constructor for the class
	 */
	function init() {

		if ( ! $this->has_bricks() ) {
			return;
		}

		add_action( 'init', array( $this, 'register_elements' ), 10 );

		add_filter( 'bricks/builder/i18n', function( $i18n ) {
			$i18n['jetsearch'] = esc_html__( 'JetSearch', 'jet-search' );

			return $i18n;
		} );

		//Add JetSearch icons
		add_action( 'wp_enqueue_scripts', function() {
			if ( bricks_is_builder() ) {
				wp_enqueue_style(
					'jet-search-font',
					jet_search()->plugin_url( 'assets/css/lib/jet-search-icons/jet-search-icons.css' ),
					array(),
					jet_search()->get_version()
				);
			}
		} );
	}

	public function component_path( $relative_path = '' ) {
		return Jet_Search()->plugin_path( 'includes/bricks-views/' . $relative_path );
	}

	public function register_elements() {

		require $this->component_path( 'elements/base.php' );
		require $this->component_path( 'helpers/options-converter.php' );
		require $this->component_path( 'helpers/controls-converter/base.php' );
		require $this->component_path( 'helpers/controls-converter/control-text.php' );
		require $this->component_path( 'helpers/controls-converter/control-select.php' );
		require $this->component_path( 'helpers/controls-converter/control-repeater.php' );
		require $this->component_path( 'helpers/controls-converter/control-checkbox.php' );
		require $this->component_path( 'helpers/controls-converter/control-default.php' );
		require $this->component_path( 'helpers/controls-converter/control-icon.php' );

		$element_files = array(
			$this->component_path( 'elements/ajax-search.php' ),
			$this->component_path( 'elements/search-suggestions.php' ),
		);

		foreach ( $element_files as $file ) {
			\Bricks\Elements::register_element( $file );
		}

		do_action( 'jet-search/bricks-views/register-elements' );

	}

	public function has_bricks() {
		return defined( 'BRICKS_VERSION' );
	}

	/**
	 * Check if is Bricks editor render request
	 *
	 * @return boolean [description]
	 */
	public function is_bricks_editor() {

		// is API request
		$bricks_request_str = 'wp-json/bricks/v1/render_element';
		$is_api = ( ! empty( $_SERVER['REQUEST_URI'] ) && false !== strpos( $_SERVER['REQUEST_URI'], $bricks_request_str ) ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.ValidatedSanitizedInput.MissingUnslash

		// is AJAX request
		$is_ajax = ( ! empty( $_REQUEST['action'] ) && 'bricks_render_element' === $_REQUEST['action'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended

		// Is editor iframe
		$is_editor = ( ! empty( $_REQUEST['bricks'] ) && 'run' === $_REQUEST['bricks'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended

		return $is_api || $is_ajax || $is_editor;
	}

	/**
	 * Returns the instance.
	 *
	 * @since  3.1.0
	 * @return Jet_Search_Bricks_Integration
	 */
	public static function get_instance() {

		// If the single instance hasn't been set, set it now.
		if ( null == self::$instance ) {
			self::$instance = new self;
		}
		return self::$instance;
	}
}

/**
 * Returns instance of Jet_Search_Bricks_Integration
 *
 * @return Jet_Search_Bricks_Integration
 */
function jet_search_bricks_integration() {
	return Jet_Search_Bricks_Integration::get_instance();
}
