<?php
/**
 * EONSR AEO Agent - License Management Handler
 *
 * Handles creation, activation, validation, and synchronization of license keys.
 * Includes admin hooks for processing form submissions and displaying notices.
 *
 * @package EONSR_AEO_Agent
 */

if (!defined('ABSPATH')) {
    exit;
}

/* ==========================================================================
   SECTION 1: API COMMUNICATION FUNCTIONS
   ========================================================================== */

/**
 * Gửi yêu cầu tạo license key mới qua API.
 *
 * @param string $name  Tên người dùng.
 * @param string $email Email người dùng.
 * @return array Mảng chứa kết quả (success, message).
 */
function eonsr_aeo_agent_create_license_key($name, $email)
{
    $api_url = EONSR_AEO_AGENT_API_URL . '/api/v1/license/create';

    $body = [
        'email'       => $email,
        'name'        => $name,
        'productName' => 'AEO-agent',
        'productType' => 'monthly',
    ];

    $args = [
        'body'        => json_encode($body),
        'headers'     => ['Content-Type' => 'application/json'],
        'timeout'     => 20,
        'data_format' => 'body',
    ];

    $response = wp_remote_post($api_url, $args);

    if (is_wp_error($response)) {
        // error_log('[EONSR AEO License] Create Key Connection Error: ' . $response->get_error_message());
        return [
            'success' => false,
            'message' => 'Lỗi kết nối: ' . $response->get_error_message()
        ];
    }

    $response_code = wp_remote_retrieve_response_code($response);
    $response_body = json_decode(wp_remote_retrieve_body($response), true);

    if (in_array($response_code, [200, 201]) && !empty($response_body['success'])) {
        return [
            'success' => true,
            'message' => $response_body['message'] ?? 'Vui lòng kiểm tra email để nhận key kích hoạt.'
        ];
    }

    $error_message = $response_body['message'] ?? 'Phản hồi không hợp lệ từ API.';
    return [
        'success' => false,
        'message' => $error_message
    ];
}

/**
 * Gửi yêu cầu kích hoạt license key.
 *
 * @param string $key License Key cần kích hoạt.
 * @return array Mảng dữ liệu phản hồi từ server.
 */
function eonsr_aeo_agent_activate_license_key($key)
{
    $api_url = EONSR_AEO_AGENT_API_URL . '/api/v1/license/activate';
    $domain  = site_url();

    $body = [
        'key'    => $key,
        'domain' => $domain
    ];

    $args = [
        'body'        => json_encode($body),
        'headers'     => ['Content-Type' => 'application/json'],
        'timeout'     => 20,
        'data_format' => 'body',
    ];

    $response = wp_remote_post($api_url, $args);

    if (is_wp_error($response)) {
        // error_log('[EONSR AEO License] Activate Key Connection Error: ' . $response->get_error_message());
        return [
            'success' => false,
            'message' => 'Lỗi kết nối: ' . $response->get_error_message()
        ];
    }

    $response_code = wp_remote_retrieve_response_code($response);
    $response_body = json_decode(wp_remote_retrieve_body($response), true);

    // Success Case: Return full data (features, usage, etc.)
    if ($response_code === 200 && !empty($response_body['success'])) {
        if (!isset($response_body['message'])) {
            $response_body['message'] = 'Kích hoạt thành công!';
        }
        return $response_body;
    }

    $error_message = $response_body['message'] ?? 'Key không hợp lệ hoặc đã có lỗi xảy ra.';
    return [
        'success' => false,
        'message' => $error_message
    ];
}

/**
 * Xác thực License Key với Server (Validate).
 * Có cơ chế caching và fallback để tránh mất license khi mất mạng.
 *
 * @param bool $force_check Có ép buộc kiểm tra server không (bỏ qua cache).
 * @return array Kết quả xác thực hoặc dữ liệu cache.
 */
