<?php
/**
 * Woostify Theme Builder Gutenberg Compatibility
 *
 * @package Woostify Pro
 * 
 */

defined( 'ABSPATH' ) || exit;

if ( ! class_exists( 'Woostify_Builder_Gutenberg_Compatibility' ) ) {
    /**
	 * Woostify Builder Gutenberg Compatibility Class
	 */
    class Woostify_Builder_Gutenberg_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 do_shortcode( ob_get_clean() );
        }

        /**
         * 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' );
			wp_enqueue_style( 'wp-block-library-theme' );
			wp_enqueue_style( 'wc-block-style' );
			wp_enqueue_style( 'wc-blocks-style' );

            if ( defined( 'UAGB_VER' ) ) {
                if ( version_compare( UAGB_VER, '1.23.0', '>=' ) && class_exists( 'UAGB_Post_Assets' ) ) {
                    $template_type = get_post_meta($post_id,'woostify_wp_builder_addon_template',true);
                    if ( $template_type ) {
                        $post_assets = new UAGB_Post_Assets( intval($post_id) );
                        $post_assets->enqueue_scripts();
                    }
                } else {
                    /**
                     * We can keep this compatibility for some releases and after few releases we need to remove it.
                     *
                     * @since 3.5.0
                     */
                    if ( class_exists( 'UAGB_Helper' ) && class_exists( 'UAGB_Config' ) ) {

                        /**
                         * Load UAG styles and scripts assets.
                         *
                         * @since 2.5.1
                         */
                        if ( 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' );

                            /**
                             * As per UAG Team discussion they are going to keep this stylesheet for upcoming few updates, after their stable release UAGB_VER = v1.23.0. Later they are going to deprecate it.
                             *
                             * @since 3.5.0
                             */
                            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;
        }
    }

}
