<?php

if ( ! isset( $content_width ) ) {
	$content_width = 1020; // Pixels.
}

/**
 * Initialized Envato and Flatsome Account implementation.
 */
flatsome_envato();

/**
 * Only load styles for used blocks.
 */
add_filter( 'should_load_separate_core_block_assets', '__return_true' );

/**
 * Use shortcodes for cart & checkout, since WC 8.3 cart & checkout are blocks by default upon first installation.
 *
 * @param array $pages Pages.
 *
 * @return array
 */
function flatsome_woocommerce_create_pages( $pages ) {
	if ( ! fl_woocommerce_version_check( '8.3' ) ) {
		return $pages;
	}

	if ( apply_filters( 'experimental_flatsome_woocommerce_blockify', false ) ) {
		return $pages;
	}

	$pages['cart']['content']     = '<!-- wp:shortcode -->[woocommerce_cart]<!-- /wp:shortcode -->';
	$pages['checkout']['content'] = '<!-- wp:shortcode -->[woocommerce_checkout]<!-- /wp:shortcode -->';

	return $pages;
}

add_filter( 'woocommerce_create_pages', 'flatsome_woocommerce_create_pages' );

/**
 * Setup Flatsome.
 */
function flatsome_setup() {

	/* add woocommerce support */
	add_theme_support( 'woocommerce' );

	if ( get_theme_mod( 'wpseo_breadcrumb' ) ) {
		add_theme_support( 'yoast-seo-breadcrumbs' );
	}

	/* add title tag support */
	add_theme_support( 'title-tag' );

	/* Load child theme languages */
	load_theme_textdomain( 'flatsome', get_stylesheet_directory() . '/languages' );

	/* load theme languages */
	load_theme_textdomain( 'flatsome', get_template_directory() . '/languages' );

	/* Add default posts and comments RSS feed links to head */
	add_theme_support( 'automatic-feed-links' );

	/* Add excerpt to pages */
	add_post_type_support( 'page', 'excerpt' );

	/* Add support for post thumbnails */
	add_theme_support( 'post-thumbnails' );

	/* Add support for Selective Widget refresh */
	add_theme_support( 'customize-selective-refresh-widgets' );

	/** Add sensei support */
	add_theme_support( 'sensei' );

	/* Add support for HTML5 */
	add_theme_support( 'html5', array(
		'search-form',
		'comment-form',
		'comment-list',
		'gallery',
		'caption',
		'widgets',
	) );

	/*  Register menus. */
	register_nav_menus( array(
		'primary'        => __( 'Main Menu', 'flatsome' ),
		'primary_mobile' => __( 'Main Menu - Mobile', 'flatsome' ),
		'secondary'      => __( 'Secondary Menu', 'flatsome' ),
		'footer'         => __( 'Footer Menu', 'flatsome' ),
		'top_bar_nav'    => __( 'Top Bar Menu', 'flatsome' ),
		'my_account'     => __( 'My Account Menu', 'flatsome' ),
		'vertical'       => __( 'Vertical Menu', 'flatsome' ),
	) );

	/*  Register post meta. */
	register_post_meta( 'page', '_footer', array(
		'show_in_rest'  => current_user_can( 'edit_posts' ),
		'single'        => true,
		'type'          => 'string',
		'default'       => 'normal',
		'auth_callback' => function () {
			return current_user_can( 'edit_posts' );
		},
	) );

	/*  Enable support for Post Formats */
	add_theme_support( 'post-formats', array( 'video' ) );

	// Disable widgets-block-editor for now.
	remove_theme_support( 'widgets-block-editor' );
}

add_action( 'after_setup_theme', 'flatsome_setup' );


/**
 * Setup Theme Widgets
 */
function flatsome_widgets_init() {

	$title_before = '';
	$title_class  = '';
	$title_after  = '<div class="is-divider small"></div>';

	register_sidebar( array(
		'name'          => __( 'Sidebar', 'flatsome' ),
		'id'            => 'sidebar-main',
		'before_widget' => '<aside id="%1$s" class="widget %2$s">',
		'after_widget'  => '</aside>',
		'before_title'  => $title_before . '<span class="widget-title ' . $title_class . '"><span>',
		'after_title'   => '</span></span>' . $title_after,
	) );


	register_sidebar( array(
		'name'          => __( 'Footer 1', 'flatsome' ),
		'id'            => 'sidebar-footer-1',
		'before_widget' => '<div id="%1$s" class="col pb-0 widget %2$s">',
		'after_widget'  => '</div>',
		'before_title'  => '<span class="widget-title">',
		'after_title'   => '</span><div class="is-divider small"></div>',
	) );


	register_sidebar( array(
		'name'          => __( 'Footer 2', 'flatsome' ),
		'id'            => 'sidebar-footer-2',
		'before_widget' => '<div id="%1$s" class="col pb-0 widget %2$s">',
		'after_widget'  => '</div>',
		'before_title'  => '<span class="widget-title">',
		'after_title'   => '</span><div class="is-divider small"></div>',
	) );
}

