<?php

namespace Blocksy;

/**
 * Theme Update
 *
 * @copyright 2019-present Creative Themes
 * @license   http://www.gnu.org/copyleft/gpl.html GNU General Public License
 * @package   Blocksy
 */

class DbVersioning {
	public function __construct() {
		add_action(
			'init',
			[$this, 'init'],

			// Some CPT plugins are registering their CPTs on init with
			// priority 10. We need to run this after them.
			15
		);

		add_action(
			'blocksy:db-versioning:trigger-migration',
			[$this, 'init']
		);
	}

	public function init() {
		new \Blocksy\DbVersioning\CacheManager();

		$saved_version = get_option('blocksy_db_version', '1.0.0');

		$theme = blocksy_get_wp_parent_theme();
		$current_version = $theme->get('Version');

		$patches_to_run = [];

		foreach ($this->get_patches() as $single_patch) {
			if (
				version_compare(
					$saved_version,
					$single_patch['version'],
					'<'
				)
			) {
				$patches_to_run[] = $single_patch;
			}
		}

		$successfull_patches = 0;

		if (count($patches_to_run) > 0) {
			// delete_transient('blocksy_dynamic_styles_descriptor');
		}

		foreach ($patches_to_run as $single_patch) {
			$result = call_user_func($single_patch['cb']);

			if ($result !== 'RETRY') {
				$successfull_patches++;
			}
		}

		if (version_compare($saved_version, $current_version, '<')) {
			if (count($patches_to_run) === $successfull_patches) {
				update_option('blocksy_db_version', $current_version);
			}

			do_action('blocksy:cache-manager:purge-all');
			do_action('blocksy:dynamic-css:refresh-caches');
		}
	}

	public function get_patches() {
		return [
			[
				'version' => '1.6.5',
				'cb' => [$this, 'v_1_6_5']
            ],

			[
				'version' => '1.7.17',
				'cb' => [$this, 'v_1_7_17']
			],

			[
				'version' => '1.7.18',
				'cb' => [$this, 'v_1_7_18']
			],

			[
				'version' => '1.7.25',
				'cb' => [$this, 'v_1_7_25']
			],

			[
				'version' => '1.7.30',
				'cb' => [$this, 'v_1_7_30']
			],

			[
				'version' => '1.7.36',
				'cb' => [$this, 'v_1_7_36']
			],

			[
				'version' => '1.7.41',
				'cb' => [$this, 'v_1_7_41']
			],

			[
				'version' => '1.7.55',
				'cb' => [$this, 'v_1_7_55']
			],

			[
				'version' => '1.7.56',
				'cb' => [$this, 'v_1_7_56']
			],

			[
				'version' => '1.7.65',
				'cb' => [$this, 'v_1_7_65']
			],

			[
				'version' => '1.7.72',
				'cb' => [$this, 'v_1_7_72']
			],

			[
				'version' => '1.8.0',
				'cb' => [$this, 'v_1_8_0']
			],

			[
				'version' => '1.8.4',
				'cb' => [$this, 'v_1_8_4']
			],

			[
				'version' => '1.8.5',
				'cb' => [$this, 'v_1_8_5']
			],

			[
				'version' => '1.8.6.1',
				'cb' => [$this, 'v_1_8_6_1']
			],

			[
				'version' => '1.8.12',
				'cb' => [$this, 'v_1_8_12']
			],

			[
				'version' => '1.8.20',
				'cb' => [$this, 'v_1_8_20']
			],

			[
				'version' => '1.8.26',
				'cb' => [$this, 'v_1_8_26']
			],

			[
				'version' => '1.8.38',
				'cb' => [$this, 'v_1_8_38']
			],

			[
				'version' => '1.8.67',
				'cb' => [$this, 'v_1_8_67']
			],

			[
				'version' => '1.8.91',
				'cb' => [$this, 'v_1_8_91']
			],

			[
				'version' => '1.9.11',
				'cb' => [$this, 'v_1_9_11']
			],

			[
				'version' => '2.0.0-beta26',
				'cb' => function () {
					$obj = new DbVersioning\V200();
					$obj->migrate();
				}
			],

			[
				'version' => '2.0.2',
				'cb' => function () {
					$obj = new DbVersioning\V202();
					$obj->migrate();
				}
			],

			[
				'version' => '2.0.3',
				'cb' => function () {
					$obj = new DbVersioning\V203();
					$obj->migrate();
				}
			],

			[
				'version' => '2.0.9',
				'cb' => function () {
					$obj = new DbVersioning\V209();
					$obj->migrate();
				}
			],

			[
				'version' => '2.0.15',
				'cb' => function () {
					$obj = new DbVersioning\V2015();
					$obj->migrate();
				}
			],

			[
				'version' => '2.0.19',
				'cb' => function () {
					$obj = new DbVersioning\V2019();
					$obj->migrate();
				}
			],

			[
				'version' => '2.0.26',
				'cb' => function () {
					$obj = new DbVersioning\V2026();
					$obj->migrate();
				}
			],

			[
				'version' => '2.0.27',
				'cb' => function () {
					$obj = new DbVersioning\V2027();
					$obj->migrate();
				}
			],

			[
				'version' => '2.0.31',
				'cb' => function () {
					$obj = new DbVersioning\V2031();
					$obj->migrate();
				}
			],

			[
				'version' => '2.0.34',
				'cb' => function () {
					$obj = new DbVersioning\V2034();
					$obj->migrate();
				}
			],

			[
				'version' => '2.0.36',
				'cb' => function () {
					$obj = new DbVersioning\V2036();
					$obj->migrate();
				}
			],

			[
				'version' => '2.0.38',
				'cb' => function () {
					$obj = new DbVersioning\V2038();
					$obj->migrate();
				}
			],

			[
				'version' => '2.0.53',
				'cb' => function () {
					$obj = new DbVersioning\V2053();
					$obj->migrate();
				}
			],

			[
				'version' => '2.0.60',
				'cb' => function () {
					$obj = new DbVersioning\V2060();
					$obj->migrate();
				}
			],

			[
				'version' => '2.0.67',
				'cb' => function () {
					$obj = new DbVersioning\V2067();
					$obj->migrate();
				}
			],

			[
				'version' => '2.0.70',
				'cb' => function () {
					$obj = new DbVersioning\V2070();
					$obj->migrate();
				}
			],

			[
				'version' => '2.0.72',
				'cb' => function () {
					$obj = new DbVersioning\V2072();

					$obj->migrate();
					$obj->migrate_compare_table_layers();
				}
			],

			[
				'version' => '2.0.73',
				'cb' => function () {
					$obj = new DbVersioning\V2073();

					$obj->migrate();
				}
			],

			[
				'version' => '2.0.74',
				'cb' => function () {
					$obj = new DbVersioning\V2074();

					$obj->migrate();
				}
			],

			[
				'version' => '2.0.75',
				'cb' => function () {
					$obj = new DbVersioning\V2075();

					$obj->migrate();
				}
			],

			[
				'version' => '2.0.76',
				'cb' => function () {
					$obj = new DbVersioning\V2076();

					$obj->migrate();
				}
			],

			[
				'version' => '2.0.87',
				'cb' => function () {
					$obj = new DbVersioning\V2087();

					$obj->migrate();
				}
			],

			[
				'version' => '2.0.92',
				'cb' => function () {
					$obj = new DbVersioning\V2092();
					$obj->migrate();
				}
			],

			[
				'version' => '2.0.93',
				'cb' => function () {
					$obj = new DbVersioning\V2093();
					$obj->migrate();
				}
			],

			[
				'version' => '2.0.94',
				'cb' => function () {
					$obj = new DbVersioning\V2094();
					$obj->migrate();
				}
			],

			[
				'version' => '2.0.96',
				'cb' => function () {
					$obj = new DbVersioning\V2096();
					$obj->migrate();
				}
			],

			[
				'version' => '2.1.0',
				'cb' => function () {
					$obj = new DbVersioning\V210();
					$obj->migrate();
				}
			],

			[
				'version' => '2.1.1',
				'cb' => function () {
					$obj = new DbVersioning\V211();
					$obj->migrate();
				}
			],

			[
				'version' => '2.1.10',
				'cb' => function () {
					$obj = new DbVersioning\V2110();
					$obj->migrate();
				}
			],

			[
				'version' => '2.1.44-dev1',
				'cb' => function () {
					$obj = new DbVersioning\V2144();
					$obj->migrate();
				}
			],

			[
				'version' => '2.1.45-dev9',
				'cb' => function () {
					$obj = new DbVersioning\V2145();
					return $obj->migrate();
				}
			]
		];
	}

