<?php
/**
 * Upgrades Handler.
 *
 * @author     ThemeFusion
 * @copyright  (c) Copyright by ThemeFusion
 * @link       https://theme-fusion.com
 * @package    Avada
 * @subpackage Core
 */

// Do not allow directly accessing this file.
if ( ! defined( 'ABSPATH' ) ) {
	exit( 'Direct script access denied.' );
}

/**
 * The Avada_Upgrade_Version is meant to be extended
 * by version-specific upgrade classes.
 *
 * @since 5.0.0
 */
abstract class Avada_Upgrade_Abstract {

	/**
	 * The version.
	 *
	 * @access protected
	 * @since 5.0.0
	 * @var string
	 */
	protected $version = '';

	/**
	 * The option name as it was in the currently update version..
	 *
	 * @access protected
	 * @since 5.1.0
	 * @var string
	 */
	protected $option_name = '';

	/**
	 * The theme version as stored in the db.
	 *
	 * @access protected
	 * @var string
	 */
	protected $database_theme_version;

	/**
	 * The class constructor.
	 *
	 * @access public
	 * @param bool $forced Whether we're forcing this update or not.
	 */
	public function __construct( $forced = false ) {

		// Set the database_theme_version.
		$this->database_theme_version = get_option( 'avada_version', true );

		if ( is_array( $this->database_theme_version ) ) {
			$this->database_theme_version = end( $this->database_theme_version );
		}
		// Make sure the version saved in the db is properly formatted.
		$this->database_theme_version = Avada_Helper::normalize_version( $this->database_theme_version );

		// Make sure the current version is properly formatted.
		$this->version = Avada_Helper::normalize_version( $this->version );

		$this->option_name = $this->set_option_name( $this->version );

		// Trigger the migration.
		$this->migration_process();

		// Set the version.
		$this->update_version();

	}

	/**
	 * Set the currect option name, how it is stored in the db of the currently converted version.
	 *
	 * @access protected
	 * @since 5.1.0
	 * @param string $version The theme version.
	 */
	protected function set_option_name( $version ) {

		if ( version_compare( $this->database_theme_version, '5.1.0', '>=' ) ) {
			$option_name = 'fusion_options';
		} elseif ( version_compare( $version, '4.0.0', '<' ) ) {
			$option_name = 'Avada_options';
		} elseif ( version_compare( $version, '5.1.0', '<=' ) ) {
			$option_name = 'avada_theme_options';
		} else {
			$option_name = 'fusion_options';
		}

		return $option_name;
	}

	/**
	 * Updates the version.
	 *
	 * @access protected
	 * @since 5.0.0
	 * @return void
	 */
	protected function update_version() {

		// Do not update the version in the db
		// if the current version is greater than the one we're updating to.
		if ( ! $this->database_theme_version || empty( $this->database_theme_version ) ) {
			return;
		}
		if ( version_compare( $this->database_theme_version, $this->version, '>=' ) ) {
			return;
		}

		update_option( 'avada_version', $this->version );

	}

	/**
	 * The actual migration process.
	 * Empty on the parent class, meant to be overriden in version-specific classes.
	 *
	 * @access protected
	 * @since 5.0.0
	 */
	abstract protected function migration_process();

}
