<?php
/**
 * Deprecate pyre_* post-meta.
 *
 * @author     ThemeFusion
 * @copyright  (c) Copyright by ThemeFusion
 * @link       https://avada.com
 * @package    Fusion-Library
 * @since      6.2.0
 */

/**
 * Get & set setting values.
 */
class Fusion_Deprecate_Pyre_PO {

	/**
	 * The root post-meta key.
	 *
	 * @since 6.2.0
	 */
	const ROOT = '_fusion';

	/**
	 * The post-ID.
	 *
	 * @access protected
	 * @since 6.2.0
	 * @var int
	 */
	protected $post_id;

	/**
	 * The post-type.
	 *
	 * @access protected
	 * @since 6.2.0
	 * @var int
	 */
	protected $post_type;

	/**
	 * The post-meta.
	 *
	 * @access protected
	 * @since 6.2.0
	 * @var array
	 */
	protected $post_meta;

	/**
	 * An array of mismatched options.
	 *
	 * Format: old_option_name => new_option_name.
	 *
	 * @static
	 * @access protected
	 * @since 6.2.0
	 * @var array
	 */
	protected static $mismatched = [
		'avada_rev_styles'          => 'avada_rev_styles',
		'show_first_featured_image' => 'show_first_featured_image',
	];

	/**
	 * Constructor.
	 *
	 * @access public
	 * @since 6.2.0
	 * @param array $post_id The arguments.
	 * @return void
	 */
	public function __construct( $post_id = 0 ) {
		$this->post_id = $post_id ? $post_id : fusion_library()->get_page_id();
		if ( ! $this->post_id || ! is_int( $this->post_id ) ) {
			return;
		}

		$this->post_type = get_post_type( $this->post_id );
		$this->post_meta = get_post_meta( $this->post_id );

		// Don't want to migrate for revisions or continue if we are not on a single post/page.
		if ( 'revision' === $this->post_type ) {
			return;
		}

		// Trigger migrations.
		$this->migrate();
	}

	/**
	 * Migrate old value to new structure.
	 *
	 * @access protected
	 * @since 6.2.0
	 * @return void
	 */
	protected function migrate() {

		$this->modify_initial_postmeta();

		// Get all post-meta.
		$new_meta = [];

		// Loop all postmeta.
		foreach ( $this->post_meta as $old_key => $value ) {

			// Only migrate non-empty, non-default meta.
			if ( '' === $value || 'default' === $value ) {
				continue;
			}

			// Get the new key.
			$new_key = $this->get_new_option_name( $old_key );

			// Format the value.
			$value = $this->format_value( $value, $old_key, $new_key );

			if ( false === strpos( $new_key, '[' ) ) {
				$new_meta[ $new_key ] = $value;
			} else {

				$new_key_root = explode( '[', $new_key )[0];
				if ( ! isset( $new_meta[ $new_key_root ] ) ) {
					$new_meta[ $new_key_root ] = [];
				}
				$new_key_child = str_replace( ']', '', explode( '[', $new_key )[1] );

				$new_meta[ $new_key_root ][ $new_key_child ] = $value;
			}
		}

		update_post_meta( $this->post_id, Fusion_Data_PostMeta::ROOT, $new_meta );
	}