	public function v_1_6_5() {
		if (get_theme_mod('narrowContainerWidth', null)) {
			$narrowContainerWidth = get_theme_mod('narrowContainerWidth', null);

			if (
				intval($narrowContainerWidth) <= 100
				&&
				intval($narrowContainerWidth) >= 50
			) {
				remove_theme_mod('narrowContainerWidth');
			}
		}
	}

	public function v_1_7_17() {
		if (
			get_theme_mod('has_trending_block', '__empty__') === 'yes'
			&&
			class_exists('\Blocksy\Plugin')
		) {
			$manager = \Blocksy\Plugin::instance()->extensions;
			$manager->activate_extension('trending');
		}

		// TODO: options to migrate
		//
		// Page title:
		// single_blog_post_title_enabled -> single_blog_post_hero_enabled
		// woo_categories_has_page_title -> woo_categories_hero_enabled
		// blog_page_title_enabled -> blog_hero_enabled
		// cpt_single_title_enabled -> cpt_single_hero_enabled
		// cpt_archive_title_enabled -> cpt_archive_hero_enabled
		// categories_has_page_title -> categories_hero_enabled
		// search_page_title_enabled -> search_hero_enabled
		// author_page_title -> author_hero_enabled
		// single_page_title_enabled -> single_page_hero_enabled
		//
		//
		// Structure:
		//
		// single_content_style -> single_blog_post_content_style
		// post_background -> single_blog_post_background
		// post_content_background -> single_blog_post_content_background
		// postContentBoxedSpacing -> single_blog_post_content_boxed_spacing
		// postContentBoxedRadius -> single_blog_post_content_boxed_radius
		// postContentBoxedShadow -> single_blog_post_content_boxed_shadow
		//
		// page_content_style -> single_page_content_style
		// page_background -> single_page_background
		// page_content_background -> single_page_content_background
		// pageContentBoxedSpacing -> single_page_content_boxed_spacing
		// pageContentBoxedRadius -> single_page_content_boxed_radius
		// pageContentBoxedShadow -> single_page_content_boxed_shadow

		$this->migrate_options([
			[
				'old' => 'single_blog_post_title_enabled',
				'new' => 'single_blog_post_hero_enabled'
			],

			[
				'old' => 'woo_categories_has_page_title',
				'new' => 'woo_categories_hero_enabled'
			],

			[
				'old' => 'blog_page_title_enabled',
				'new' => 'blog_hero_enabled'
			],

			[
				'old' => 'categories_has_page_title',
				'new' => 'categories_hero_enabled'
			],

			[
				'old' => 'search_page_title_enabled',
				'new' => 'search_hero_enabled'
			],

			[
				'old' => 'author_page_title',
				'new' => 'author_hero_enabled'
			],

			[
				'old' => 'single_page_title_enabled',
				'new' => 'single_page_hero_enabled'
			],

			// Structure
			[
				'old' => 'single_content_style',
				'new' => 'single_blog_post_content_style'
			],

			[
				'old' => 'post_background',
				'new' => 'single_blog_post_background'
			],

			[
				'old' => 'post_content_background',
				'new' => 'single_blog_post_content_background',
			],

			[
				'old' => 'postContentBoxedSpacing',
				'new' => 'single_blog_post_content_boxed_spacing'
			],

			[
				'old' => 'postContentBoxedRadius',
				'new' => 'single_blog_post_content_boxed_radius'
			],

			[
				'old' => 'postContentBoxedShadow',
				'new' => 'single_blog_post_content_boxed_shadow'
			],

			[
				'old' => 'page_content_style',
				'new' => 'single_page_content_style'
			],

			[
				'old' => 'page_background',
				'new' => 'single_page_background'
			],

			[
				'old' => 'page_content_background',
				'new' => 'single_page_content_background'
			],

			[
				'old' => 'pageContentBoxedSpacing',
				'new' => 'single_page_content_boxed_spacing'
			],

			[
				'old' => 'pageContentBoxedRadius',
				'new' => 'single_page_content_boxed_radius'
			],

			[
				'old' => 'pageContentBoxedShadow',
				'new' => 'single_page_content_boxed_shadow'
			],

			[
				'old' => 'has_share_box',
				'new' => 'single_blog_post_has_share_box'
			],

			[
				'old' => 'share_box_type',
				'new' => 'single_blog_post_share_box_type'
			],

			[
				'old' => 'share_box1_location',
				'new' => 'single_blog_post_share_box1_location'
			],

			[
				'old' => 'share_box2_location',
				'new' => 'single_blog_post_share_box2_location'
			],

			[
				'old' => 'share_facebook',
				'new' => 'single_blog_post_share_facebook'
			],

			[
				'old' => 'share_twitter',
				'new' => 'single_blog_post_share_twitter'
			],

			[
				'old' => 'share_pinterest',
				'new' => 'single_blog_post_share_pinterest'
			],

			[
				'old' => 'share_linkedin',
				'new' => 'single_blog_post_share_linkedin'
			],

			[
				'old' => 'share_reddit',
				'new' => 'single_blog_post_share_reddit'
			],

			[
				'old' => 'share_hacker_news',
				'new' => 'single_blog_post_share_hacker_news'
			],

			[
				'old' => 'share_vk',
				'new' => 'single_blog_post_share_vk'
			],

			[
				'old' => 'share_ok',
				'new' => 'single_blog_post_share_ok'
			],

			[
				'old' => 'share_telegram',
				'new' => 'single_blog_post_share_telegram'
			],

			[
				'old' => 'share_viber',
				'new' => 'single_blog_post_share_viber'
			],

			[
				'old' => 'share_whatsapp',
				'new' => 'single_blog_post_share_whatsapp'
			],

			[
				'old' => 'share_box_visibility',
				'new' => 'single_blog_post_share_box_visibility'
			],

			[
				'old' => 'shareItemsIconColor',
				'new' => 'single_blog_post_share_items_icon_color'
			],

			[
				'old' => 'shareItemsIconColor',
				'new' => 'single_blog_post_share_items_border'
			],

			[
				'old' => 'topShareBoxSpacing',
				'new' => 'single_blog_post_top_share_box_spacing'
			],

			[
				'old' => 'bottomShareBoxSpacing',
				'new' => 'single_blog_post_bottom_share_box_spacing'
			],

			[
				'old' => 'shareItemsIcon',
				'new' => 'single_blog_post_share_items_icon'
			],

			[
				'old' => 'shareItemsBackground',
				'new' => 'single_blog_post_share_items_background'
			],

			[
				'old' => 'has_author_box',
				'new' => 'single_blog_post_has_author_box'
			],

			[
				'old' => 'single_author_box_type',
				'new' => 'single_blog_post_single_author_box_type',
			],

			[
				'old' => 'single_author_box_social',
				'new' => 'single_blog_post_single_author_box_social'
			],

			[
				'old' => 'singleAuthorBoxSpacing',
				'new' => 'single_blog_post_single_author_box_spacing'
			],

			[
				'old' => 'author_box_visibility',
				'new' => 'single_blog_post_author_box_visibility'
			],

			[
				'old' => 'singleAuthorBoxBorder',
				'new' => 'single_blog_post_single_author_box_border'
			],

			[
				'old' => 'singleAuthorBoxBackground',
				'new' => 'single_blog_post_single_author_box_background'
			],

			[
				'old' => 'singleAuthorBoxShadow',
				'new' => 'single_blog_post_single_author_box_shadow'
			],


			[
				'old' => 'has_post_nav',
				'new' => 'single_blog_post_has_post_nav'
			],

			[
				'old' => 'has_post_nav_title',
				'new' => 'single_blog_post_single_blog_post'
			],

			[
				'old' => 'has_post_nav_thumb',
				'new' => 'single_blog_post_has_post_nav_thumb'
			],

			[
				'old' => 'postNavSpacing',
				'new' => 'single_blog_post_post_nav_spacing'
			],

			[
				'old' => 'post_nav_visibility',
				'new' => 'single_blog_post_post_nav_visibility'
			],

			[
				'old' => 'postsNavFontColor',
				'new' => 'single_blog_post_posts_nav_font_color'
			],

			[
				'old' => 'has_related_posts',
				'new' => 'single_blog_post_has_related_posts'
			],

			[
				'old' => 'related_posts_count',
				'new' => 'single_blog_post_related_posts_count'
			],

			[
				'old' => 'related_posts_columns',
				'new' => 'single_blog_post_related_posts_columns'
			],

			[
				'old' => 'related_criteria',
				'new' => 'single_blog_post_related_criteria'
			],

			[
				'old' => 'related_featured_image_ratio',
				'new' => 'single_blog_post_related_featured_image_ratio'
			],

			[
				'old' => 'related_label',
				'new' => 'single_blog_post_related_label'
			],

			[
				'old' => 'related_label_wrapper',
				'new' => 'single_blog_post_related_label_wrapper'
			],

			[
				'old' => 'related_posts_containment',
				'new' => 'single_blog_post_related_posts_containment'
			],

			[
				'old' => 'related_location',
				'new' => 'single_blog_post_related_location'
			],

			[
				'old' => 'related_structure',
				'new' => 'single_blog_post_related_structure'
			],

			[
				'old' => 'related_structure',
				'new' => 'single_blog_post_related_structure'
			],

			[
				'old' => 'relatedNarrowWidth',
				'new' => 'single_blog_post_related_narrow_width'
			],

			[
				'old' => 'related_visibility',
				'new' => 'single_blog_post_related_visibility'
			],

			[
				'old' => 'relatedPostsLabelColor',
				'new' => 'single_blog_post_related_posts_label_color'
			],

			[
				'old' => 'relatedPostsLinkColor',
				'new' => 'single_blog_post_related_posts_link_color'
			],

			[
				'old' => 'relatedPostsMetaColor',
				'new' => 'single_blog_post_related_posts_meta_color'
			],

			[
				'old' => 'relatedThumbRadius',
				'new' => 'single_blog_post_related_thumb_radius'
			],

			[
				'old' => 'related_posts_background',
				'new' => 'single_blog_post_related_posts_background'
			],

			[
				'old' => 'related_posts_container_spacing',
				'new' => 'single_blog_post_related_posts_container_spacing'
			],

			// Comments
			[
				'old' => 'post_has_comments',
				'new' => 'single_blog_post_has_comments'
			],

			[
				'old' => 'post_comments_containment',
				'new' => 'single_blog_post_comments_containment'
			],

			[
				'old' => 'post_comments_structure',
				'new' => 'single_blog_post_comments_structure'
			],

			[
				'old' => 'post_commentsNarrowWidth',
				'new' => 'single_blog_post_comments_narrow_width'
			],

			[
				'old' => 'post_commentsFontColor',
				'new' => 'single_blog_post_comments_font_color'
			],

			[
				'old' => 'post_comments_background',
				'new' => 'single_blog_post_comments_background'
			],

			[
				'old' => 'page_has_comments',
				'new' => 'single_page_has_comments'
			],

			[
				'old' => 'page_comments_containment',
				'new' => 'single_page_comments_containment'
			],

			[
				'old' => 'page_comments_structure',
				'new' => 'single_page_comments_structure'
			],

			[
				'old' => 'page_commentsNarrowWidth',
				'new' => 'single_page_comments_narrow_width'
			],

			[
				'old' => 'page_commentsFontColor',
				'new' => 'single_page_comments_font_color'
			],

			[
				'old' => 'page_comments_background',
				'new' => 'single_page_comments_background'
			],

			[
				'old' => 'woo_has_sidebar',
				'new' => 'woo_categories_has_sidebar'
			],

			[
				'old' => 'woo_sidebar_position',
				'new' => 'woo_categories_sidebar_position'
			],

			[
				'old' => 'woo_pagination_global_type',
				'new' => 'woo_categories_pagination_global_type'
			],

			[
				'old' => 'woo_load_more_label',
				'new' => 'woo_categories_load_more_label'
			],

			[
				'old' => 'woo_paginationSpacing',
				'new' => 'woo_categories_paginationSpacing'
			],

			[
				'old' => 'woo_simplePaginationFontColor',
				'new' => 'woo_categories_simplePaginationFontColor'
			],

			[
				'old' => 'woo_paginationButtonText',
				'new' => 'woo_categories_paginationButtonText'
			],

			[
				'old' => 'woo_paginationButton',
				'new' => 'woo_categories_paginationButton'
			],

			[
				'old' => 'woo_paginationDivider',
				'new' => 'woo_categories_paginationDivider'
			]
		]);
	}

