<?php

class Blocksy_Static_Css_Files {
	public function all_static_files() {
		$should_load_comments_css = (
			is_singular()
			&&
			(
				blocksy_has_comments()
				||
				is_customize_preview()
			)
		);

		$should_load_comments_css = apply_filters(
			'blocksy:static-files:ct-comments-styles',
			$should_load_comments_css
		);

		$should_load_sidebar = (
			blocksy_sidebar_position() !== 'none'
			||
			is_customize_preview()
			||
			(
				function_exists('is_woocommerce')
				&&
				is_woocommerce()
				&&
				(
					is_shop()
					||
					is_product_category()
					||
					is_product_tag()
					||
					is_product_taxonomy()
					||
					is_search()
				)
				&&
				blocksy_get_theme_mod('has_woo_offcanvas_filter', 'no') === 'yes'
			)
		);

		$static_files = [
			'ct-main-styles' => [
				'url' => '/static/bundle/main.min.css'
			],

			'ct-admin-frontend-styles' => [
				'url' => '/static/bundle/admin-frontend.min.css',
				'enabled' => (
					current_user_can('manage_options')
					||
					current_user_can('edit_theme_options')
				)
			],

			'ct-page-title-styles' => [
				'url' => '/static/bundle/page-title.min.css',
				'enabled' => (
					is_customize_preview()
					||
					blocksy_get_page_title_source()
				)
			],

			'ct-main-rtl-styles' => [
				'url' => '/static/bundle/main-rtl.min.css',
				'enabled' => is_rtl()
			],

			'ct-sidebar-styles' => [
				'url' => '/static/bundle/sidebar.min.css',
				'deps' => ['ct-main-styles'],
				'enabled' => $should_load_sidebar
			],

			'ct-comments-styles' => [
				'url' => '/static/bundle/comments.min.css',
				'deps' => ['ct-main-styles'],
				'enabled' => $should_load_comments_css
			],

			'ct-author-box-styles' => [
				'url' => '/static/bundle/author-box.min.css',
				'deps' => ['ct-main-styles'],
				'enabled' => (
					is_singular()
					&&
					(
						blocksy_has_author_box()
						||
						is_customize_preview()
					)
				)
			],

			'ct-posts-nav-styles' => [
				'url' => '/static/bundle/posts-nav.min.css',
				'deps' => ['ct-main-styles'],
				'enabled' => (
					is_singular()
					&&
					(
						blocksy_has_post_nav()
						||
						is_customize_preview()
					)
				)
			],

			// Integrations
			'ct-forminator-styles' => [
				'url' => '/static/bundle/forminator.min.css',
				'deps' => ['ct-main-styles'],
				'enabled' => class_exists('Forminator')
			],

			'ct-getwid-styles' => [
				'url' => '/static/bundle/getwid.min.css',
				'deps' => ['ct-main-styles'],
				'enabled' => class_exists('Getwid\Getwid')
			],

			'ct-elementor-styles' => [
				'url' => '/static/bundle/elementor-frontend.min.css',
				'deps' => ['ct-main-styles'],
				'enabled' => did_action('elementor/loaded')
			],

			'ct-elementor-woocommerce-styles' => [
				'url' => '/static/bundle/elementor-woocommerce-frontend.min.css',
				'deps' => ['ct-main-styles'],
				'enabled' => (
					did_action('elementor/loaded')
					&&
					function_exists('is_woocommerce')
				)
			],

			'ct-tutor-styles' => [
				'url' => '/static/bundle/tutor.min.css',
				'deps' => ['ct-main-styles'],
				'enabled' => function_exists('tutor_course_enrolled_lead_info')
			],

			'ct-tribe-events-styles' => [
				'url' => '/static/bundle/tribe-events.min.css',
				'deps' => ['ct-main-styles'],
				'enabled' => class_exists('Tribe__Events__Main')
			],

			'ct-brizy-styles' => [
				'url' => '/static/bundle/brizy.min.css',
				'deps' => ['ct-main-styles'],
				'enabled' => function_exists('brizy_load')
			],

			'ct-jet-woo-builder-styles' => [
				'url' => '/static/bundle/jet-woo-builder.min.css',
				'deps' => ['ct-main-styles'],
				'enabled' => class_exists('Jet_Woo_Builder')
			],

			'ct-beaver-styles' => [
				'url' => '/static/bundle/beaver.min.css',
				'deps' => ['ct-main-styles'],
				'enabled' => class_exists('FLBuilderLoader')
			],

			'ct-divi-styles' => [
				'url' => '/static/bundle/divi.min.css',
				'deps' => ['ct-main-styles'],
				'enabled' => class_exists('ET_Builder_Plugin')
			],

			'ct-cf-7-styles' => [
				'url' => '/static/bundle/cf-7.min.css',
				'deps' => ['ct-main-styles'],
				'enabled' => defined('WPCF7_VERSION')
			],

			'ct-stackable-styles' => [
				'url' => '/static/bundle/stackable.min.css',
				'deps' => ['ct-main-styles'],
				'enabled' => defined('STACKABLE_VERSION')
			],

			'ct-qubely-styles' => [
				'url' => '/static/bundle/qubely.min.css',
				'deps' => ['ct-main-styles'],
				'enabled' => defined('QUBELY_VERSION')
			],

			'ct-bbpress-styles' => [
				'url' => '/static/bundle/bbpress.min.css',
				'deps' => ['ct-main-styles'],
				'enabled' => function_exists('is_bbpress')
			],

			'ct-buddypress-styles' => [
				'url' => '/static/bundle/buddypress.min.css',
				'deps' => ['ct-main-styles'],
				'enabled' => function_exists('is_buddypress')
			],

			'ct-wpforms-styles' => [
				'url' => '/static/bundle/wpforms.min.css',
				'deps' => ['ct-main-styles'],
				'enabled' => defined('WPFORMS_VERSION')
			],

			'ct-dokan-styles' => [
				'url' => '/static/bundle/dokan.min.css',
				'deps' => ['ct-main-styles'],
				'enabled' => class_exists('WeDevs_Dokan')
			],

			'ct-page-scroll-to-id-styles' => [
				'url' => '/static/bundle/page-scroll-to-id.min.css',
				'deps' => ['ct-main-styles'],
				'enabled' => class_exists('malihuPageScroll2id')
			],

			'ct-eventkoi-styles' => [
				'url' => '/static/bundle/eventkoi.min.css',
				'deps' => ['ct-main-styles'],
				'enabled' => (
					class_exists('\EventKoi\Init')
					&&
					(
						is_singular('event')
						||
						is_tax('event_cal')
					)
				)
			],
		];

		$static_files = array_merge(
			$static_files,
			$this->dynamic_static_files()
		);

		return apply_filters(
			'blocksy:static-files:all',
			$static_files
		);
	}

