<?php

if (!defined('ABSPATH')) {
    exit;
}
class WC_Helper_Updater
{
    public static function load()
    {
        add_action('pre_set_site_transient_update_plugins', array(__CLASS__, 'transient_update_plugins'), 21, 1);
        add_action('pre_set_site_transient_update_themes', array(__CLASS__, 'transient_update_themes'), 21, 1);
        add_action('upgrader_process_complete', array(__CLASS__, 'upgrader_process_complete'));
        add_action('upgrader_pre_download', array(__CLASS__, 'block_expired_updates'), 10, 2);
    }
    public static function transient_update_plugins($transient)
    {
        $update_data = self::get_update_data();
        foreach (WC_Helper::get_local_woo_plugins() as $plugin) {
            if (empty($update_data[$plugin['_product_id']])) {
                continue;
            }
            $data = $update_data[$plugin['_product_id']];
            $filename = $plugin['_filename'];
            $item = array('id' => 'woocommerce-com-' . $plugin['_product_id'], 'slug' => 'woocommerce-com-' . $data['slug'], 'plugin' => $filename, 'new_version' => $data['version'], 'url' => $data['url'], 'package' => $data['package'], 'upgrade_notice' => $data['upgrade_notice']);
            if (isset($data['requires_php'])) {
                $item['requires_php'] = $data['requires_php'];
            }
            if (!self::_has_active_subscription($plugin['_product_id'])) {
                $item['package'] = 'woocommerce-com-expired-' . $plugin['_product_id'];
            }
            if (version_compare($plugin['Version'], $data['version'], '<')) {
                $transient->response[$filename] = (object) $item;
                unset($transient->no_update[$filename]);
            } else {
                $transient->no_update[$filename] = (object) $item;
                unset($transient->response[$filename]);
            }
        }
        $translations = self::get_translations_update_data();
        $transient->translations = array_merge(isset($transient->translations) ? $transient->translations : array(), $translations);
        return $transient;
    }
    public static function transient_update_themes($transient)
    {
        $update_data = self::get_update_data();
        foreach (WC_Helper::get_local_woo_themes() as $theme) {
            if (empty($update_data[$theme['_product_id']])) {
                continue;
            }
            $data = $update_data[$theme['_product_id']];
            $slug = $theme['_stylesheet'];
            $item = array('theme' => $slug, 'new_version' => $data['version'], 'url' => $data['url'], 'package' => '');
            if (self::_has_active_subscription($theme['_product_id'])) {
                $item['package'] = $data['package'];
            }
            if (version_compare($theme['Version'], $data['version'], '<')) {
                $transient->response[$slug] = $item;
            } else {
                unset($transient->response[$slug]);
                $transient->checked[$slug] = $data['version'];
            }
        }
        return $transient;
    }
    public static function get_update_data()
    {
        $payload = array();
        foreach (WC_Helper::get_subscriptions() as $subscription) {
            $payload[$subscription['product_id']] = array('product_id' => $subscription['product_id'], 'file_id' => '');
        }
        foreach (WC_Helper::get_local_woo_plugins() as $data) {
            if (!isset($payload[$data['_product_id']])) {
                $payload[$data['_product_id']] = array('product_id' => $data['_product_id']);
            }
            $payload[$data['_product_id']]['file_id'] = $data['_file_id'];
        }
        foreach (WC_Helper::get_local_woo_themes() as $data) {
            if (!isset($payload[$data['_product_id']])) {
                $payload[$data['_product_id']] = array('product_id' => $data['_product_id']);
            }
            $payload[$data['_product_id']]['file_id'] = $data['_file_id'];
        }
        return self::_update_check($payload);
    }
    public static function get_translations_update_data()
    {
        $payload = array();
        $installed_translations = wp_get_installed_translations('plugins');
        $locales = array_values(get_available_languages());
        $locales = apply_filters('plugins_update_check_locales', $locales);
        $locales = array_unique($locales);
        if (empty($locales)) {
            return array();
        }
        $plugins = WC_Helper::get_local_woo_plugins();
        $active_woo_plugins = array_intersect(array_keys($plugins), get_option('active_plugins', array()));
        $active_for_translations = array_filter($active_woo_plugins, function ($plugin) use($plugins) {
            return apply_filters('woocommerce_translations_updates_for_' . $plugins[$plugin]['slug'], false);
        });
        if (empty($active_for_translations)) {
            return array();
        }
        if (wp_doing_cron()) {
            $timeout = 30;
        } else {
            $timeout = 3 + (int) (count($active_for_translations) / 10);
        }
        $request_body = array('locales' => $locales, 'plugins' => array());
        foreach ($active_for_translations as $active_plugin) {
            $plugin = $plugins[$active_plugin];
            $request_body['plugins'][$plugin['slug']] = array('version' => $plugin['Version']);
        }
        $raw_response = wp_remote_post('https://translate.wordpress.com/api/translations-updates/woocommerce', array('body' => json_encode($request_body), 'headers' => array('Content-Type: application/json'), 'timeout' => $timeout));
        $response_code = wp_remote_retrieve_response_code($raw_response);
        if (200 !== $response_code) {
            return array();
        }
        $response = json_decode(wp_remote_retrieve_body($raw_response), true);
        if (array_key_exists('success', $response) && false === $response['success']) {
            return array();
        }
        $translations = array();
        foreach ($response['data'] as $plugin_name => $language_packs) {
            foreach ($language_packs as $language_pack) {
                if (array_key_exists($plugin_name, $installed_translations) && array_key_exists($language_pack['wp_locale'], $installed_translations[$plugin_name])) {
                    $installed_translation_revision_time = new DateTime($installed_translations[$plugin_name][$language_pack['wp_locale']]['PO-Revision-Date']);
                    $new_translation_revision_time = new DateTime($language_pack['last_modified']);
                    if ($new_translation_revision_time <= $installed_translation_revision_time) {
                        continue;
                    }
                }
                $translations[] = array('type' => 'plugin', 'slug' => $plugin_name, 'language' => $language_pack['wp_locale'], 'version' => $language_pack['version'], 'updated' => $language_pack['last_modified'], 'package' => $language_pack['package'], 'autoupdate' => true);
            }
        }
        return $translations;
    }
    private static function _update_check($payload)
    {
        ksort($payload);
        $hash = md5(wp_json_encode($payload));
        $cache_key = '_woocommerce_helper_updates';
        $data = get_transient($cache_key);
        if (false !== $data) {
            if (hash_equals($hash, $data['hash'])) {
                return $data['products'];
            }
        }
        $data = array('hash' => $hash, 'updated' => time(), 'products' => array(), 'errors' => array());
        $request = WC_Helper_API::post('update-check', array('body' => wp_json_encode(array('products' => $payload)), 'authenticated' => true));
        if (wp_remote_retrieve_response_code($request) !== 200) {
            $data['errors'][] = 'http-error';
        } else {
            $data['products'] = json_decode(wp_remote_retrieve_body($request), true);
        }
        set_transient($cache_key, $data, 12 * HOUR_IN_SECONDS);
        return $data['products'];
    }
    private static function _has_active_subscription($product_id)
    {
        if (!isset($auth)) {
            $auth = WC_Helper_Options::get('auth');
        }
        if (!isset($subscriptions)) {
            $subscriptions = WC_Helper::get_subscriptions();
        }
        if (empty($auth['site_id']) || empty($subscriptions)) {
            return false;
        }
        foreach ($subscriptions as $subscription) {
            if ($subscription['product_id'] != $product_id) {
                continue;
            }
            if (in_array(absint($auth['site_id']), $subscription['connections'])) {
                return true;
            }
        }
        return false;
    }
    public static function get_updates_count()
    {
        $cache_key = '_woocommerce_helper_updates_count';
        $count = get_transient($cache_key);
        if (false !== $count) {
            return $count;
        }
        if (!get_transient('_woocommerce_helper_subscriptions')) {
            return 0;
        }
        if (!get_transient('_woocommerce_helper_updates')) {
            return 0;
        }
        $count = 0;
        $update_data = self::get_update_data();
        if (empty($update_data)) {
            set_transient($cache_key, $count, 12 * HOUR_IN_SECONDS);
            return $count;
        }
        foreach (WC_Helper::get_local_woo_plugins() as $plugin) {
            if (empty($update_data[$plugin['_product_id']])) {
                continue;
            }
            if (version_compare($plugin['Version'], $update_data[$plugin['_product_id']]['version'], '<')) {
                $count++;
            }
        }
        foreach (WC_Helper::get_local_woo_themes() as $theme) {
            if (empty($update_data[$theme['_product_id']])) {
                continue;
            }
            if (version_compare($theme['Version'], $update_data[$theme['_product_id']]['version'], '<')) {
                $count++;
            }
        }
        set_transient($cache_key, $count, 12 * HOUR_IN_SECONDS);
        return $count;
    }
    public static function get_updates_count_html()
    {
        $count = self::get_updates_count();
        if (!$count) {
            return '';
        }
        $count_html = sprintf('<span class="update-plugins count-%d"><span class="update-count">%d</span></span>', $count, number_format_i18n($count));
        return $count_html;
    }
    public static function flush_updates_cache()
    {
        delete_transient('_woocommerce_helper_updates');
        delete_transient('_woocommerce_helper_updates_count');
        delete_site_transient('update_plugins');
        delete_site_transient('update_themes');
    }
    public static function upgrader_process_complete()
    {
        delete_transient('_woocommerce_helper_updates_count');
    }
    public static function block_expired_updates($reply, $package)
    {
        if (false !== $reply) {
            return $reply;
        }
        if (0 !== strpos($package, 'woocommerce-com-expired-')) {
            return false;
        }
        return new WP_Error('woocommerce_subscription_expired', sprintf(__('Please visit the <a href="%s" target="_blank">subscriptions page</a> and renew to continue receiving updates.', 'woocommerce'), esc_url(admin_url('admin.php?page=wc-addons&section=helper'))));
    }
}
WC_Helper_Updater::load();