	public function v_1_7_18() {
		$section_value = blocksy_manager()->header_builder->get_section_value();

		$old_section_id = $section_value['current_section'];

		if ($old_section_id !== 'type-1') {
			$section_value['current_section'] = 'type-1';
			$old_section = null;

			foreach ($section_value['sections'] as $current_section) {
				if ($current_section['id'] === $old_section_id) {
					$old_section = $current_section;
				}
			}

			if ($old_section && $section_value['sections'][0]['id'] === 'type-1') {
				if (isset($old_section['items'])) {
					$section_value['sections'][0]['items'] = $old_section['items'];
				}

				if (isset($old_section['desktop'])) {
					$section_value['sections'][0]['desktop'] = $old_section['desktop'];
				}

				if (isset($old_section['mobile'])) {
					$section_value['sections'][0]['mobile'] = $old_section['mobile'];
				}

				if (isset($old_section['settings'])) {
					$section_value['sections'][0]['settings'] = $old_section['settings'];
				}
			}

			set_theme_mod('header_placements', $section_value);
		}

		$render = new \Blocksy_Footer_Builder_Render();
		$section_value = $render->get_section_value();

		$old_section_id = $section_value['current_section'];

		if ($old_section_id !== 'type-1') {
			$section_value['current_section'] = 'type-1';
			$old_section = null;

			foreach ($section_value['sections'] as $current_section) {
				if ($current_section['id'] === $old_section_id) {
					$old_section = $current_section;
				}
			}

			if ($old_section && $section_value['sections'][0]['id'] === 'type-1') {
				if (isset($old_section['rows'])) {
					$section_value['sections'][0]['rows'] = $old_section['rows'];
				}

				if (isset($old_section['settings'])) {
					$section_value['sections'][0]['settings'] = $old_section['settings'];
				}
			}

			set_theme_mod('footer_placements', $section_value);
		}
	}