function eonsr_aeo_agent_validate_license_key($force_check = false)
{
    $license_key = get_option('eonsr_aeo_agent_license_key');

    if (empty($license_key)) {
        return ['success' => false, 'message' => 'Chưa có key.'];
    }

    // 1. Check Cache (Transient) first if not forced
    if (!$force_check) {
        $recheck_transient = get_transient('eonsr_aeo_agent_recheck_license');
        if ($recheck_transient) {
            $cached_details = get_option('eonsr_aeo_agent_license_details', []);
            // Return cached data if it looks valid
            if (!empty($cached_details) && (isset($cached_details['valid']) || isset($cached_details['success']))) {
                return $cached_details;
            }
        }
    }

    // 2. Call Remote API
    $api_url = EONSR_AEO_AGENT_API_URL . '/api/v1/license/validate';
    $domain  = site_url();

    $response = wp_remote_post($api_url, [
        'body'    => json_encode(['key' => $license_key, 'domain' => $domain]),
        'headers' => ['Content-Type' => 'application/json'],
        'timeout' => 15, // Increased timeout for stability
    ]);

    // 🔴 CRITICAL FIX: Connection Errors MUST NOT delete the license.
    // Fallback to offline data.
    if (is_wp_error($response)) {
        // error_log('[EONSR AEO License] Validation Connection Failed: ' . $response->get_error_message());
        
        $old_details = get_option('eonsr_aeo_agent_license_details', []);
        $old_details['message'] = 'Không thể kết nối server xác thực, sử dụng dữ liệu offline.';
        
        return $old_details;
    }

    $response_code = wp_remote_retrieve_response_code($response);
    $response_body = json_decode(wp_remote_retrieve_body($response), true);

    // 🔴 CRITICAL FIX: Server Errors (500, 502) MUST NOT delete the license.
    if ($response_code !== 200) {
        // error_log("[EONSR AEO License] Validation Server Error (HTTP $response_code)");
        return get_option('eonsr_aeo_agent_license_details', []);
    }

    // 3. Handle Valid Response
    if (isset($response_body['valid']) && $response_body['valid']) {
        $response_body['success'] = true;

        // Update local options
        update_option('eonsr_aeo_agent_license_status', 'activated');
        update_option('eonsr_aeo_agent_license_details', $response_body);

        if (isset($response_body['features'])) {
            update_option('eonsr_aeo_agent_license_features', $response_body['features']);
        }

        // Cache result for 12 hours
        set_transient('eonsr_aeo_agent_recheck_license', 'true', 12 * HOUR_IN_SECONDS);
        return $response_body;
    }

    // 4. Handle Invalid Key (Explicitly invalid)
    // Only delete license if server explicitly says "valid: false"
    if (isset($response_body['valid']) && $response_body['valid'] === false) {
        delete_option('eonsr_aeo_agent_license_details');
        delete_option('eonsr_aeo_agent_setup_completed'); 
        update_option('eonsr_aeo_agent_license_status', 'inactive');
        return ['success' => false, 'message' => 'Bản quyền không hợp lệ.'];
    }

    // Fallback for junk responses
    return get_option('eonsr_aeo_agent_license_details', []);
}

/**
 * Đăng ký và kích hoạt gói dùng thử (Trial).
 *
 * @param string $email Email đăng ký.
 * @param string $name  Tên người dùng.
 * @return array Kết quả đăng ký.
 */
function eonsr_aeo_agent_register_trial($email, $name)
{
    $api_url = EONSR_AEO_AGENT_API_URL . '/api/v1/license/trial';
    $domain  = site_url();

    $body = [
        'email'  => $email,
        'name'   => $name,
        'domain' => $domain
    ];

    $args = [
        'body'        => json_encode($body),
        'headers'     => ['Content-Type' => 'application/json'],
        'timeout'     => 30, // Increased timeout for 2-step process (create + activate)
        'data_format' => 'body',
    ];

    $response = wp_remote_post($api_url, $args);

    if (is_wp_error($response)) {
        // error_log('[EONSR AEO License] Trial Register Error: ' . $response->get_error_message());
        return [
            'success' => false,
            'message' => 'Lỗi kết nối: ' . $response->get_error_message()
        ];
    }

    $response_code = wp_remote_retrieve_response_code($response);
    $response_body = json_decode(wp_remote_retrieve_body($response), true);

    // Handle 200 OK or 201 Created
    if (in_array($response_code, [200, 201]) && !empty($response_body['success'])) {
        // Normalize response to match Pro format
        $response_body['valid'] = true;

        // Map 'limits' to 'features' for frontend consistency
        if (isset($response_body['limits']) && isset($response_body['features'])) {
            $response_body['features'] = array_merge($response_body['features'], $response_body['limits']);
        }

        return $response_body;
    }

    // Handle Errors (e.g., Domain invalid, Email used)
    $error_message = $response_body['error'] ?? ($response_body['message'] ?? 'Không thể kích hoạt gói dùng thử.');
    return [
        'success' => false,
        'message' => $error_message
    ];
}