	public function dynamic_static_files() {
		global $post;

		$prefix = blocksy_manager()->screen->get_prefix();

		$woo_extra_settings = get_option('blocksy_ext_woocommerce_extra_settings', [
			'features' => []
		]);

		$render = new \Blocksy_Header_Builder_Render();

		$is_elementor_preview = false;

		if (
			class_exists('Elementor\Plugin')
			&&
			(
				\Elementor\Plugin::$instance->preview->is_preview_mode()
				||
				\Elementor\Plugin::$instance->editor->is_edit_mode()
			)
		) {
			$is_elementor_preview = true;
		}

		$should_load_share_box = (
			is_singular()
			&&
			(
				blocksy_has_share_box()
				||
				is_customize_preview()
				||
				is_page(
					blocksy_get_theme_mod('woocommerce_wish_list_page', '__EMPTY__')
				)
				||
				(
					function_exists('blocksy_has_product_specific_layer')
					&&
					blocksy_has_product_specific_layer('product_sharebox')
				)
				||
				(
					function_exists('is_account_page')
					&&
					is_account_page()
				)
				||
				(
					$post
					&&
					has_shortcode($post->post_content, 'product_page')
				)
			)
		);

		$should_load_flexy_styles = (
			is_singular('blc-product-review')
			||
			(
				is_singular()
				&&
				(
					blocksy_get_theme_mod($prefix . '_related_posts_slideshow') === 'slider'
					||
					is_customize_preview()
				)
			)
		);

		if (
			$post
			&&
			is_singular()
			&&
			! $should_load_flexy_styles
		) {
			$should_load_flexy_styles = (
				$should_load_flexy_styles
				||
				(
					has_shortcode(
						$post->post_content,
						'blocksy_posts'
					)
					&&
					strpos(
						$post->post_content,
						'view="slider"'
					) !== false
				)
			);

			$should_load_flexy_styles = (
				$should_load_flexy_styles
				||
				has_shortcode($post->post_content, 'product_page')
			);

			$should_load_flexy_styles = (
				$should_load_flexy_styles
				||
				(
					(
						has_block('blocksy/query', $post->post_content)
						||
						has_block('blocksy/tax-query', $post->post_content)
					)
					&&
					strpos(
						$post->post_content,
						'"has_slideshow":"yes"'
					) !== false
				)
			);
		}

		if (function_exists('is_woocommerce') && ! $should_load_flexy_styles) {
			$should_load_flexy_styles = (
				$should_load_flexy_styles
				||
				blocksy_manager()->screen->is_product()
			);

			$should_load_flexy_styles = (
				$should_load_flexy_styles
				||
				(
					is_woocommerce()
					&&
					isset($woo_extra_settings['features']['added-to-cart-popup'])
					&&
					$woo_extra_settings['features']['added-to-cart-popup']
					&&
					blocksy_get_theme_mod('cart_popup_suggested_products', 'yes') === 'yes'
				)
			);

			$should_load_flexy_styles = (
				$should_load_flexy_styles
				||
				(
					is_checkout()
					&&
					blocksy_get_theme_mod('checkout_suggested_products', 'yes') === 'yes'
				)
			);

			$should_load_flexy_styles = (
				$should_load_flexy_styles
				||
				(
					is_cart()
					&&
					blocksy_get_theme_mod('cart_suggested_products', 'yes') === 'yes'
				)
			);

			$should_load_flexy_styles = (
				$should_load_flexy_styles
				||
				(
					$render->contains_item('cart')
					&&
					blocksy_get_theme_mod('mini_cart_suggested_products', 'yes') === 'yes'
				)
			);

			if (
				$post
				&&
				! $should_load_flexy_styles
			) {
				$should_load_flexy_styles = (
					$should_load_flexy_styles
					||
					(
						(
							has_shortcode($post->post_content, 'products')
							||
							has_shortcode($post->post_content, 'top_rated_products')
							||
							has_shortcode($post->post_content, 'featured_products')
							||
							has_shortcode($post->post_content, 'sale_products')
							||
							has_shortcode($post->post_content, 'best_selling_products')
							||
							has_shortcode($post->post_content, 'recent_products')
							||
							has_shortcode($post->post_content, 'product_category')
						)
						&&
						isset($woo_extra_settings['features']['added-to-cart-popup'])
						&&
						$woo_extra_settings['features']['added-to-cart-popup']
						&&
						blocksy_get_theme_mod('cart_popup_suggested_products', 'yes') === 'yes'
					)
				);
			}
		}

		if ($is_elementor_preview) {
			$should_load_flexy_styles = true;
		}

		return [
			'ct-woocommerce-cart-checkout-blocks' => [
				'url' => '/static/bundle/woocommerce-cart-checkout-blocks.min.css',
				'enabled' => (
					has_block('woocommerce/cart')
					||
					has_block('woocommerce/checkout')
				)
			],

			'ct-share-box-styles' => [
				'url' => '/static/bundle/share-box.min.css',
				'deps' => ['ct-main-styles'],
				'enabled' => $should_load_share_box
			],

			'ct-flexy-styles' => [
				'url' => '/static/bundle/flexy.min.css',
				'deps' => ['ct-main-styles'],
				'enabled' => $should_load_flexy_styles
			],
		];
	}