	public function v_1_7_25() {
		$current_transparent_header = null;
		$transparent_index = null;
		$section_value = blocksy_manager()->header_builder->get_section_value();

		foreach ($section_value['sections'] as $index => $current_section) {
			if ($current_section['id'] === 'ct-custom-transparent') {
				$current_transparent_header = $current_section;
				$transparent_index = $index;
			}
		}

		if (! $current_transparent_header) {
			return;
		}

		if (! class_exists('\Blocksy\Plugin')) {
			return;
		}

		$conditions = \Blocksy\Plugin::instance()->header->get_conditions();

		$transparent_header_conditions = null;

		foreach ($conditions as $index => $single_condition) {
			if ($single_condition['id'] === 'ct-custom-transparent') {
				$transparent_header_conditions = $single_condition['conditions'];

				$conditions[$index]['conditions'] = [];
			}
		}

		\Blocksy\Plugin::instance()->header->set_conditions($conditions);

		if (
			! $transparent_header_conditions
			||
			empty($transparent_header_conditions)
		) {
			return;
		}

		if (! isset($section_value['sections'][0]['settings'])) {
			$section_value['sections'][0]['settings'] = [];
		}

		$section_value['sections'][0]['settings']['has_transparent_header'] = 'yes';
		$section_value['sections'][0]['settings']['transparent_conditions'] = $transparent_header_conditions;

		set_theme_mod('header_placements', $section_value);
	}