/* ==========================================================================
   SECTION 2: ADMIN HOOKS & PROCESSING
   ========================================================================== */

add_action('admin_init', function () {

    // ----------------------------------------------------------------------
    // 1. Xử lý Kích hoạt Gói dùng thử (Free Trial)
    // ----------------------------------------------------------------------
    if (isset($_POST['eonsr_aeo_free_activate']) && $_POST['eonsr_aeo_free_activate'] === '1') {
        check_admin_referer('eonsr_aeo_agent_free_nonce');

        $current_user = wp_get_current_user();
        $email        = $current_user->user_email;
        $name         = $current_user->display_name;

        $result = eonsr_aeo_agent_register_trial($email, $name);

        if ($result['success']) {
            // Save Trial Data
            update_option('eonsr_aeo_agent_license_key', $result['licenseKey']);
            update_option('eonsr_aeo_agent_license_status', 'activated');
            update_option('eonsr_aeo_agent_license_plan', 'trial');

            $result['valid'] = true;
            update_option('eonsr_aeo_agent_license_details', $result);

            if (isset($result['features'])) {
                update_option('eonsr_aeo_agent_license_features', $result['features']);
            }

            // Set Cache
            delete_transient('eonsr_aeo_agent_recheck_license');
            set_transient('eonsr_aeo_agent_recheck_license', 'true', 12 * HOUR_IN_SECONDS);

            add_settings_error('eonsr_aeo_agent_messages', 'aeo_trial_success', '🎉 ' . $result['message'], 'updated');

            // Redirect to Plugin Page with safe_redirect
            wp_safe_redirect(admin_url('admin.php?page=eonsr_aeo_agent'));
            exit;

        } else {
            add_settings_error('eonsr_aeo_agent_messages', 'aeo_trial_error', '❌ Lỗi kích hoạt Trial: ' . $result['message'], 'error');
        }
    }

    // ----------------------------------------------------------------------
    // 2. Xử lý Kích hoạt Key Pro
    // ----------------------------------------------------------------------
    if (isset($_POST['eonsr_aeo_agent_submit_key']) && check_admin_referer('eonsr_aeo_agent_key_nonce')) {
        
        $license_key = isset($_POST['license_key']) ? sanitize_text_field(wp_unslash($_POST['license_key'])) : '';

        if (empty($license_key)) {
            add_settings_error('eonsr_aeo_agent_messages', 'aeo_agent_error', 'Vui lòng nhập key bản quyền.');
            return; // Dừng xử lý tại đây để không load lại trang mà không có thông báo
        }

        $result = eonsr_aeo_agent_activate_license_key($license_key);

        $result = eonsr_aeo_agent_activate_license_key($license_key);

        if ($result['success']) {
            // Save Pro Data
            update_option('eonsr_aeo_agent_license_status', 'activated');
            update_option('eonsr_aeo_agent_license_key', $license_key);

            $planType = isset($result['planType']) ? strtolower($result['planType']) : 'pro';
            update_option('eonsr_aeo_agent_license_plan', $planType);

            // Clear old cache & Set new cache
            wp_cache_delete('eonsr_aeo_agent_license_status', 'options');
            wp_cache_delete('eonsr_aeo_agent_license_key', 'options');
            set_transient('eonsr_aeo_agent_recheck_license', 'true', 12 * HOUR_IN_SECONDS);

            $result['valid'] = true;
            update_option('eonsr_aeo_agent_license_details', $result);

            if (isset($result['features'])) {
                update_option('eonsr_aeo_agent_license_features', $result['features']);
            }

            add_settings_error('eonsr_aeo_agent_messages', 'aeo_pro_success', '🚀 Kích hoạt thành công!', 'updated');

            // Redirect to Plugin Page with safe_redirect
            wp_safe_redirect(admin_url('admin.php?page=eonsr_aeo_agent'));
            exit;

        } else {
            add_settings_error('eonsr_aeo_agent_messages', 'aeo_agent_error', 'Lỗi: ' . $result['message']);
        }
    }
});