	/**
	 * Get the new option name.
	 *
	 * @access protected
	 * @since 6.2.0
	 * @param string $option_name The old option-name.
	 * @return string
	 */
	protected function get_new_option_name( $option_name ) {

		switch ( $option_name ) {
			case 'portfolio_width_100':
				if ( 'product' === $this->post_type ) {
					return 'product_width_100';
				} elseif ( 'avada_portfolio' === $this->post_type ) {
					return 'portfolio_width_100';
				}
				return 'blog_width_100';

			case 'share_box':
				if ( 'tribe_events' === $this->post_type ) {
					return 'events_social_sharing_box';
				} elseif ( 'avada_portfolio' === $this->post_type ) {
					return 'portfolio_social_sharing_box';
				}
				return 'social_sharing_box';

			case 'post_pagination':
				return ( 'avada_portfolio' === $this->post_type ) ? 'portfolio_pn_nav' : 'blog_pn_nav';

			case 'related_posts':
				if ( 'avada_portfolio' === $this->post_type ) {
					return 'portfolio_related_posts';
				} elseif ( 'avada_faq' === $this->post_type ) {
					return 'faq_related_posts';
				}
				return 'related_posts';

			case 'sbg_selected_sidebar_replacement':
				if ( 'page' === $this->post_type ) {
					return 'pages_sidebar';
				} elseif ( 'post' === $this->post_type || 'avada_faq' === $this->post_type ) {
					return 'posts_sidebar';
				} elseif ( 'avada_portfolio' === $this->post_type ) {
					return 'portfolio_sidebar';
				} elseif ( 'product' === $this->post_type ) {
					return 'woo_sidebar';
				} elseif ( 'tribe_events' === $this->post_type ) {
					return 'ec_sidebar';
				} elseif ( 'forum' === $this->post_type || 'topic' === $this->post_type || 'reply' === $this->post_type ) {
					return 'ppbress_sidebar';
				}
				return 'posts_sidebar'; // Migrate to post option naming for CPT.

			case 'sbg_selected_sidebar_2_replacement':
				if ( 'page' === $this->post_type ) {
					return 'pages_sidebar_2';
				} elseif ( 'post' === $this->post_type || 'avada_faq' === $this->post_type ) {
					return 'posts_sidebar_2';
				} elseif ( 'avada_portfolio' === $this->post_type ) {
					return 'portfolio_sidebar_2';
				} elseif ( 'product' === $this->post_type ) {
					return 'woo_sidebar_2';
				} elseif ( 'tribe_events' === $this->post_type ) {
					return 'ec_sidebar_2';
				} elseif ( 'forum' === $this->post_type || 'topic' === $this->post_type || 'reply' === $this->post_type ) {
					return 'ppbress_sidebar_2';
				}
				return 'posts_sidebar_2'; // Migrate to post option naming for CPT.

			case 'sidebar_position':
				if ( 'page' === $this->post_type ) {
					return 'default_sidebar_pos';
				} elseif ( 'post' === $this->post_type || 'avada_faq' === $this->post_type ) {
					return 'blog_sidebar_position';
				} elseif ( 'avada_portfolio' === $this->post_type ) {
					return 'portfolio_sidebar_position';
				} elseif ( 'product' === $this->post_type ) {
					return 'woo_sidebar_position';
				} elseif ( 'tribe_events' === $this->post_type ) {
					return 'ec_sidebar_pos';
				} elseif ( 'forum' === $this->post_type || 'topic' === $this->post_type || 'reply' === $this->post_type ) {
					return 'bbpress_sidebar_position';
				}
				return 'blog_sidebar_position';

			case 'page_bg_layout':
				return 'layout';

			case 'page_bg_color':
				return 'bg_color';

			case 'page_bg':
				return 'bg_image[url]';

			case 'page_bg_full':
				return 'bg_full';

			case 'page_bg_repeat':
				return 'bg_repeat';

			case 'wide_page_bg_color':
				return 'content_bg_color';

			case 'wide_page_bg':
				return 'content_bg_image[url]';

			case 'wide_page_bg_full':
				return 'content_bg_full';

			case 'wide_page_bg_repeat':
				return 'content_bg_repeat';

			case 'display_footer':
				return 'footer_widgets';

			case 'display_copyright':
				return 'footer_copyright';

			case 'combined_header_bg_color':
				return 'header_bg_color';

			case 'header_bg':
				return 'header_bg_image[url]';

			case 'main_top_padding':
				return 'main_padding[top]';

			case 'main_bottom_padding':
				return 'main_padding[bottom]';

			case 'page_title':
				return 'page_title_bar';

			case 'page_title_breadcrumbs_search_bar':
				return 'page_title_bar_bs';

			case 'page_title_text':
				return 'page_title_bar_text';

			case 'page_title_text_alignment':
				return 'page_title_alignment';

			case 'page_title_text_size':
				return 'page_title_font_size';

			case 'page_title_font_color':
				return 'page_title_color';

			case 'page_title_custom_subheader_text_size':
				return 'page_title_subheader_font_size';

			case 'page_title_subheader_font_color':
				return 'page_title_subheader_color';

			case 'page_title_bar_bg_color':
				return 'page_title_bg_color';

			case 'page_title_bar_borders_color':
				return 'page_title_border_color';

			case 'page_title_bar_bg':
				return 'page_title_bg[url]';

			case 'page_title_bar_bg_retina':
				return 'page_title_bg_retina[url]';

			case 'page_title_bar_bg_full':
				return 'page_title_bg_full';

			case 'width':
				return 'portfolio_featured_image_width';

			case 'project_desc_title':
				return 'portfolio_project_desc_title';

			case 'project_details':
				return 'portfolio_project_details';

			case 'link_icon_target':
				return 'portfolio_link_icon_target';

			case 'post_comments':
				return 'blog_comments';

			case 'sidebar_bg_color':
				return ( 'tribe_events' === $this->post_type ) ? 'ec_sidebar_bg_color' : 'sidebar_bg_color';

			case 'fimg_width':
				return 'fimg[width]';

			case 'fimg_height':
				return 'fimg[height]';

			case 'mp4':
				return 'mp4[url]';

			case 'webm':
				return 'webm[url]';

			case 'ogv':
				return 'ogv[url]';

			case 'preview_image':
				return 'preview_image[url]';
		}

		return $option_name;
	}