	public function v_1_7_30() {
		$transform = function ($old, $new) {
			if (! isset($old['desktop'])) {
				return $old;
			}

			return [
				'desktop' => blocksy_spacing_value([
					'linked' => true,
					'top' => $old['desktop'],
					'left' => $old['desktop'],
					'right' => $old['desktop'],
					'bottom' => $old['desktop'],
				]),

				'tablet' => blocksy_spacing_value([
					'linked' => true,
					'top' => $old['tablet'],
					'left' => $old['tablet'],
					'right' => $old['tablet'],
					'bottom' => $old['tablet'],
				]),

				'mobile' => blocksy_spacing_value([
					'linked' => true,
					'top' => $old['mobile'],
					'left' => $old['mobile'],
					'right' => $old['mobile'],
					'bottom' => $old['mobile'],
				]),
			];
		};

		$this->migrate_options([
			[
				'old' => 'single_blog_post_content_boxed_spacing',
				'new' => 'single_blog_post_boxed_content_spacing',
				'transform' => $transform,
			],

			[
				'old' => 'single_page_content_boxed_spacing',
				'new' => 'single_page_boxed_content_spacing',
				'transform' => $transform,
			],
		]);
	}

	public function v_1_7_36() {
		if (get_theme_mod('custom_logo')) {
			return;
		}

		$items = blocksy_manager()->header_builder->get_section_value()['sections'][0]['items'];

		foreach ($items as $single_item) {
			if ($single_item['id'] !== 'logo') {
				continue;
			}

			$custom_logo = blocksy_akg(
				'custom_logo',
				$single_item['values'],
				'__default__'
			);

			if (
				$custom_logo !== '__default__'
				&&
				is_array($custom_logo)
				&&
				isset($custom_logo['desktop'])
			) {
				set_theme_mod('custom_logo', $custom_logo['desktop']);
			}
		}
	}