add_action( 'widgets_init', 'flatsome_widgets_init' );


/**
 * Setup Flatsome Styles and Scripts
 */
function flatsome_scripts() {
	$uri     = get_template_directory_uri();
	$theme   = wp_get_theme( get_template() );
	$version = $theme->get( 'Version' );

	// Styles.
	wp_enqueue_style( 'flatsome-main', $uri . '/assets/css/flatsome.css', array(), $version, 'all' );
	wp_style_add_data( 'flatsome-main', 'rtl', 'replace' );


	if ( is_woocommerce_activated() ) {
		wp_enqueue_style( 'flatsome-shop', $uri . '/assets/css/flatsome-shop.css', array(), $version, 'all' );
		wp_style_add_data( 'flatsome-shop', 'rtl', 'replace' );
	}

	// Load current theme styles.css file.
	if ( ! get_theme_mod( 'flatsome_disable_style_css', 0 ) ) {
		wp_enqueue_style( 'flatsome-style', get_stylesheet_uri(), array(), wp_get_theme()->get( 'Version' ), 'all' );
	}

	// Register styles (Loaded on request).
	wp_register_style( 'flatsome-effects', $uri . '/assets/css/effects.css', array(), $version, 'all' );

	// Register scripts (Loaded on request).
	wp_register_script( 'flatsome-masonry-js', $uri . '/assets/libs/packery.pkgd.min.js', array( 'jquery' ), $version, true );
	wp_register_script( 'flatsome-isotope-js', $uri . '/assets/libs/isotope.pkgd.min.js', array( 'jquery', 'flatsome-js' ), $version, true );

	// Google maps.
	$maps_api = trim( get_theme_mod( 'google_map_api' ) );
	if ( ! empty( $maps_api ) ) {
		wp_register_script( 'flatsome-maps', "//maps.googleapis.com/maps/api/js?key=$maps_api&callback=jQuery.noop", array( 'jquery' ), $version, true );
	}

	// Enqueue theme scripts.
	flatsome_enqueue_asset( 'flatsome-js', 'flatsome', array( 'jquery', 'hoverIntent' ) );

	// Register theme assets.
	flatsome_register_asset( 'flatsome-relay', 'flatsome-relay', array( 'flatsome-js', 'jquery' ) );

	$sticky_height = get_theme_mod( 'header_height_sticky', 70 );

	if ( is_admin_bar_showing() ) {
		$sticky_height = $sticky_height + 30;
	}

	$lightbox_close_markup = apply_filters('flatsome_lightbox_close_button', '<button title="%title%" type="button" class="mfp-close"><svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-x"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg></button>');

	$localize_data = array(
		'theme'              => array( 'version' => $version ),
		'ajaxurl'            => admin_url( 'admin-ajax.php' ),
		'rtl'                => is_rtl(),
		'sticky_height'      => $sticky_height, // Deprecated.
		'stickyHeaderHeight' => 0,
		'scrollPaddingTop'   => 0,
		'assets_url'         => $uri . '/assets/',
		'lightbox'           => array(
			'close_markup'     => $lightbox_close_markup,
			'close_btn_inside' => apply_filters( 'flatsome_lightbox_close_btn_inside', false ),
		),
		'user'               => array(
			'can_edit_pages' => current_user_can( 'edit_pages' ),
		),
		'i18n'               => array(
			'mainMenu'     => __( 'Main Menu', 'flatsome' ),
			'toggleButton' => __( 'Toggle', 'flatsome' ),
		),
		'options'            => array(
			'cookie_notice_version'          => get_theme_mod( 'cookie_notice_version', '1' ),
			'swatches_layout'                => get_theme_mod( 'swatches_layout' ),
			'swatches_disable_deselect'      => get_theme_mod( 'swatches_disable_deselect' ),
			'swatches_box_select_event'      => get_theme_mod( 'swatches_box_select_event' ),
			'swatches_box_behavior_selected' => get_theme_mod( 'swatches_box_behavior_selected' ),
			'swatches_box_update_urls'       => get_theme_mod( 'swatches_box_update_urls', '1' ),
			'swatches_box_reset'             => get_theme_mod( 'swatches_box_reset' ),
			'swatches_box_reset_limited'     => get_theme_mod( 'swatches_box_reset_limited' ),
			'swatches_box_reset_extent'      => get_theme_mod( 'swatches_box_reset_extent' ),
			'swatches_box_reset_time'        => get_theme_mod( 'swatches_box_reset_time', 300 ),
			'search_result_latency'          => get_theme_mod( 'search_result_latency', '0' ),
		),
	);

	if ( is_woocommerce_activated() ) {
		$wc_localize_data = array(
			'is_mini_cart_reveal' => flatsome_is_mini_cart_reveal(),
		);

		$localize_data = array_merge( $localize_data, $wc_localize_data );
	}

	// Add variables to scripts.
	wp_localize_script( 'flatsome-js', 'flatsomeVars', $localize_data );

	if ( apply_filters( 'experimental_flatsome_pjax_enabled', true ) ) {
		$pjax = apply_filters( 'experimental_flatsome_pjax', array(
			'selectors'           => array(),
			'elements'            => array( '#wrapper' ),
			'processing_elements' => array(),
			'scroll_to_top'       => get_theme_mod( 'pjax_scroll_to_top' ),
			'cache_bust'          => false,
			'timeout'             => 5000,
		) );

		foreach ( [ 'selectors', 'elements' ] as $key ) {
			if ( isset( $pjax[ $key ] ) ) {
				if ( ! is_array( $pjax[ $key ] ) ) {
					trigger_error( "Filter 'flatsome_pjax' expects an array as value for key '$key'. Defaulting to empty array." ); // phpcs:ignore
					$pjax[ $key ] = array();
					continue;
				}
				$pjax[ $key ] = array_filter( array_unique( $pjax[ $key ] ) );
			}
		}

		if ( ! empty( $pjax['selectors'] ) && ! empty( $pjax['elements'] ) ) {
			flatsome_enqueue_asset( 'flatsome-pjax', 'flatsome-pjax', array( 'flatsome-js', 'jquery' ) );
			wp_add_inline_script( 'flatsome-pjax', 'var flatsomePjax = ' . wp_json_encode( $pjax ), 'before' );
		}
	}

	if ( is_woocommerce_activated() ) {
		flatsome_enqueue_asset( 'flatsome-theme-woocommerce-js', 'woocommerce', array( 'flatsome-js', 'woocommerce' ) );
	}

	if ( is_singular() && comments_open() && get_option( 'thread_comments' ) ) {
		wp_enqueue_script( 'comment-reply' );
	}
}