	/**
	 * Format the value.
	 *
	 * @access private
	 * @since 6.2.0
	 * @param mixed  $value   The value.
	 * @param string $key     The old post-meta key.
	 * @param string $new_key The new post-meta key.
	 */
	private function format_value( $value, $key, $new_key ) {

		if ( 'sbg_selected_sidebar_replacement' === $key || 'sbg_selected_sidebar_2_replacement' === $key ) {
			$value = maybe_unserialize( $value );
			if ( is_array( $value ) && isset( $value[0] ) ) {
				return $value[0];
			}
		}

		if ( isset( self::$mismatched[ $key ] ) && $new_key === self::$mismatched[ $key ] ) {
			if ( 'yes' === $value ) {
				return 'no';
			} elseif ( '1' === $value ) {
				return '0';
			} elseif ( 1 === $value ) {
				return 0;
			} elseif ( true === $value ) {
				return false;
			} elseif ( 'no' === $value ) {
				return 'yes';
			} elseif ( '0' === $value ) {
				return '1';
			} elseif ( 0 === $value ) {
				return 1;
			} elseif ( false === $value ) {
				return true;
			}
		}
		return $value;
	}

	/**
	 * Run initial migrations on post-meta.
	 *
	 * @since 6.2.0
	 * @return void
	 */
	protected function modify_initial_postmeta() {

		$post_meta = [];

		foreach ( $this->post_meta as $key => $val ) {

			// Check if this is a meta we want to migrate.
			if ( ! $this->is_ours( $key ) ) {
				unset( $this->post_meta[ $key ] );
				continue;
			}

			$val = ( is_array( $val ) && isset( $val[0] ) ) ? $val[0] : $val;
			$val = maybe_unserialize( $val );

			$post_meta[ str_replace( 'pyre_', '', $key ) ] = $val;
		}

		/**
		 * Modification for the combined_header_bg_color page-option.
		 * In the past there were separate controls for color & opacity
		 * which were combined to a single rgba control in Avada v5.7.
		 */
		if ( isset( $post_meta['header_bg_opacity'] ) && isset( $post_meta['header_bg_color'] ) && ! isset( $post_meta['combined_header_bg_color'] ) ) {

			// Only proceed if header_bg_color is not rgba.
			if ( false === strpos( $post_meta['header_bg_color'], 'rgba' ) ) {
				$alpha = $post_meta['header_bg_opacity'];

				// Only proceed if alpha is numeric.
				if ( is_numeric( $alpha ) ) {
					$color = $post_meta['header_bg_color'];
					if ( ! $color || empty( $color ) ) {
						$color = fusion_get_theme_option( 'header_bg_color' );
					}

					$post_meta['combined_header_bg_color'] = $post_meta['header_bg_color'];
					if ( 1 > $alpha ) {
						$post_meta['combined_header_bg_color'] = Fusion_Color::new_color( $color )->getNew( 'alpha', $alpha )->toCSS( 'rgba' );
					}
				}
			}
		}

		$this->post_meta = $post_meta;
	}

	/**
	 * Check if the post-meta is one of ours.
	 *
	 * @access protected
	 * @since 6.2.0
	 * @param string $key The post-meta key.
	 * @return bool
	 */
	protected function is_ours( $key ) {
		if ( 0 === strpos( $key, 'pyre_' ) ) {
			return true;
		}
		if ( 0 === strpos( $key, 'sbg_' ) ) {
			return true;
		}
		if ( 0 === strpos( $key, 'kd_' ) ) {
			return true;
		}
		return false;
	}
}

/* Omit closing PHP tag to avoid "Headers already sent" issues. */