	public function enqueue_static_files($theme) {
		foreach ($this->all_static_files() as $id => $internal_file) {
			$file = wp_parse_args($internal_file, [
				'enabled' => true,
				'deps' => [],
				'url' => ''
			]);

			$file['url'] = get_template_directory_uri() . $file['url'];

			if (! $file['enabled']) {
				wp_register_style(
					$id,
					$file['url'],
					$file['deps'],
					$theme->get('Version')
				);

				continue;
			}

			wp_enqueue_style(
				$id,
				$file['url'],
				$file['deps'],
				$theme->get('Version')
			);
		}

		$this->check_for_patterns();
	}

	public function recheck_dynamic_styles() {
		foreach ($this->dynamic_static_files() as $id => $file) {
			$file = wp_parse_args($file, [
				'enabled' => true
			]);

			if ($file['enabled']) {
				wp_enqueue_style($id);
			}
		}
	}

	public function check_for_patterns() {
		add_filter('pre_render_block', function ($block_content, $block) {
			if ($block['blockName'] === 'core/block') {
				if (
					isset($block['attrs']['ref'])
					&&
					get_post($block['attrs']['ref'])
				) {
					global $post;
					$original_post = $post;

					$post = get_post($block['attrs']['ref']);
					setup_postdata($post);

					$this->recheck_dynamic_styles();

					$post = $original_post;
					setup_postdata($post);
				}
			}

			return $block_content;
		}, 10, 2);
	}
}