	public function v_1_7_41() {
		$this->migrate_options([
			[
				'old' => 'has_post_tags',
				'new' => 'single_blog_post_has_post_tags'
			]
		]);
	}

	public function v_1_7_55() {
		$previous_value = get_theme_mod(
			'product_thumbs_spacing',
			'__default__'
		);

		if ($previous_value === '__default__') {
			return;
		}

		if (
			is_numeric($previous_value)
			&&
			intval($previous_value) >= 0
			&&
			intval($previous_value) <= 70
		) {
			set_theme_mod(
				'product_thumbs_spacing',
				$previous_value . '%'
			);
		}
	}

	public function v_1_7_56() {
		$this->migrate_options_values([
			[
				'id' => 'single_blog_post_related_criteria',
				'migrate' => [
					[
						'old' => 'tags',
						'new' => 'post_tag'
					],

					[
						'old' => 'categories',
						'new' => 'category'
					]
				]
			]
		]);
	}

	public function v_1_7_65() {
		$this->migrate_options_values([
			[
				'id' => 'product_view_type',
				'migrate' => [
					[
						'old' => 'default',
						'new' => 'default-gallery'
					],

					[
						'old' => 'stacked',
						'new' => 'stacked-gallery'
					]
				]
			]
		]);
	}

	public function v_1_7_72() {
		if (get_theme_mod(
			'blocksy_woocommerce_thumbnail_cropping',
			'__empty__'
		) === '__empty__') {
			set_theme_mod(
				'blocksy_woocommerce_thumbnail_cropping',
				get_option('woocommerce_thumbnail_cropping', 'predefined')
			);
		}

		$this->migrate_db_options_values([
			[
				'id' => 'woocommerce_thumbnail_cropping',
				'migrate' => [
					[
						'old' => 'predefined',
						'new' => 'custom'
					]
				]
			]
		]);
	}

	public function v_1_8_0() {
		$header_placements = get_theme_mod('header_placements', []);

		if (empty($header_placements)) {
			return;
		}

		$made_changes = false;

		foreach ($header_placements['sections'] as $section_index => $single_section) {
			foreach ($single_section['items'] as $item_index => $single_item) {
				if ($single_item['id'] !== 'offcanvas') {
					continue;
				}

				if (
					isset($single_item['values']['offcanvasContentAlignment'])
					&&
					isset($single_item['values']['offcanvasContentAlignment']['desktop'])
				) {
					$old_val = $single_item['values']['offcanvasContentAlignment'];

					$allowed_values = [
						'initial',
						'center',
						'flex-end'
					];

					if (! in_array($old_val['desktop'], $allowed_values)) {
						$made_changes = true;
						$old_val['desktop'] = 'initial';
					}

					if (! in_array($old_val['tablet'], $allowed_values)) {
						$made_changes = true;
						$old_val['tablet'] = 'initial';
					}

					if (! in_array($old_val['mobile'], $allowed_values)) {
						$made_changes = true;
						$old_val['mobile'] = 'initial';
					}

					if ($made_changes) {
						$header_placements['sections'][
							$section_index
						]['items'][$item_index]['values'][
							'offcanvasContentAlignment'
						] = $old_val;
					}
				}
			}
		}

		if ($made_changes) {
			set_theme_mod('header_placements', $header_placements);
		}
	}

	public function v_1_8_4() {
		if (
			class_exists('\Blocksy\Plugin')
			&&
			in_array('mailchimp', get_option('blocksy_active_extensions', []))
		) {
			$manager = \Blocksy\Plugin::instance()->extensions;
			$manager->activate_extension('newsletter-subscribe');
		}

		$this->migrate_options([
			[
				'old' => 'mailchimp_title',
				'new' => 'newsletter_subscribe_title'
			],

			[
				'old' => 'mailchimp_text',
				'new' => 'newsletter_subscribe_text',
			],

			[
				'old' => 'mailchimp_list_id_source',
				'new' => 'newsletter_subscribe_list_id_source',
			],

			[
				'old' => 'mailchimp_list_id',
				'new' => 'newsletter_subscribe_list_id',
			],

			[
				'old' => 'has_mailchimp_name',
				'new' => 'has_newsletter_subscribe_name',
			],

			[
				'old' => 'mailchimp_name_label',
				'new' => 'newsletter_subscribe_name_label',
			],

			[
				'old' => 'mailchimp_mail_label',
				'new' => 'newsletter_subscribe_mail_label',
			],

			[
				'old' => 'mailchimp_button_text',
				'new' => 'newsletter_subscribe_button_text',
			],

			[
				'old' => 'mailchimp_subscribe_visibility',
				'new' => 'newsletter_subscribe_subscribe_visibility',
			],

			[
				'old' => 'mailchimpContent',
				'new' => 'newsletter_subscribe_content',
			],

			[
				'old' => 'mailchimpButton',
				'new' => 'newsletter_subscribe_button',
			],

			[
				'old' => 'mailchimpBackground',
				'new' => 'newsletter_subscribe_background',
			],

			[
				'old' => 'mailchimpSpacing',
				'new' => 'newsletter_subscribe_spacing',
			],

			[
				'old' => 'mailchimpShadow',
				'new' => 'newsletter_subscribe_shadow',
			],

			[
				'old' => 'mailchimp_single_post_enabled',
				'new' => 'newsletter_subscribe_single_post_enabled'
			]
		]);

		$this->migrate_options_values([
			[
				'id' => 'product_image_hover',
				'migrate' => [
					[
						'old' => 'zoom',
						'new' => 'zoom-in'
					]
				]
			]
		]);

		$maybe_related_posts_columns = get_theme_mod(
			'single_blog_post_related_posts_columns',
			'__empty__'
		);

		if (is_numeric($maybe_related_posts_columns)) {
			set_theme_mod('single_blog_post_related_posts_columns', [
				'desktop' => $maybe_related_posts_columns,
				'tablet' => 2,
				'mobile' => 1
			]);
		}

		$prefixes = blocksy_manager()->screen->get_archive_prefixes([
			'has_categories' => true,
			'has_author' => true,
			'has_search' => true
		]);

		foreach ($prefixes as $prefix) {
			$maybe_columns = get_theme_mod(
				$prefix . '_columns',
				'__empty__'
			);

			if (is_numeric($maybe_columns)) {
				set_theme_mod($prefix . '_columns', [
					'desktop' => $maybe_columns,
					'tablet' => 2,
					'mobile' => 1
				]);
			}
		}
	}

