<?php
if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly
}

/**
 * Theme Compatibility for Foxy theme
 * @see https://www.elegantthemes.com/gallery/foxy/
 * @since 2.2.7
 */
class ET_Builder_Theme_Compat_Foxy {
	/**
	 * Unique instance of class
	 */
	public static $instance;

	/**
	 * Constructor
	 */
	private function __construct(){
		$this->init_hooks();
	}

	/**
	 * Gets the instance of the class
	 */
	public static function init(){
		if ( null === self::$instance ){
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Hook methods to WordPress
	 * @return void
	 */
	function init_hooks() {
		$theme   = wp_get_theme();
		$version = isset( $theme['Version'] ) ? $theme['Version'] : false;

		// Bail if no theme version found
		if ( ! $version ) {
			return;
		}

		// Fixing quirks on shop module loop
		add_action( 'et_pb_shop_before_print_shop', array( $this, 'deregister_woocommerce_adjustments' ) );
		add_action( 'et_pb_shop_after_print_shop', array( $this, 'reregister_woocommerce_adjustments' ) );

		// Fixing styling quirks
		add_action( 'wp_enqueue_scripts', array( $this, 'add_styling_fix' ), 12 );

		// Modify shop module's advanced options
		add_filter( 'et_pb_shop_advanced_options', array( $this, 'modify_shop_advanced_options' ), 10, 3 );
	}

	/**
	 * Deregister changes made by Foxy theme on WooCommerce commerce component inside shop module
	 * @since 2.2.7
	 * @return void
	 */
	function deregister_woocommerce_adjustments() {
		add_action( 'woocommerce_after_shop_loop_item_title', 'woocommerce_template_loop_rating', 5 );

		// Foxy overwrites woocommerce_template_loop_price() which causes shop module appearance to
		// be unexpected. Remove initial hook and replace it with compatibility hook which replicate
		// the original woocommerce_template_loop_price() content
		remove_action( 'woocommerce_after_shop_loop_item_title', 'woocommerce_template_loop_price', 10 );
		add_action( 'woocommerce_after_shop_loop_item_title', array( $this, 'default_woocommerce_template_loop_price' ), 10 );
	}

	/**
	 * Re-register changes made by Foxy theme on WooCommerce commerce component after shop module is
	 * done so it doesn't affect WooCommerce component outside shop module
	 * @since 2.2.7
	 * @return void
	 */
	function reregister_woocommerce_adjustments() {
		remove_action( 'woocommerce_after_shop_loop_item_title', 'woocommerce_template_loop_rating', 5 );

		// Deregister compatibility hook and re-register original hook to avoid WooCommerce output
		// outside shop module
		add_action( 'woocommerce_after_shop_loop_item_title', 'woocommerce_template_loop_price', 10 );
		remove_action( 'woocommerce_after_shop_loop_item_title', array( $this, 'default_woocommerce_template_loop_price' ), 10 );
	}

	/**
	 * Provide default WooCommerce woocommerce_template_loop_price() which is overwritten by Foxy theme
	 * @since 2.2.7
	 * @return void
	 */
	function default_woocommerce_template_loop_price() {
		if ( function_exists( 'wc_get_template') ) {
			wc_get_template( 'loop/price.php' );
		}
	}

	/**
	 * Modify shop module's advanced options configuration
	 * @param array  $options default toggle module option
	 * @param string $slug module slug
	 * @param string $main_css_element main css selector
	 * @return array modified option
	 */
	function modify_shop_advanced_options( $options, $slug, $main_css_element ) {
		// Add important tag to shop module's title CSS
		$options['fonts']['title']['css']['important'] = array( 'size' );

		return $options;
	}

	/**
	 * Add inline styling for fixing design quirks on Foxy theme
	 * @since 2.2.7
	 * @return void
	 */
	function add_styling_fix() {
		global $post;
		$is_fb = et_fb_enabled();

		// Added styling adjustment for shop module
		$has_shop_module = isset( $post->post_content ) && has_shortcode( $post->post_content, 'et_pb_shop' );

		if ( $has_shop_module || $is_fb ) {
			$shop_compat_style = '
				#et_builder_outer_content .et_pb_shop .woocommerce ul.products li.product {
					margin: 0 3.05% 2.992em 0 !important;
					width: 22.05% !important;
				}

				#et_builder_outer_content .et_pb_shop .woocommerce.columns-1 ul.products li.product {
					width: 100% !important;
					margin-right: 0;
				}

				#et_builder_outer_content .et_pb_shop .woocommerce.columns-2 ul.products li.product {
					width: 48% !important;
					margin: 0 2% 2.992em 0 !important;
				}

				#et_builder_outer_content .et_pb_shop .woocommerce.columns-3 ul.products li.product {
					width: 30.75% !important;
					margin-right: 2.5% !important;
				}

				#et_builder_outer_content .et_pb_shop .woocommerce.columns-4 ul.products li.product {
					margin-right: 2.9% !important;
				}

				#et_builder_outer_content .et_pb_shop .woocommerce.columns-5 ul.products li.product {
					width: 16.95% !important;
				}

				#et_builder_outer_content .woocommerce-page.columns-6 ul.products li.product,
				#et_builder_outer_content .woocommerce.columns-6 ul.products li.product {
					width: 13.5% !important;
					margin: 0 3.8% 2.992em 0 !important;
				}

				#et_builder_outer_content .et_pb_shop .onsale {
					right: auto !important;
				}

				#et_builder_outer_content .et_pb_shop .woocommerce ul.products li.product h3 {
					font-size: 1em !important;
					padding: .3em 0 !important;
				}

				#et_builder_outer_content .et_pb_shop  .woocommerce ul.products li.product .star-rating {
					margin: 4px 0 0.7em 0 !important;
				}
			';
			wp_add_inline_style( 'et-builder-modules-style', $shop_compat_style );
		}

		// Added styling adjustment for comments module
		$has_comments_module = isset( $post->post_content ) && has_shortcode( $post->post_content, 'et_pb_comments' );

		if ( $has_comments_module || $is_fb ) {
			$comments_compat_style = '
				#et_builder_outer_content .et_pb_comments_module .comment-body {
					padding: 40px 40px 90px;
					min-height: 110px;
					margin-bottom: 80px;
					background: white;
				}

				#et_builder_outer_content .et_pb_comments_module .comment-reply-link.et_pb_button {
					bottom: -60px;
					top: auto;
				}

				#et_builder_outer_content .et_pb_comments_module .testimonial-author {
					padding-left: 40px;
				}

				#et_builder_outer_content .et_pb_comments_module .testimonial-author .et-avatar:before {
					box-shadow: none !important;
				}

				#et_builder_outer_content .et_pb_comments_module .testimonial-author .et-avatar {
					padding: 5px;
					border-radius: 50%;
					box-shadow: 0 3px 3px rgba(0, 0, 0, 0.3);
					margin-right: 25px;
					background: white;
				}

				#et_builder_outer_content .et_pb_comments_module .testimonial-author .avatar {
					border-radius: 50%;
					display: block;
				}

				#et_builder_outer_content .et_pb_comments_module .testimonial-author strong {
					padding: 18px 0 0;
				}

				@media (max-width: 767px) {
					.et_divi_builder #et_builder_outer_content #comment-wrap li.comment article {
						padding-right: 40px;
					}
				}
			';
			wp_add_inline_style( 'et-builder-modules-style', $comments_compat_style );
		}
	}
}
ET_Builder_Theme_Compat_Foxy::init();
