<?php
namespace Jet_Menu\Blocks;

class Manager {

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

	/**
	 * @var array
	 */
	private $registered_blocks = [];

	public $style_manager = null;

	/**
	 * Returns the instance.
	 *
	 * @since  1.0.0
	 * @return object
	 */
	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;
	}

	/**
	 * Load files
	 */
	public function load_files() {}

	/**
	 * Add new category for filters
	 *
	 * @param $categories
	 * @return false
	 */
	function add_filters_category( $categories ) {

		return array_merge( $categories,
			[
				[
					'slug'  => 'jet-menu',
					'title' => __( 'Jet Menu', 'jet-menu' ),
					'icon'  => 'filter',
				],
			]
		);

	}

	/**
	 * @return array
	 */
	public function get_registered_blocks() {
		return $this->registered_blocks;
	}

	/**
	 * @return array
	 */
	public function get_registered_block_attrs() {
		$registered_blocks = $this->get_registered_blocks();

		$block_attrs = [];

		foreach ( $registered_blocks as $block_slug => $block_instance ) {
			$block_attrs[ $block_slug ] = $block_instance->get_attributes();
		}

		return $block_attrs;
	}

	/**
	 * Register blocks assets
	 *
	 * @return false
	 */
	public function blocks_assets() {

		wp_enqueue_style(
			'jet-menu-block-editor-styles',
			jet_menu()->plugin_url( 'assets/admin/css/gutenberg.css' ),
			[ 'jet-menu-public-styles' ],
			jet_menu()->get_version()
		);

		wp_enqueue_script(
			'jet-menu-blocks',
			jet_menu()->plugin_url( 'assets/admin/js/blocks.js' ),
			[ 'wp-blocks', 'wp-editor', 'wp-components', 'wp-element', 'wp-i18n', 'lodash', 'jet-menu-public-scripts' ],
			jet_menu()->get_version(),
			true
		);

		$localized_data = apply_filters( 'jet-menu/assets/admin/blocks/localized-data', [
			'version'              => jet_menu()->get_version(),
			'availableMenuOptions' => jet_menu_tools()->get_available_menus_options(),
			'registeredBlockAttrs' => $this->get_registered_block_attrs(),
			'breakpointsOptions'   => jet_menu_tools()->get_breakpoints_options(),
			'menuAdminUrl'         => admin_url( 'nav-menus.php?action=edit&menu=0' ),
		] );

		wp_localize_script( 'jet-menu-blocks', 'JetMenuBlocksData', $localized_data );

	}

	/**
	 * Enqueue public assets required for blocks
	 * in Site Editor (Navigation).
	 *
	 * @return void
	 */
	public function enqueue_block_editor_public_assets() {

		jet_menu_assets()->register_public_styles();
		jet_menu_assets()->register_public_scripts();

		if ( is_admin() ) {
			wp_enqueue_style( 'jet-menu-public-styles' );
			wp_enqueue_script( 'jet-menu-public-scripts' );
		}
	}

	/**
	 * Register block types
	 *
	 * @return false
	 */
	public function register_block_types() {

		$base_path = jet_menu()->plugin_path( 'includes/blocks/blocks/' );

		require $base_path . 'base.php';

		$default_blocks = apply_filters( 'jet-menu/block-manager/blocks-list', [
			'\Jet_Menu\Blocks\Mega_Menu'   => $base_path . 'mega-menu.php',
			'\Jet_Menu\Blocks\Mobile_Menu' => $base_path . 'mobile-menu.php',
		] );

		foreach ( $default_blocks as $class => $file ) {
			require $file;

			$instance = new $class;
			$id = $instance->get_name();

			$this->registered_blocks[ $id ] = $instance;
		}

	}

	/**
	 * Constructor for the class
	 */
	public function __construct() {
		self::$instance = $this;

		if ( ! jet_menu_tools()->is_nextgen_mode() ) {
			return false;
		}

		$this->load_files();

		$module_data = jet_menu()->module_loader->get_included_module_data( 'style-manager.php' );

		$this->style_manager = new \Crocoblock\Blocks_Style\Manager( array(
			'path' => $module_data['path'],
			'url'  => $module_data['url'],
		) );

		$this->register_block_types();

		//add_filter( 'block_categories_all', [ $this, 'add_filters_category' ] );
		add_action( 'enqueue_block_editor_assets', [ $this, 'blocks_assets' ] );
		add_action( 'enqueue_block_editor_assets', array( $this->style_manager, 'enqueue_editor_assets' ) );
		add_action( 'enqueue_block_assets', [ $this, 'enqueue_block_editor_public_assets' ] );

		add_action( 'admin_footer', [ jet_menu_assets(), 'render_vue_template' ] );
	}
}