	public function v_1_8_5() {
		$prefixes = blocksy_manager()->screen->get_archive_prefixes([
			'has_categories' => true,
			'has_author' => true,
			'has_search' => true
		]);

		foreach (blocksy_manager()->screen->get_single_prefixes() as $prefix) {
			$prefixes[] = $prefix;
		}

		foreach ($prefixes as $archive_prefix) {
			$post_type = 'post';

			if ($archive_prefix === 'product') {
				$post_type = 'product';
			}

			if (strpos($archive_prefix, '_archive') !== false) {
				$post_type = str_replace('_archive', '', $archive_prefix);
			}

			if (strpos($archive_prefix, '_single') !== false) {
				$post_type = str_replace('_single', '', $archive_prefix);
			}

			$archive_order = get_theme_mod(
				$archive_prefix . '_archive_order',
				'__empty__'
			);

			if ($archive_order !== '__empty__') {
				set_theme_mod(
					$archive_prefix . '_archive_order',
					$this->transform_tags_in_layers($archive_order, $post_type)
				);
			}

			$hero_elements = get_theme_mod(
				$archive_prefix . '_hero_elements',
				'__empty__'
			);

			if ($hero_elements !== '__empty__') {
				set_theme_mod(
					$archive_prefix . '_hero_elements',
					$this->transform_tags_in_layers($hero_elements, $post_type)
				);
			}
		}
	}

	public function v_1_8_6_1() {
		$opts = [
			'single_blog_post_pageTitleOverlay',
			'single_page_pageTitleOverlay',
			'author_pageTitleOverlay',
			'search_pageTitleOverlay',
			'categories_pageTitleOverlay',
			'blog_pageTitleOverlay',
			'woo_categories_pageTitleOverlay',
			'product_pageTitleOverlay',
		];

		foreach ($opts as $single_opt_id) {
			$old_overlay = get_theme_mod($single_opt_id, '__empty__');

			if ($old_overlay === '__empty__') {
				continue;
			}

			if (isset($old_overlay['background_type'])) {
				continue;
			}

			if (! isset($old_overlay['default']['color'])) {
				continue;
			}

			set_theme_mod(
				$single_opt_id,
				blocksy_background_default_value([
					'backgroundColor' => [
						'default' => [
							'color' => $old_overlay['default']['color']
						],
					],
				])
			);
		}
	}

	public function v_1_8_12() {
		$this->migrate_options_values([
			[
				'id' => 'shop_cards_alignment_1',
				'migrate' => [
					[
						'old' => 'left',
						'new' => 'flex-start'
					]
				]
			],

			[
				'id' => 'shop_cards_alignment_1',
				'migrate' => [
					[
						'old' => 'right',
						'new' => 'flex-end'
					]
				]
			]
		]);
	}

