<?php
/**
 * کلاس مدیریت بروزرسانی و لایسنس Dima Shop
 * متصل به api.dimashop.ir
 * نسخه: 1.2.0 - رفع مشکل ارسال JSON
 */
if (!defined('ABSPATH')) exit;

class Dima_Update_Manager {
    
    private static $instance = null;
    private $api_url;
    private $current_version;
    
    // آدرس‌های API
    const API_BASE_URL = 'https://api.dimashop.ir';
    const API_CHECK_URL = '/api/v1/check.php';
    const API_VALIDATE_URL = '/api/v1/validate-license.php';
    const API_ACTIVATE_URL = '/api/v1/activate.php';
    const API_DEACTIVATE_URL = '/api/v1/deactivate.php';
    const API_SITE_URL = 'https://api.dimashop.ir';
    
    public static function get_instance() {
        if (null === self::$instance) {
            self::$instance = new self();
        }
        return self::$instance;
    }
    
    private function __construct() {
        $this->api_url = self::API_BASE_URL;
        $this->current_version = defined('DIMA_SHOP_VERSION') ? DIMA_SHOP_VERSION : '3.1.0';
        
        add_action('admin_notices', array($this, 'show_license_notice'));
        add_action('admin_notices', array($this, 'show_update_notice'));
        add_action('wp_ajax_dima_check_updates', array($this, 'ajax_check_updates'));
        add_action('wp_ajax_dima_perform_update', array($this, 'ajax_perform_update'));
        add_action('wp_ajax_dima_activate_license', array($this, 'ajax_activate_license'));
        add_action('wp_ajax_dima_deactivate_license', array($this, 'ajax_deactivate_license'));
        add_action('wp_ajax_dima_dismiss_notice', array($this, 'ajax_dismiss_notice'));
        add_filter('plugin_row_meta', array($this, 'plugin_row_meta'), 10, 2);
        
        // بررسی دوره‌ای لایسنس
        if (!wp_next_scheduled('dima_check_license')) {
            wp_schedule_event(time(), 'daily', 'dima_check_license');
        }
        add_action('dima_check_license', array($this, 'cron_check_license'));
    }
    
    /**
     * ═══════════════════════════════════════════════════════════
     * 🔧 تابع کمکی برای ارسال درخواست JSON به API
     * ═══════════════════════════════════════════════════════════
     */
    private function api_request($endpoint, $data = array()) {
        $url = self::API_BASE_URL . $endpoint;
        
        // لاگ برای دیباگ
        error_log('Dima API Request: ' . $url);
        error_log('Dima API Data: ' . wp_json_encode($data));
        
        $response = wp_remote_post($url, array(
            'body' => wp_json_encode($data),
            'headers' => array(
                'Content-Type' => 'application/json; charset=utf-8',
                'Accept' => 'application/json'
            ),
            'timeout' => 30,
            'sslverify' => true,
            'httpversion' => '1.1'
        ));
        
        if (is_wp_error($response)) {
            error_log('Dima API Error: ' . $response->get_error_message());
            return array(
                'success' => false,
                'message' => 'خطا در ارتباط با سرور: ' . $response->get_error_message()
            );
        }
        
        $body = wp_remote_retrieve_body($response);
        $code = wp_remote_retrieve_response_code($response);
        
        error_log('Dima API Response Code: ' . $code);
        error_log('Dima API Response Body: ' . $body);
        
        $result = json_decode($body, true);
        
        if (json_last_error() !== JSON_ERROR_NONE) {
            return array(
                'success' => false,
                'message' => 'پاسخ نامعتبر از سرور: ' . json_last_error_msg()
            );
        }
        
        return $result;
    }
    
    /**
     * دریافت لایسنس ذخیره شده
     */
    public function get_license_key() {
        return get_option('dima_license_key', '');
    }
    
    /**
     * آیا لایسنس فعال است؟
     */
    public function is_license_active() {
        $key = $this->get_license_key();
        if (empty($key)) return false;
        
        $status = get_option('dima_license_status', '');
        return $status === 'active';
    }
    
    /**
     * دریافت اطلاعات لایسنس
     */
    public function get_license_info() {
        return get_option('dima_license_info', array());
    }
    
