<?php
/**
 * Rollback Model
 * Called to handle the plugin installation in background
 *
 * @file  The Rollback Model file
 * @package HMWP/RollbackModel
 * @since 5.0.0
 */


defined('ABSPATH') || die('Cheatin\' uh?');

class HMWP_Models_Rollback
{

    /**
     * @var string Package URL.
     */
    protected $package_url;

    /**
     * @var string Package URL.
     */
    protected $version;

    /**
     * @var string Plugin name.
     */
    protected $plugin_name;

    /**
     * @var string Plugin slug.
     */
    protected $plugin_slug;

    public function set_plugin($args = array())
    {
        foreach ( $args as $key => $value ) {
            $this->{$key} = $value;
        }

        return $this;
    }

    /**
     * Print inline style.
     *
     * @access private
     */
    private function print_inline_style()
    {
        ?>
        <style>
            .wrap {
                overflow: hidden;
            }

            h1 {
                background: #0a9b8f;
                text-align: center;
                color: #fff !important;
                padding: 50px !important;
                text-transform: uppercase;
                letter-spacing: 1px;
                line-height: 30px;
            }

            h1 img {
                max-width: 300px;
                display: block;
                margin: auto auto 50px;
            }
        </style>
        <?php
    }

    /**
     * Apply package.
     *
     * Change the plugin data when WordPress checks for updates. This method
     * modifies package data to update the plugin from a specific URL containing
     * the version package.
     */
    protected function apply_package()
    {
        $update_plugins = get_site_transient('update_plugins');
        if (! is_object($update_plugins) ) {
            $update_plugins = new \stdClass();
        }

        $plugin_info = new \stdClass();
        $plugin_info->new_version = $this->version;
        $plugin_info->slug = $this->plugin_slug;
        $plugin_info->package = $this->package_url;
        $plugin_info->url = _HMWP_ACCOUNT_SITE_;

        $update_plugins->response[ $this->plugin_name ] = $plugin_info;

        set_site_transient('update_plugins', $update_plugins);
    }

    /**
     * Upgrade.
     *
     * @access protected
     */
    protected function upgrade()
    {
        include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';

        $this->print_inline_style();
        $upgrader = new \Plugin_Upgrader(new \WP_Ajax_Upgrader_Skin());
        $upgrader->upgrade($this->plugin_name);
    }

    /**
     * Run.
     *
     * Rollback to previous versions.
     */
    public function run()
    {
        $this->apply_package();
        $this->upgrade();
    }

    /**
     * Install a plugin
     *
     * @param array $args
     *
     * @return bool|WP_Error
     */
    public function install($args){

        //includes necessary for Plugin_Upgrader and Plugin_Installer_Skin
        include_once( ABSPATH . 'wp-admin/includes/file.php' );
        include_once( ABSPATH . 'wp-admin/includes/misc.php' );
        include_once( ABSPATH . 'wp-admin/includes/class-wp-upgrader.php' );

        $this->set_plugin($args)->apply_package();

        $upgrader = new Plugin_Upgrader( new WP_Ajax_Upgrader_Skin() );
        return $upgrader->install($this->package_url, array('overwrite_package'  => true));

    }

    /**
     * Activate the installed plugin
     * @param $plugin
     *
     * @return null
     */
    public function activate( $plugin ) {

        $plugin = trim( $plugin );
        $current = get_option( 'active_plugins' );
        $plugin = plugin_basename( $plugin );

        if ( $plugin <> '' && !in_array( $plugin, $current ) ) {

            $current[] = $plugin;
            sort( $current );

            try {
                do_action( 'activate_plugin', $plugin, true );
                update_option( 'active_plugins', $current );
                do_action( 'activate_' . $plugin );
                do_action( 'activated_plugin', $plugin, true );
            }catch(Exception $e){}
        }

        return null;
    }

}