/* ==========================================================================
   SECTION 3: ADMIN UI HELPERS
   ========================================================================== */

/**
 * Hiển thị thông báo admin yêu cầu kích hoạt.
 * Loại trừ các trang cài đặt license để tránh spam thông báo.
 */
add_action('admin_notices', function () {
    if (!current_user_can('manage_options')) return;

    $license_status = get_option('eonsr_aeo_agent_license_status', 'unsubmitted');

    if ($license_status === 'activated') {
        return;
    }

    $current_screen = get_current_screen();

    // Pages to exclude notices (Updated page slugs)
    $excluded_screens = [
        'aeo-agent_page_eonsr_aeo_agent_license',   // License Page
        'aeo-agent_page_eonsr_aeo_agent_purchase',  // Purchase Page
    ];

    // if (!in_array($current_screen->id, $excluded_screens)) {
    //     $settings_link = admin_url('admin.php?page=eonsr_aeo_agent_license');
    //     $message = '<strong>Chào mừng bạn đến với EONSR AEO Agent!</strong> Vui lòng kích hoạt bản quyền để sử dụng plugin.';

    //     // FIX: Escaped message output with wp_kses_post()
    //     printf(
    //         '<div class="notice notice-warning is-dismissible"><p>%s <a href="%s"><strong>Đi đến trang kích hoạt</strong></a>.</p></div>',
    //         wp_kses_post($message),
    //         esc_url($settings_link)
    //     );
    // }
});

/**
 * Render nội dung trang cài đặt bản quyền.
 * Load từ file template riêng biệt.
 */
function eonsr_aeo_agent_license_page_content()
{
    $page_path = EONSR_AEO_AGENT_PATH . 'includes/admin/license-page-ui.php';
    
    if (file_exists($page_path)) {
        require_once $page_path;
    } else {
        echo '<div class="wrap"><h2>Lỗi</h2><p>Không tìm thấy file giao diện trang bản quyền.</p></div>';
    }
}

/* ==========================================================================
   SECTION 4: AJAX HANDLERS
   ========================================================================== */

/**
 * AJAX Handler: Sync Details.
 * Fetches latest usage/quota from the server via GET request.
 */
add_action('wp_ajax_eonsr_aeo_agent_sync_license_details', function () {
    // 1. Permission Check
    if (!current_user_can('edit_posts')) {
        wp_send_json_error(['message' => 'Permission denied']);
    }

    $license_key = get_option('eonsr_aeo_agent_license_key');
    if (empty($license_key)) {
        wp_send_json_error(['message' => 'Missing License Key']);
    }

    // 2. Call Node API
    $api_url = EONSR_AEO_AGENT_API_URL . '/api/v1/license/details/' . $license_key;

    $response = wp_remote_get($api_url, [
        'headers' => ['Content-Type' => 'application/json'],
        'timeout' => 10
    ]);

    if (is_wp_error($response)) {
        // error_log('[EONSR AEO License] Sync Details Failed: ' . $response->get_error_message());
        wp_send_json_error(['message' => 'Lỗi kết nối Server: ' . $response->get_error_message()]);
    }

    $body = json_decode(wp_remote_retrieve_body($response), true);

    // 3. Process Data
    $license_data = null;
    $usage        = null;

    if (isset($body['license'])) {
        $license_data = $body['license'];
    } elseif (isset($body['usage'])) {
        $license_data = $body; // Handle direct object return
    }

    if ($license_data && isset($license_data['usage'])) {
        $usage = $license_data['usage'];

        // 4. Update Database
        update_option('eonsr_aeo_agent_license_details', $license_data);

        // Update features if changed
        if (isset($license_data['features'])) {
            update_option('eonsr_aeo_agent_license_features', $license_data['features']);
        }

        // 5. Respond to Client
        wp_send_json_success(['usage' => $usage]);
    } else {
        wp_send_json_error(['message' => 'Không tìm thấy dữ liệu Usage từ API Details']);
    }
});