    /**
     * بررسی لایسنس از سرور
     */
    public function check_license($force = false) {
        $license_key = $this->get_license_key();
        
        if (empty($license_key)) {
            return array('valid' => false, 'message' => 'لایسنس وارد نشده است');
        }
        
        $cached = get_transient('dima_license_check');
        if ($cached !== false && !$force) {
            return $cached;
        }
        
        $result = $this->api_request(self::API_VALIDATE_URL, array(
            'license_key' => $license_key,
            'site_url' => home_url()
        ));
        
        if (isset($result['success']) && $result['success']) {
            update_option('dima_license_status', 'active');
            update_option('dima_license_info', isset($result['data']) ? $result['data'] : array());
            set_transient('dima_license_check', $result, 12 * HOUR_IN_SECONDS);
            return $result;
        } else {
            update_option('dima_license_status', 'invalid');
            $message = isset($result['message']) ? $result['message'] : 'لایسنس نامعتبر است';
            return array('valid' => false, 'message' => $message);
        }
    }
    
    /**
     * بررسی بروزرسانی
     */
    public function check_for_updates($force = false) {
        $license_key = $this->get_license_key();
        
        $cached = get_transient('dima_update_info');
        if ($cached !== false && !$force) {
            return $cached;
        }
        
        $result = $this->api_request(self::API_CHECK_URL, array(
            'license_key' => $license_key,
            'site_url' => home_url(),
            'current_version' => $this->current_version,
            'php_version' => PHP_VERSION,
            'wp_version' => get_bloginfo('version')
        ));
        
        if (!isset($result['success']) || !$result['success']) {
            return false;
        }
        
        $update_info = isset($result['data']) ? $result['data'] : array();
        set_transient('dima_update_info', $update_info, 12 * HOUR_IN_SECONDS);
        update_option('dima_last_update_check', current_time('mysql'));
        
        return $update_info;
    }
    
    /**
     * آیا بروزرسانی موجود است؟
     */
    public function has_update() {
        $info = $this->check_for_updates();
        if (!$info || !isset($info['latest_version'])) return false;
        return version_compare($info['latest_version'], $this->current_version, '>');
    }
    
    /**
     * نوتیفیکیشن لایسنس
     */
    public function show_license_notice() {
        if (!current_user_can('manage_options')) return;
        if (get_transient('dima_dismiss_license_notice')) return;
        
        $license_key = $this->get_license_key();
        
        if (empty($license_key)) {
            ?>
            <div class="notice notice-warning is-dismissible dima-notice" data-notice="license">
                <p>
                    <strong>🔑 Dima Shop:</strong> 
                    برای دریافت بروزرسانی‌ها و پشتیبانی، 
                    <a href="<?php echo admin_url('admin.php?page=dima-shop-settings&tab=license'); ?>">لایسنس خود را فعال کنید</a>.
                    <a href="https://api.dimashop.ir/auth/register.php" target="_blank" class="button button-secondary">ثبت‌نام رایگان</a>
                </p>
            </div>
            <?php
        } elseif (!$this->is_license_active()) {
            ?>
            <div class="notice notice-error is-dismissible dima-notice" data-notice="license">
                <p>
                    <strong>⚠️ Dima Shop:</strong> 
                    لایسنس شما نامعتبر است. 
                    <a href="<?php echo admin_url('admin.php?page=dima-shop-settings&tab=license'); ?>">بررسی لایسنس</a>
                </p>
            </div>
            <?php
        }
    }
    
    /**
     * نوتیفیکیشن بروزرسانی
     */
    public function show_update_notice() {
        if (!current_user_can('manage_options')) return;
        if (get_transient('dima_dismiss_update_' . $this->current_version)) return;
        
        $info = $this->check_for_updates();
        if (!$info || !isset($info['latest_version'])) return;
        if (!version_compare($info['latest_version'], $this->current_version, '>')) return;
        
        ?>
        <div class="notice notice-info is-dismissible dima-notice" data-notice="update">
            <h3 style="margin:10px 0;">🎉 بروزرسانی Dima Shop موجود است!</h3>
            <p>
                <strong>نسخه <?php echo esc_html($info['latest_version']); ?></strong> 
                (نسخه فعلی: <?php echo esc_html($this->current_version); ?>)
            </p>
            <?php if (!empty($info['changelog'])): ?>
                <p><strong>تغییرات:</strong> <?php echo esc_html($info['changelog']); ?></p>
            <?php endif; ?>
            <p>
                <a href="<?php echo admin_url('admin.php?page=dima-shop-updates'); ?>" class="button button-primary">
                    مشاهده جزئیات و بروزرسانی
                </a>
            </p>
        </div>
        <?php
    }
    