add_action( 'wp_enqueue_scripts', 'flatsome_scripts', 100 );

/**
 * Set up UX Builder.
 */
function flatsome_ux_builder_setup() {
	// Add Ux Builder to post types.
	add_ux_builder_post_type( 'blocks' );
	add_ux_builder_post_type( 'product' );
	add_ux_builder_post_type( 'featured_item' );
}

add_action( 'init', 'flatsome_ux_builder_setup', 10 );

/**
 * Enqueue UX Builder scripts.
 *
 * @param  string $context Context is «editor» or content.
 */
function flatsome_ux_builder_scripts( $context ) {
	$uri     = get_template_directory_uri();
	$theme   = wp_get_theme( get_template() );
	$version = $theme->get( 'Version' );

	// Add UxBuilder assets.
	if ( $context == 'editor' ) {
		flatsome_enqueue_asset( 'ux-builder-flatsome', 'builder/custom/editor', array( 'ux-builder-core' ) );
		wp_enqueue_style( 'ux-builder-flatsome', $uri . '/assets/css/builder/custom/builder.css', array( 'ux-builder-core' ), $version );
	}
	if ( $context == 'content' ) {
		wp_enqueue_style( 'ux-builder-flatsome', $uri . '/assets/css/builder/custom/builder.css', null, $version );
		flatsome_enqueue_asset( 'ux-builder-flatsome', 'builder/custom/content', array(
			'flatsome-js',
			'flatsome-masonry-js',
		) );
	}
}

add_action( 'ux_builder_enqueue_scripts', 'flatsome_ux_builder_scripts', 10 );


if ( ! is_admin() && get_theme_mod( 'lazy_load_backgrounds', 1 ) ) {
	/**
	 * Lazy load backgrounds
	 */
	function flatsome_lazy_load_backgrounds_css() {
		echo '<style>.bg{opacity: 0; transition: opacity 1s; -webkit-transition: opacity 1s;} .bg-loaded{opacity: 1;}</style>';
	}

	add_filter( 'wp_head', 'flatsome_lazy_load_backgrounds_css' );
}

/**
 * Remove jQuery migrate.
 *
 * @param WP_Scripts $scripts WP_Scripts object.
 */
function flatsome_remove_jquery_migrate( $scripts ) {
	if ( ! get_theme_mod( 'jquery_migrate' ) ) return;
	if ( ! is_admin() && isset( $scripts->registered['jquery'] ) ) {
		$script = $scripts->registered['jquery'];

		if ( $script->deps ) { // Check whether the script has any dependencies.
			$script->deps = array_diff( $script->deps, array(
				'jquery-migrate',
			) );
		}
	}
}

