<?php
/**
 * Theme updater class.
 *
 * @package EDD Theme Updater
 */

class tema_updates {

    private $remote_api_url;
    private $request_data;
    private $response_key;
    private $theme_slug;
    private $license_key;
    private $version;
    private $author;
    protected $strings = null;
    private $item_name;

    public function __construct( $args = array(), $strings = array() ) {

        $defaults = array(
            'remote_api_url' => EXTHEMES_API_URL,
            'request_data'   => array(),
            'theme_slug'     => get_template(),
            'item_name'      => '',
            'license'        => '',
            'version'        => '',
            'author'         => ''
        );

        $args = wp_parse_args( $args, $defaults );

        $this->license          = $args['license'];
        $this->item_name        = $args['item_name'];
        $this->version          = $args['version'];
        $this->theme_slug       = sanitize_key( $args['theme_slug'] );
        $this->author           = $args['author'];
        $this->remote_api_url   = $args['remote_api_url'];
        $this->response_key     = $this->theme_slug . '-update-response';
        $this->strings          = $strings;

        // WordPress hooks
        add_filter( 'site_transient_update_themes', array( $this, 'theme_update_transient' ) );
        add_filter( 'delete_site_transient_update_themes', array( $this, 'delete_theme_update_transient' ) );
        add_action( 'load-update-core.php', array( $this, 'delete_theme_update_transient' ) );
        add_action( 'load-themes.php', array( $this, 'delete_theme_update_transient' ) );
        add_action( 'load-themes.php', array( $this, 'load_themes_screen' ) );
    }

    /**
     * Load themes screen hooks
     */
    public function load_themes_screen() {
        add_thickbox();
        add_action( 'admin_notices', array( $this, 'update_nag' ) );
    }

    /**
     * Show update notice in admin
     */
    public function update_nag() {
        $strings = $this->strings;
        $theme   = wp_get_theme( $this->theme_slug );
        $api_response = get_transient( $this->response_key );

        if ( false === $api_response ) {
            return;
        }

        $update_url     = wp_nonce_url( 'update.php?action=upgrade-theme&theme=' . urlencode( $this->theme_slug ), 'upgrade-theme_' . $this->theme_slug );
        $update_onclick = ' onclick="return confirm(\'' . esc_js( $strings['update-notice'] ?? 'Are you sure you want to update?' ) . '\');"';

        if ( version_compare( $this->version, $api_response->new_version, '<' ) ) {
            echo '<div id="update-nag" class="notice notice-warning inline is-dismissible">';
            printf(
                $strings['update-available'] ?? '%1$s %2$s is available. <a href="%3$s" class="thickbox">View Changelog</a> or <a href="%5$s"%6$s>update now</a>.',
                esc_html( $theme->get('Name') ),
                esc_html( $api_response->new_version ),
                esc_url( '#TB_inline?width=640&inlineId=' . $this->theme_slug . '_changelog' ),
                esc_html( $theme->get('Name') ),
                esc_url( $update_url ),
                $update_onclick
            );
            echo '</div>';

            echo '<div id="' . esc_attr( $this->theme_slug . '_changelog' ) . '" style="display:none;">';
            echo wpautop( wp_kses_post( $api_response->sections['changelog'] ?? '' ) );
            echo '</div>';
        }
    }

    /**
     * Add theme to WordPress update transient
     */
    public function theme_update_transient( $value ) {
        $update_data = $this->check_for_update();
        if ( $update_data ) {
            $value->response[ $this->theme_slug ] = (object) $update_data;
        }
        return $value;
    }

    /**
     * Delete transient cache
     */
    public function delete_theme_update_transient() {
        delete_transient( $this->response_key );
    }

    /**
     * Check for update from EDD API
     */
    private function check_for_update() {
        $update_data = get_transient( $this->response_key );

        if ( false === $update_data ) {
            $failed = false;

            $api_params = array(
                'edd_action' => 'get_version',
                'license'    => $this->license,
                'name'       => $this->item_name,
                'slug'       => $this->theme_slug,
                'author'     => $this->author
            );

            $response = wp_remote_post( $this->remote_api_url, array(
                'timeout' => 15,
                'body'    => $api_params
            ));

            if ( is_wp_error( $response ) || 200 != wp_remote_retrieve_response_code( $response ) ) {
                $failed = true;
            }

            $update_data = json_decode( wp_remote_retrieve_body( $response ) );

            if ( ! is_object( $update_data ) ) {
                $failed = true;
            }

            if ( $failed ) {
                $data = new stdClass;
                $data->new_version = $this->version;
                set_transient( $this->response_key, $data, 30 * MINUTE_IN_SECONDS );
                return false;
            }

            $update_data->sections = maybe_unserialize( $update_data->sections );
            set_transient( $this->response_key, $update_data, 12 * HOUR_IN_SECONDS );
        }

        if ( version_compare( $this->version, $update_data->new_version, '>=' ) ) {
            return false;
        }

        return (array) $update_data;
    }
}