    /**
     * ═══════════════════════════════════════════════════════════
     * 🔧 AJAX: فعال‌سازی لایسنس (اصلاح شده)
     * ═══════════════════════════════════════════════════════════
     */
    public function ajax_activate_license() {
        check_ajax_referer('dima_shop_nonce', 'nonce');
        
        if (!current_user_can('manage_options')) {
            wp_send_json_error(array('message' => 'دسترسی غیرمجاز'));
            return;
        }
        
        $license_key = isset($_POST['license_key']) ? sanitize_text_field($_POST['license_key']) : '';
        
        if (empty($license_key)) {
            wp_send_json_error(array('message' => 'لطفاً کلید لایسنس را وارد کنید'));
            return;
        }
        
        // اعتبارسنجی فرمت کلید
        if (!preg_match('/^DS-[A-Z0-9]{8}-[A-Z0-9]{8}-[A-Z0-9]{8}-[A-Z0-9]{8}$/', $license_key)) {
             wp_send_json_error(array('message' => 'فرمت کلید لایسنس نامعتبر است. مثال: DS-XXXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX'));
             return;
         }
        
        // ذخیره موقت
        update_option('dima_license_key', $license_key);
        
        // ═══════════════════════════════════════════════════════════
        // 🔧 ارسال درخواست به API با فرمت JSON صحیح
        // ═══════════════════════════════════════════════════════════
        $result = $this->api_request(self::API_ACTIVATE_URL, array(
            'license_key' => $license_key,
            'site_url' => home_url(),
            'site_title' => get_bloginfo('name'),
            'php_version' => PHP_VERSION,
            'wp_version' => get_bloginfo('version')
        ));
        
        if (isset($result['success']) && $result['success']) {
            update_option('dima_license_status', 'active');
            update_option('dima_license_activated_at', current_time('mysql'));
            
            if (isset($result['data'])) {
                update_option('dima_license_info', $result['data']);
            }
            
            delete_transient('dima_license_check');
            delete_transient('dima_dismiss_license_notice');
            
            wp_send_json_success(array(
                'message' => '✅ لایسنس با موفقیت فعال شد',
                'data' => isset($result['data']) ? $result['data'] : array()
            ));
        } else {
            // در صورت خطا، کلید را پاک کن
            delete_option('dima_license_key');
            
            $message = isset($result['message']) ? $result['message'] : 'لایسنس نامعتبر است';
            wp_send_json_error(array('message' => $message));
        }
    }
    
    /**
     * AJAX: غیرفعال‌سازی لایسنس
     */
    public function ajax_deactivate_license() {
        check_ajax_referer('dima_shop_nonce', 'nonce');
        
        if (!current_user_can('manage_options')) {
            wp_send_json_error(array('message' => 'دسترسی غیرمجاز'));
            return;
        }
        
        $license_key = $this->get_license_key();
        
        if (empty($license_key)) {
            wp_send_json_error(array('message' => 'لایسنسی وجود ندارد'));
            return;
        }
        
        // اطلاع به سرور
        $this->api_request(self::API_DEACTIVATE_URL, array(
            'license_key' => $license_key,
            'site_url' => home_url()
        ));
        
        // پاکسازی محلی
        delete_option('dima_license_key');
        delete_option('dima_license_status');
        delete_option('dima_license_info');
        delete_option('dima_license_activated_at');
        delete_transient('dima_license_check');
        
        wp_send_json_success(array('message' => 'لایسنس غیرفعال شد'));
    }
    
    /**
     * AJAX: بررسی بروزرسانی
     */
    public function ajax_check_updates() {
        check_ajax_referer('dima_shop_nonce', 'nonce');
        
        if (!current_user_can('manage_options')) {
            wp_send_json_error(array('message' => 'دسترسی غیرمجاز'));
            return;
        }
        
        $info = $this->check_for_updates(true);
        
        if (!$info) {
            wp_send_json_error(array('message' => 'خطا در ارتباط با سرور'));
            return;
        }
        
        wp_send_json_success(array(
            'has_update' => isset($info['latest_version']) && version_compare($info['latest_version'], $this->current_version, '>'),
            'current_version' => $this->current_version,
            'latest_version' => isset($info['latest_version']) ? $info['latest_version'] : $this->current_version,
            'changelog' => isset($info['changelog']) ? $info['changelog'] : '',
            'download_url' => isset($info['download_url']) ? $info['download_url'] : ''
        ));
    }
    