add_action( 'wp_default_scripts', 'flatsome_remove_jquery_migrate' );

// Disable emoji scripts
if ( ! is_admin() && get_theme_mod( 'disable_emoji', 0 ) ) {
	remove_action('wp_head', 'print_emoji_detection_script', 7);
	remove_action('wp_print_styles', 'print_emoji_styles');
}

function flatsome_deregister_block_styles() {
	if ( ! is_admin() && get_theme_mod( 'disable_blockcss', 0 ) ) {
    wp_dequeue_style( 'wp-block-library' );
  }
}
add_action( 'wp_print_styles', 'flatsome_deregister_block_styles', 100 );

/**
 * Prefetch lazy-loaded chunks.
 */
function flatsome_prefetch_scripts( $urls, $type ) {
	static $manifest;

	$manifest_path = get_template_directory() . '/assets/manifest.json';
	$assets_url    = get_template_directory_uri() . '/assets';
	$theme         = wp_get_theme( get_template() );
	$version       = $theme->get( 'Version' );

	if ( empty( $manifest ) ) {
		if ( ! file_exists( $manifest_path ) ) {
			return $urls;
		}
		$manifest = wp_json_file_decode( $manifest_path, [ 'associative' => true ] );
	}

	$asset_handle_map = array(
		'js/flatsome'    => 'flatsome-js',
		'js/woocommerce' => 'flatsome-theme-woocommerce-js',
	);

	foreach ( $manifest as $key => $asset ) {
		if ( empty( $asset_handle_map[ $key ] ) ) continue;

		$handle = $asset_handle_map[ $key ];

		if ( wp_script_is( $handle, 'enqueued' ) ) {
			if ( $type === 'prefetch' ) {
				$script = wp_scripts()->registered[ $handle ];
				$urls[] = add_query_arg( 'ver', $script->ver, $script->src );
			}
			if ( ! empty( $asset[ $type ]['js'] ) ) {
				foreach ( $asset[ $type ]['js'] as $path ) {
					$urls[] = $assets_url . "/$path?ver=" . $version;
				}
			}
		}
	}
	return $urls;
}
add_filter( 'wp_resource_hints', 'flatsome_prefetch_scripts', 10, 2 );

/**
 * Add JSON to allowed file types.
 *
 * @param array $mimes Allowed file types.
 */
function flatsome_upload_mimes( $mimes ) {
	if ( ! isset( $mimes['json'] ) ) {
		$mimes['json'] = 'text/plain';
	}
	return $mimes;
}
add_filter( 'upload_mimes', 'flatsome_upload_mimes' );

/**
 * Configures Flatsome PJAX.
 *
 * If '$args['selectors'][]' or '$args['element'][]' array is empty, PJAX does not load & activate.
 *
 * @param array $args The original array of arguments provided by the 'flatsome_pjax' filter.
 *
 * @return array The modified array of arguments.
 */
function experimental_flatsome_pjax_config( $args ) {
	if ( get_theme_mod( 'blog_pagination' ) === 'ajax' ) {
		if ( flatsome_is_blog_archive() ) {
			$args['selectors'][]                       = '.page-numbers.nav-pagination:not(.ux-relay__pagination) li a';
			$args['processing_elements']['#post-list'] = [
				'style'    => 'spotlight',
				'position' => 'sticky',
			];
		}

		if ( is_single() && get_post_type() === 'post' ) {
			$args['selectors'][]                               = '.navigation-post a';
			$args['processing_elements']['.blog-single .post'] = [
				'style'    => 'spotlight',
				'position' => 'sticky',
			];
		}
	}

	if ( is_woocommerce_activated() ) {
		$is_shop_archive      = flatsome_is_shop_archive();
		$shop_ajax_pagination = get_theme_mod( 'shop_pagination' ) === 'ajax';

		if ( $shop_ajax_pagination && $is_shop_archive ) {
			$args['selectors'][] = '.woocommerce-pagination a';
		}

		if ( get_theme_mod( 'shop_filter_widgets_pjax' ) && $is_shop_archive ) {
			$args['selectors'][] = '.widget_layered_nav li';
			$args['selectors'][] = '.widget_rating_filter li';
			$args['selectors'][] = '.widget_layered_nav_filters li';
			$args['selectors'][] = '.widget_product_categories ul a';

			add_filter( 'body_class', function ( $classes ) {
				$classes[] = 'ux-shop-ajax-filters';

				return $classes;
			} );
		}

		if ( $is_shop_archive ) {
			$args['processing_elements']['.shop-container'] = [
				'style'    => 'spotlight',
				'position' => 'sticky',
			];
		}
	}

	return $args;
}

add_filter( 'experimental_flatsome_pjax', 'experimental_flatsome_pjax_config' );
