<?php

class BdpVersionChecker
{
    public $plugin_slug;
    public $version;
    public $cache_key;
    public $cache_allowed;
    public $updateUrl;

    public function __construct()
    {
		$plugin_data = get_plugin_data( BDP_LV_STARTUP_FILE );
	    $this->plugin_slug = BDP_LV_PLUGIN_SLUG;
        $this->updateUrl = $plugin_data['UpdateURI'] . '/info.json';
		$this->version = $plugin_data['Version'];
        $this->cache_key = 'bdp-kompass-upd';
        $this->cache_allowed = false;

        add_filter( 'plugins_api', array( $this, 'info' ), 20, 3 );
        add_filter( 'site_transient_update_plugins', array( $this, 'update' ) );
        add_action( 'upgrader_process_complete', array( $this, 'purge' ), 10, 2 );
    }

    public function request(){

        $remote = get_transient( $this->cache_key );

        if( false === $remote || ! $this->cache_allowed ) {

            $remote = wp_remote_get(
                $this->updateUrl
                ,
                array(
                    'timeout' => 10,
                    'headers' => array(
                        'Accept' => 'application/json'
                    )
                )
            );

            if(
                is_wp_error( $remote )
                || 200 !== wp_remote_retrieve_response_code( $remote )
                || empty( wp_remote_retrieve_body( $remote ) )
            ) {
                return false;
            }

            set_transient( $this->cache_key, $remote, 3600 );

        }

        $remote = json_decode( wp_remote_retrieve_body( $remote ) );

        return $remote;

    }


    function info( $res = '', $action = '', $args = '' )
    {
        if (!isset($args->slug) || $args->slug !== $this->plugin_slug) {
            return $res;
        }

        // get updates
        $remote = $this->request();

        if( ! $remote ) {
            return $res;
        }

        $newVersion = $remote->version;
        $res = new stdClass();

        $res->name = $remote->name;
        $res->slug = $remote->slug;
        $res->version = $newVersion;
        $res->tested = $remote->tested;
        $res->requires = $remote->requires;
        $res->author = $remote->author;
        $res->author_profile = $remote->author_profile;
        $res->download_link = $remote->download_url;
        $res->trunk = $remote->download_url;
        $res->requires_php = $remote->requires_php;
        $res->last_updated = $remote->last_updated;

        $res->sections = array(
            'description' => $remote->sections->description,
            'installation' => $remote->sections->installation,
            'changelog' => $remote->sections->changelog
        );

        if( ! empty( $remote->banners ) ) {
            $res->banners = array(
                'low' => $remote->banners->low,
                'high' => $remote->banners->high
            );
        }

        return $res;

    }

    public function update( $transient ) {
        if ( empty($transient->checked ) ) {
            return $transient;
        }

        $remote = $this->request();
        if(
            $remote
            && version_compare( $this->version, $remote->version, '<' )
            && version_compare( $remote->requires, get_bloginfo( 'version' ), '<=' )
            && version_compare( $remote->requires_php, PHP_VERSION, '<' )
        ) {

            $newVersion = $remote->version;

            $res = new stdClass();
            $res->slug = $this->plugin_slug;
            $res->plugin = plugin_basename( BDP_LV_STARTUP_FILE );
            $res->new_version = $newVersion;
            $res->tested = $remote->tested;
            $res->package = $remote->download_url;

            $transient->response[ $res->plugin ] = $res;

        } else {
            $res = new stdClass();
            $res->slug = $this->plugin_slug;
            $res->plugin = plugin_basename( BDP_LV_STARTUP_FILE );
            $transient->no_update[ $res->plugin ] = $res;
        }

        return $transient;

    }

    public function purge( $upgrader, $options ){

        if (
            $this->cache_allowed
            && 'update' === $options['action']
            && 'plugin' === $options[ 'type' ]
        ) {
            // just clean the cache when new plugin version is installed
            delete_transient( $this->cache_key );
        }
    }
}