<?php
/**
 * Astra Addon Gutenberg Compatibility class
 *
 * @package Astra Addon
 * @since 2.5.1
 */

/**
 * Astra Addon Gutenberg Builder Compatibility class
 *
 * @since 2.5.1
 */
class Astra_Addon_Gutenberg_Compatibility extends Astra_Addon_Page_Builder_Compatibility {

	/**
	 * Render Blocks content for post.
	 *
	 * @param int $post_id Post id.
	 *
	 * @since 2.5.1
	 */
	public function render_content( $post_id ) {

		$output       = '';
		$current_post = get_post( $post_id, OBJECT );

		if ( has_blocks( $current_post ) ) {
			$blocks = parse_blocks( $current_post->post_content );
			foreach ( $blocks as $block ) {
				$output .= render_block( $block );
			}
		} else {
			$output = $current_post->post_content;
		}

		ob_start();
		echo do_shortcode( $output );
		echo ob_get_clean(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
	}

	/**
	 * Load Gutenberg Blocks styles & scripts.
	 *
	 * @param int $post_id Post id.
	 *
	 * @since 2.5.1
	 */
	public function enqueue_blocks_assets( $post_id ) {

		wp_enqueue_style( 'wp-block-library' );

		if ( class_exists( 'UAGB_Helper' ) && class_exists( 'UAGB_Config' ) ) {

			/**
			 * Load UAG styles and scripts assets.
			 *
			 * @since 2.5.1
			 */
			if ( defined( 'UAGB_VER' ) && version_compare( UAGB_VER, '1.14.11', '>=' ) ) {
				$uag_post_meta = get_post_meta( $post_id, 'uag_style_timestamp-css', true );
			} else {
				$uag_post_meta = get_post_meta( $post_id, 'uagb_style_timestamp-css', true );
			}

			/**
			 * Set flag to load UAG assets.
			 *
			 * Resolving this to manage "UAG styles not load in some cases for Custom Layouts".
			 *
			 * @since 2.6.0
			 */
			$uag_is_active        = false;
			$current_post         = get_post( $post_id, OBJECT );
			$uagb_helper_instance = UAGB_Helper::get_instance();

			if ( $uag_post_meta ) {
				$uag_is_active = true;
			} else {
				$uag_helper_parse_func      = array( $uagb_helper_instance, 'parse' );
				$uag_helper_get_assets_func = array( $uagb_helper_instance, 'get_assets' );

				if ( is_callable( $uag_helper_parse_func ) && is_callable( $uag_helper_get_assets_func ) ) {

					$post_blocks     = $uagb_helper_instance->parse( $current_post->post_content );
					$post_uag_assets = $uagb_helper_instance->get_assets( $post_blocks );

					if ( ! empty( $post_uag_assets['css'] ) ) {

						$uag_is_active = true;

						$active_gutenberg_blocks = parse_blocks( $current_post->post_content );
						$used_uag_elements       = $this->get_active_uag_blocks( $active_gutenberg_blocks );

						if ( ! empty( $used_uag_elements ) ) {
							add_action(
								'wp_enqueue_scripts',
								function() use ( $current_post, $used_uag_elements ) {

									if ( has_blocks( $current_post ) ) {

										$uag_blocks       = UAGB_Config::get_block_attributes();
										$uag_block_assets = UAGB_Config::get_block_assets();

										foreach ( $used_uag_elements as $key => $curr_block_name ) {

											$js_assets  = ( isset( $uag_blocks[ $curr_block_name ]['js_assets'] ) ) ? $uag_blocks[ $curr_block_name ]['js_assets'] : array();
											$css_assets = ( isset( $uag_blocks[ $curr_block_name ]['css_assets'] ) ) ? $uag_blocks[ $curr_block_name ]['css_assets'] : array();

											// Script Assets.
											foreach ( $js_assets as $asset_handle => $val ) {
												wp_register_script(
													$val, // Handle.
													$uag_block_assets[ $val ]['src'],
													$uag_block_assets[ $val ]['dep'],
													UAGB_VER,
													true
												);

												wp_enqueue_script( $val );
											}

											// Style Assets.
											foreach ( $css_assets as $asset_handle => $val ) {
												wp_register_style(
													$val, // Handle.
													$uag_block_assets[ $val ]['src'],
													$uag_block_assets[ $val ]['dep'],
													UAGB_VER
												);

												wp_enqueue_style( $val );
											}
										}
									}
								},
								11
							);
						}
					}
				}
			}

			if ( $uag_is_active ) {

				$uag_generated_stylesheet_func = array( $uagb_helper_instance, 'get_generated_stylesheet' );

				wp_enqueue_style(
					'uagb-block-css', // UAG-Handle.
					UAGB_URL . 'dist/blocks.style.css', // Block style CSS.
					array(),
					UAGB_VER
				);

				if ( is_callable( $uag_generated_stylesheet_func ) ) {
					$uagb_helper_instance->get_generated_stylesheet( $current_post );
				}
			}
		}
	}

	/**
	 * Get all UAG specific blocks from current Custom Layout.
	 *
	 * @param array $active_gutenberg_blocks has all gutenberg blocks used in this Custom Layout.
	 * @return array $uag_block_names having all UAG block names
	 * @since 2.6.0
	 */
	public function get_active_uag_blocks( array $active_gutenberg_blocks ) {

		$uag_block_names = array();

		foreach ( $active_gutenberg_blocks as $key => $curr_block_name ) {

			if ( 'blockName' === $key && strpos( $curr_block_name, 'uagb/' ) !== false ) {
				$uag_block_names[] = $curr_block_name;
			}

			if ( is_array( $curr_block_name ) ) {
				$uag_block_names = array_merge( $uag_block_names, $this->get_active_uag_blocks( $curr_block_name ) );
			}
		}

		return $uag_block_names;
	}
}
