<?php
/**
 * EONSR AEO Agent - API & Helper Functions
 *
 * Handles API configuration retrieval, YouTube searching,
 * and HTML text extraction.
 *
 * @package EONSR_AEO_Agent
 */

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

/**
 * Lấy cấu hình API từ Server trung tâm.
 *
 * @return array|WP_Error Trả về mảng config nếu thành công, hoặc WP_Error nếu lỗi.
 */
function eonsr_aeo_agent_get_api_config()
{
    // 1. Get License Key
    $license_key = get_option('eonsr_aeo_agent_license_key');

    if (empty($license_key)) {
        // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- License validation error tracking
        error_log('[EONSR AEO Agent] ❌ Get Config Failed: License key is missing.');
        return new WP_Error('no_license_key', 'Không tìm thấy key bản quyền.');
    }

    // 2. Prepare Request
    // Updated: Use Global Constant for API URL
    $api_url = EONSR_AEO_AGENT_API_URL . '/api/v1/apiConfig/config/get'; 
    $domain  = site_url();

    $body = [
        'licenseKey' => $license_key,
        'domain'     => $domain,
    ];

    // 3. Send Request
    $response = wp_remote_post($api_url, [
        'body'    => json_encode($body),
        'headers' => ['Content-Type' => 'application/json'],
        'timeout' => 20,
    ]);

    // 4. Handle Connection Errors
    if (is_wp_error($response)) {
        
        // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- API connection error logging
        error_log('[EONSR AEO Agent] ❌ Config API Connection Error: ' . $response->get_error_message());
        return new WP_Error(
            'config_api_connection_error', 
            'Lỗi kết nối đến server cấu hình: ' . $response->get_error_message()
        );
    }

    // 5. Parse Response
    $response_body = json_decode(wp_remote_retrieve_body($response), true);
    $response_code = wp_remote_retrieve_response_code($response);

    // 6. Validate Data
    if ($response_code === 200 && !empty($response_body['success']) && !empty($response_body['config'])) {
        return $response_body['config'];
    }
    
    // Log logic error from server
    $error_message = isset($response_body['message']) ? $response_body['message'] : 'Không thể lấy cấu hình API từ server.';
    
    // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- API response error tracking
    error_log(sprintf('[EONSR AEO Agent] ⚠️ Config API Error (%d): %s', $response_code, $error_message));

    return new WP_Error('config_api_error', $error_message);
}

/**
 * Tìm kiếm video trên YouTube bằng Google Data API.
 *
 * @param string $query      Từ khóa tìm kiếm.
 * @param array  $api_config Mảng chứa cấu hình API (bao gồm youtubeApiKey).
 * @param string $language   Ngôn ngữ ưu tiên (Default: English).
 * @return array|WP_Error    Trả về thông tin video hoặc lỗi.
 */
function eonsr_aeo_agent_search_youtube($query, $api_config, $language = 'English')
{
    // 1. Validate API Key
    $api_key = $api_config['youtubeApiKey'] ?? '';
    
    if (empty($api_key)) {
        
        // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- YouTube API key validation
        error_log('[EONSR AEO Agent] ❌ YouTube Search Failed: Missing API Key.');
        return new WP_Error('no_youtube_api_key', 'Cấu hình YouTube Data API Key không tồn tại.');
    }

    // 2. Build Query Arguments
    $api_args = [
        'part'       => 'snippet',
        'q'          => urlencode($query),
        'key'        => $api_key,
        'type'       => 'video',
        'maxResults' => 1,
    ];
    
    // Add localization parameters
    if ($language === 'Vietnamese') {
        $api_args['relevanceLanguage'] = 'vi'; 
        $api_args['regionCode']        = 'VN';      
    }

    // 3. Construct URL & Call API
    $api_url  = add_query_arg($api_args, 'https://www.googleapis.com/youtube/v3/search'); 
    $response = wp_remote_get($api_url, ['timeout' => 30]);

    // 4. Handle Connection Errors
    if (is_wp_error($response)) {
        
        // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- YouTube API connection error
        error_log('[EONSR AEO Agent] ❌ YouTube API Request Error: ' . $response->get_error_message());
        return $response;
    }

    // 5. Parse Data
    $body = wp_remote_retrieve_body($response);
    $data = json_decode($body, true);

    if (empty($data['items'])) {
        // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- YouTube search result tracking
        error_log(sprintf('[EONSR AEO Agent] ℹ️ No video found for query: "%s"', $query));
        return new WP_Error('no_video_found', 'Không tìm thấy video nào phù hợp.');
    }

    // 6. Format Result
    $video = $data['items'][0];
    
    return [
        'id'          => $video['id']['videoId'],
        'title'       => $video['snippet']['title'],
        'description' => $video['snippet']['description'],
        'uploadDate'  => gmdate('Y-m-d', strtotime($video['snippet']['publishedAt'])),
        'channel'     => $video['snippet']['channelTitle'],
    ];
}

/**
 * Bóc tách nội dung văn bản sạch từ một chuỗi HTML.
 * Loại bỏ script, style và các thẻ không cần thiết.
 *
 * @param string $html Chuỗi HTML đầu vào.
 * @return string Chuỗi văn bản thuần (Plain text).
 */
function eonsr_aeo_agent_extract_text_from_html($html)
{
    if (empty($html)) {
        return '';
    }

    // 1. Remove noise tags (Script, Style, Nav, Footer, etc.)
    $html = preg_replace('/<(script|style|nav|footer|header|aside|form)[^>]*>.*?<\/\1>/is', '', $html);

    // 2. Strip HTML tags
    $text = wp_strip_all_tags($html);

    // 3. Normalize whitespace
    // Replace multiple spaces with a single space
    $text = preg_replace('/\s+/', ' ', $text); 
    // Remove leading/trailing newlines per line (if any remain)
    $text = preg_replace('/^\s*\n/m', '', $text); 
    
    return trim($text);
}