<?php
/**
 * Builder Plugin Compatibility Code
 *
 * @package    Themify_Builder
 * @subpackage Themify_Builder/classes
 */

class Themify_Builder_Plugin_Compat_WooCommerce {

    static function init() {
        $description_hook = themify_get( 'setting-product_description_type','long',true );
        if ( ! is_admin() ) {
            $description_hook = $description_hook==='long' || !$description_hook? 'the_content' : 'woocommerce_short_description';
            add_filter( $description_hook, array( __CLASS__, 'single_product_builder_content') );
            if('woocommerce_short_description'===$description_hook){
                add_action( 'woocommerce_variable_add_to_cart', array( __CLASS__, 'remove_builder_content_variation' ) );
            } else {
                /* prevent static content from showing in short description */
                add_filter( 'woocommerce_short_description', [ 'Themify_Builder', 'clear_static_content' ] );
            }

            // Single Variations Plugin compatibility
            if( class_exists( 'Iconic_WSSV_Query',false ) ) {
                add_filter( 'pre_get_posts', array( __CLASS__, 'add_variations_to_product_query' ), 50, 1 );
            }
        }
        elseif('short'===$description_hook){
            global $pagenow;
            if(($pagenow === 'post-new.php' && isset($_GET['post_type']) && 'product'===$_GET['post_type']) || ('post.php' === $pagenow && isset($_GET['post']) && 'product'===get_post_type( $_GET['post']))){
                add_filter( 'themify_builder_active_vars', array( __CLASS__, 'short_desc_builder_badge' ) );
            }
        }
        add_action( 'woocommerce_archive_description', array( __CLASS__, 'wc_builder_shop_page' ), 11 );
        add_action( 'woocommerce_before_template_part', array( __CLASS__, 'before_woocommerce_templates' ) );
        add_action( 'woocommerce_after_template_part', array( __CLASS__, 'after_woocommerce_templates' ) );
        add_filter( 'woocommerce_short_description', array( __CLASS__, 'fix_static_content_on_shop_page' ) );
        add_filter( 'woocommerce_product_tabs', array( __CLASS__, 'woocommerce_product_tabs' ) );

        /**
         * disable Builder on Shop page
         * self::wc_builder_shop_page() handles this
         */
        add_action( 'woocommerce_before_main_content', array( __CLASS__, 'woocommerce_before_main_content' ) );
    }

    /*
     * Localize a value to add builder static content to short description
     * */
    public static function short_desc_builder_badge(array $vars ):array {
        $vars['short_badge'] = true;
        return $vars;
    }

    public static function woocommerce_before_main_content() {
        if ( themify_is_shop() ) {
            Themify_Builder::reset_builder_query( 'reset' );
            add_action( 'woocommerce_after_main_content', array( __CLASS__, 'woocommerce_after_main_content' ) );
        }
    }

    public static function woocommerce_after_main_content() {
        Themify_Builder::reset_builder_query( 'restore' );
    }

    /**
     * Remove builder content filter from variation short description
     */
    public static function remove_builder_content_variation() {
        global $post;
        if ( $post->post_type === 'product' && is_product()) {
            remove_filter( 'woocommerce_short_description', array( __CLASS__, 'single_product_builder_content') );
        }
    }

    /**
     * Show builder on Shop page.
     *
     * @access public
     */
    public static function wc_builder_shop_page() {
        if ( themify_is_shop() ) {
            echo self::show_builder_content( Themify_Builder_Model::get_ID() );
        }
    }

    /**
     * Avoid render buider content in WooCommerce content
     */

    public static function before_woocommerce_templates() {
        if( Themify_Builder_Model::is_front_builder_activate() ) {
            remove_filter( 'the_content', array( 'Themify_Builder', 'builder_show_on_front'), 11 );
        }
    }

    public static function after_woocommerce_templates() {
        if( Themify_Builder_Model::is_front_builder_activate() ) {
            add_filter( 'the_content', array( 'Themify_Builder', 'builder_show_on_front' ), 11 );
        }
    }

    /**
     * Removes Builder static content from Shop page
     *
     * @return string
     */
    public static function fix_static_content_on_shop_page(string $content='' ):string {
        if ( is_post_type_archive( 'product' ) ) {
            $content = ThemifyBuilder_Data_Manager::update_static_content_string( '', $content );
        }

        return $content;
    }

    /**
     * Ensure "Description" product tab is visible on frontend even if there are no description,
     * so that Builder frontend editor can be used.
     *
     * Hooked to "woocommerce_product_tabs"
     */
    public static function woocommerce_product_tabs(array $tabs ):array {
        if ( ! isset( $tabs['description'] ) && Themify_Builder_Model::is_frontend_editor_page()&& is_singular( 'product' )  ) {
            $tabs['description'] = array(
                'title' => __( 'Description', 'themify' ),
                'priority' => 10,
                'callback' => 'woocommerce_product_description_tab',
            );
        }

        return $tabs;
    }

    private static function show_builder_content(int $id,string $content=''):string{
        return Themify_Builder::render( $id, $content );
    }

    /**
     * Render builder content for Single products
     *
     * @access public
     * @return string
     */
    public static function single_product_builder_content(string $content='' ):string {
        global $post;
        if ( isset( $post->post_type ) && $post->post_type === 'product' && is_product()) {
            $content = self::show_builder_content( $post->ID, $content );
        }

        return $content;
    }

    public static function add_variations_to_product_query($q){
        if ('product' !== $q->get('post_type') && !$q->is_search ) {
            return $q;
        }

        // Add product variations to the query
        $post_type   = (array) $q->get( 'post_type' );
        $post_type[] = 'product_variation';
        if ( ! in_array( 'product', $post_type,true ) ) {
            $post_type[] = 'product';
        }
        $q->set( 'post_type', array_filter( $post_type ) );

        // Don't get variations with unpublished parents
        $unpublished_variable_product_ids = Iconic_WSSV_Query::get_unpublished_variable_product_ids();
        if ( ! empty( $unpublished_variable_product_ids ) ) {
            $q->set( 'post_parent__not_in', array_merge( (array) $q->get( 'post_parent__not_in' ), $unpublished_variable_product_ids ) );
        }

        // Don't get variations with missing parents :(
        $variation_ids_with_missing_parent = Iconic_WSSV_Query::get_variation_ids_with_missing_parent();
        if ( ! empty( $variation_ids_with_missing_parent ) ) {
            $q->set( 'post__not_in', array_merge( (array) $q->get( 'post__not_in' ), $variation_ids_with_missing_parent ) );
        }
        // update the tax query to include our variations
        $q->set( 'tax_query', Iconic_WSSV_Query::update_tax_query( (array) $q->get( 'tax_query' ) ) );

        return $q;
    }
}