<?php

defined('ABSPATH') || defined('DUPXABSPATH') || exit;

/**

 * Upgrade logic of plugin resides here

 */
class DUP_PRO_Plugin_Upgrade
{

    const DUP_VERSION_OPT_KEY = 'duplicator_pro_plugin_version';

    public static function onActivationAction()
    {
        if (($oldDupVersion = get_option(self::DUP_VERSION_OPT_KEY, false)) === false) {
            self::newInstallation();
        } else {
            self::updateInstallation($oldDupVersion);
        }

        //Setup All Directories
        DUP_PRO_U::initStorageDirectory();
        //Rename installer files if exists
        DUP_PRO_Migration::renameInstallersPhpFiles();
    }

    protected static function newInstallation()
    {
        self::environmentChecks();

        self::updateDatabase();

        DUP_PRO_Upgrade_U::PerformUpgrade(false, DUPLICATOR_PRO_VERSION);

        //WordPress Options Hooks
        self::updateOptionVersion();
    }

    protected static function updateInstallation($oldVersion)
    {
        self::environmentChecks();

        self::updateDatabase();

        DUP_PRO_Upgrade_U::PerformUpgrade($oldVersion, DUPLICATOR_PRO_VERSION);

        //WordPress Options Hooks
        self::updateOptionVersion();
    }

    protected static function updateOptionVersion()
    {
        //WordPress Options Hooks
        if (update_option(self::DUP_VERSION_OPT_KEY, DUPLICATOR_PRO_VERSION) === false) {
            DUP_PRO_LOG::trace("Couldn't update duplicator_pro_plugin_version so deleting it.");

            delete_option(self::DUP_VERSION_OPT_KEY);

            if (update_option(self::DUP_VERSION_OPT_KEY, DUPLICATOR_PRO_VERSION) === false) {
                DUP_PRO_LOG::trace("Still couldn\'t update the option!");
            } else {
                DUP_PRO_LOG::trace("Option updated.");
            }
        }
    }

    protected static function updateDatabase()
    {
        global $wpdb;

        $charset_collate = $wpdb->get_charset_collate();
        $table_name = $wpdb->base_prefix . "duplicator_pro_packages";

        //PRIMARY KEY must have 2 spaces before for dbDelta to work
        $sql = "CREATE TABLE `{$table_name}` (
			   id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
			   name VARCHAR(250) NOT NULL,
			   hash VARCHAR(50) NOT NULL,
			   status INT(11) NOT NULL,
			   created DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
			   owner VARCHAR(60) NOT NULL,
			   package LONGTEXT NOT NULL,
			   PRIMARY KEY  (id),
			   KEY hash (hash)) 
               $charset_collate;";

        require_once(ABSPATH . 'wp-admin/includes/upgrade.php');

        @dbDelta($sql);

        DUP_PRO_JSON_Entity_Base::init_table();
        DUP_PRO_Global_Entity::initialize_plugin_data();
        DUP_PRO_Secure_Global_Entity::initialize_plugin_data();
        DUP_PRO_System_Global_Entity::initialize_plugin_data();
        DUP_PRO_Package_Template_Entity::create_default();
        DUP_PRO_Package_Template_Entity::create_manual();
    }

    protected static function environmentChecks()
    {
        require_once(DUPLICATOR_PRO_PLUGIN_PATH . '/classes/environment/class.environment.checker.php');

        $env_checker = new DUP_PRO_Environment_Checker();

        $status = $env_checker->check();

        $messages = $env_checker->getHelperMessages();

        if (!$status) {
            if (!empty($messages)) {
                $msg_str = '';
                foreach ($messages as $id => $msgs) {
                    foreach ($msgs as $key => $msg) {
                        $msg_str .= '<br/>' . $msg;
                    }
                }
                die($msg_str);
            }
        }
    }
}