	public function v_1_8_20() {
		$infoMessageColor = get_theme_mod('infoMessageColor', '__empty__');

		if ($infoMessageColor !== '__empty__') {
			if (isset($infoMessageColor['text'])) {
				$success_message_text_color = get_theme_mod(
					'success_message_text_color',
					[
						'default' => [
							'color' => \Blocksy_Css_Injector::get_skip_rule_keyword('DEFAULT'),
						],

						'hover' => [
							'color' => \Blocksy_Css_Injector::get_skip_rule_keyword('DEFAULT'),
						]
					]
				);

				$success_message_text_color['default'] = $infoMessageColor['text'];

				set_theme_mod(
					'success_message_text_color',
					$success_message_text_color
				);
			}

			if (isset($infoMessageColor['background'])) {
				$success_message_background_color = get_theme_mod(
					'success_message_background_color',
					[
						'default' => [
							'color' => '#F0F1F3'
						],
					]
				);

				$success_message_background_color['default'] = $infoMessageColor['background'];

				set_theme_mod(
					'success_message_background_color',
					$success_message_background_color
				);
			}
		}

		$errorMessageColor = get_theme_mod('errorMessageColor', '__empty__');

		if ($errorMessageColor !== '__empty__') {
			if (isset($errorMessageColor['text'])) {
				$error_message_text_color = get_theme_mod(
					'error_message_text_color',
					[
						'default' => [
							'color' => '#ffffff'
						],

						'hover' => [
							'color' => '#ffffff'
						]
					]
				);

				$error_message_text_color['default'] = $errorMessageColor['text'];

				set_theme_mod(
					'error_message_text_color',
					$error_message_text_color
				);
			}

			if (isset($errorMessageColor['background'])) {
				$error_message_background_color = get_theme_mod(
					'error_message_background_color',
					[
						'default' => [
							'color' => 'rgba(218, 0, 28, 0.7)'
						],
					]
				);

				$error_message_background_color['default'] = $errorMessageColor['background'];

				set_theme_mod(
					'error_message_background_color',
					$error_message_background_color
				);
			}
		}
	}

	public function v_1_8_26() {
		$this->migrate_options_values([
			[
				'id' => 'sale_badge_shape',
				'migrate' => [
					[
						'old' => 'square',
						'new' => 'type-2'
					],

					[
						'old' => 'circle',
						'new' => 'type-3'
					]
				]
			]
		]);
	}

	public function v_1_8_38() {
		if (
			class_exists('Elementor\Plugin')
			&&
			! \Elementor\Plugin::$instance->preview->is_preview_mode()
			&&
			! \Elementor\Plugin::$instance->editor->is_edit_mode()
			&&
			! wp_doing_ajax()
		) {
			\Elementor\Plugin::$instance->files_manager->clear_cache();
		}
	}

	public function v_1_8_67() {
		$this->migrate_options([
			[
				'old' => 'blockquote',
				'new' => 'pullquote'
			],
		]);
	}

	public function v_1_8_91() {
		$maybe_google_fonts = get_option('blocksy_google_fonts', '__EMPTY__');

		if ($maybe_google_fonts !== '__EMPTY__') {
			delete_option('blocksy_google_fonts');
		}
	}

	public function v_1_9_11() {
		$polylang_wpml_strings = get_option('polylang_wpml_strings', '__EMPTY__');

		if ($polylang_wpml_strings === '__EMPTY__') {
			return;
		}

		$cleaned_value = [];

		foreach ($polylang_wpml_strings as $key => $value) {
			if (
				isset($value['context'])
				&&
				isset($value['string'])
				&&
				$value['context'] === 'Blocksy'
				&&
				! is_string($value['string'])
			) {
				continue;
			}

			$cleaned_value[$key] = $value;
		}

		if (count($cleaned_value) !== count($polylang_wpml_strings)) {
			update_option('polylang_wpml_strings', $cleaned_value);
		}
	}

	private function transform_tags_in_layers($list, $post_type) {
		foreach ($list as $index => $archive_element) {
			if (
				$archive_element['id'] !== 'post_meta'
				&&
				$archive_element['id'] !== 'custom_meta'
			) {
				continue;
			}

			if (! isset($archive_element['meta_elements'])) {
				continue;
			}

			foreach ($archive_element['meta_elements'] as $meta_id => $meta_value) {
				if ($meta_value['id'] !== 'tags') {
					continue;
				}

				$list[$index]['meta_elements'][$meta_id]['id'] = 'categories';

				$list[$index]['meta_elements'][$meta_id]['taxonomy'] = blocksy_maybe_get_matching_taxonomy(
					$post_type,
					false
				);
			}
		}

		return $list;
	}

	public function migrate_options_values($options) {
		foreach ($options as $single_option) {
			$old_value = get_theme_mod($single_option['id'], '__empty__');

			if ($old_value === '__empty__') {
				continue;
			}

			foreach ($single_option['migrate'] as $to_migrate) {
				if ($old_value !== $to_migrate['old']) {
					continue;
				}

				set_theme_mod($single_option['id'], $to_migrate['new']);
			}
		}
	}

	private function migrate_db_options_values($options) {
		foreach ($options as $single_option) {
			$old_value = get_option($single_option['id'], '__empty__');

			if ($old_value === '__empty__') {
				continue;
			}

			foreach ($single_option['migrate'] as $to_migrate) {
				if ($old_value !== $to_migrate['old']) {
					continue;
				}

				update_option($single_option['id'], $to_migrate['new']);
			}
		}
	}

	public function migrate_options($options) {
		foreach ($options as $single_option) {
			$old_id = $single_option['old'];
			$new_id = $single_option['new'];

			$maybe_old = get_theme_mod($old_id, '__empty__');
			$maybe_new = get_theme_mod($new_id, '__empty__');

			if ($maybe_old !== '__empty__' && $maybe_new === '__empty__') {
				if (isset($single_option['transform'])) {
					$maybe_old = call_user_func(
						$single_option['transform'],
						$maybe_old,
						$maybe_new
					);
				}

				set_theme_mod($new_id, $maybe_old);
			}
		}
	}

	public function is_fresh_setup() {
		return get_option('blocksy_db_version', '__empty__') === '__empty__';
	}
}