    /**
     * AJAX: انجام بروزرسانی
     */
    public function ajax_perform_update() {
        check_ajax_referer('dima_shop_nonce', 'nonce');
        
        if (!current_user_can('manage_options')) {
            wp_send_json_error(array('message' => 'دسترسی غیرمجاز'));
            return;
        }
        
        $info = $this->check_for_updates();
        
        if (!$info || !isset($info['download_url'])) {
            wp_send_json_error(array('message' => 'اطلاعات بروزرسانی در دسترس نیست'));
            return;
        }
        
        require_once ABSPATH . 'wp-admin/includes/file.php';
        
        $temp_file = download_url($info['download_url'], 120);
        
        if (is_wp_error($temp_file)) {
            wp_send_json_error(array('message' => 'خطا در دانلود: ' . $temp_file->get_error_message()));
            return;
        }
        
        deactivate_plugins(DIMA_SHOP_BASENAME);
        
        WP_Filesystem();
        
        $temp_dir = get_temp_dir() . 'dima-shop-update-' . time();
        wp_mkdir_p($temp_dir);
        
        $result = unzip_file($temp_file, $temp_dir);
        
        if (is_wp_error($result)) {
            @unlink($temp_file);
            activate_plugins(DIMA_SHOP_BASENAME);
            wp_send_json_error(array('message' => 'خطا در استخراج: ' . $result->get_error_message()));
            return;
        }
        
        $files = scandir($temp_dir);
        $source_dir = null;
        
        foreach ($files as $file) {
            if ($file !== '.' && $file !== '..' && is_dir($temp_dir . '/' . $file)) {
                $source_dir = $temp_dir . '/' . $file;
                break;
            }
        }
        
        if (!$source_dir) {
            @unlink($temp_file);
            $this->delete_directory($temp_dir);
            activate_plugins(DIMA_SHOP_BASENAME);
            wp_send_json_error(array('message' => 'ساختار پکیج نامعتبر است'));
            return;
        }
        
        $this->delete_directory(DIMA_SHOP_PATH);
        copy_dir($source_dir, DIMA_SHOP_PATH);
        
        @unlink($temp_file);
        $this->delete_directory($temp_dir);
        
        activate_plugins(DIMA_SHOP_BASENAME);
        
        update_option('dima_shop_version', $info['latest_version']);
        update_option('dima_shop_last_updated', current_time('mysql'));
        delete_transient('dima_update_info');
        
        wp_send_json_success(array(
            'message' => 'بروزرسانی با موفقیت انجام شد!',
            'new_version' => $info['latest_version']
        ));
    }
    
    /**
     * AJAX: dismiss notice
     */
    public function ajax_dismiss_notice() {
        check_ajax_referer('dima_shop_nonce', 'nonce');
        
        $notice_type = isset($_POST['notice_type']) ? sanitize_text_field($_POST['notice_type']) : '';
        
        if ($notice_type === 'license') {
            set_transient('dima_dismiss_license_notice', 1, DAY_IN_SECONDS * 7);
        } elseif ($notice_type === 'update') {
            set_transient('dima_dismiss_update_' . $this->current_version, 1, DAY_IN_SECONDS * 7);
        }
        
        wp_send_json_success();
    }
    
    /**
     * بررسی دوره‌ای لایسنس (Cron)
     */
    public function cron_check_license() {
        if ($this->get_license_key()) {
            $this->check_license(true);
        }
    }
    
    /**
     * لینک‌های plugin row
     */
    public function plugin_row_meta($links, $file) {
        if ($file !== DIMA_SHOP_BASENAME) return $links;
        
        $row_meta = array(
            'license' => '<a href="' . admin_url('admin.php?page=dima-shop-settings&tab=license') . '">🔑 لایسنس</a>',
            'docs' => '<a href="' . self::API_SITE_URL . '" target="_blank">مستندات</a>',
            'support' => '<a href="' . self::API_SITE_URL . '/dashboard/support.php" target="_blank">پشتیبانی</a>',
        );
        
        return array_merge($links, $row_meta);
    }
    
    /**
     * حذف دایرکتوری
     */
    private function delete_directory($dir) {
        if (!file_exists($dir)) return;
        
        $files = new RecursiveIteratorIterator(
            new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS),
            RecursiveIteratorIterator::CHILD_FIRST
        );
        
        foreach ($files as $file) {
            if ($file->isDir()) {
                @rmdir($file->getRealPath());
            } else {
                @unlink($file->getRealPath());
            }
        }
        
        @rmdir($dir);
    }
}