<?php
/**
 * AI Post 插件缓存系统
 * 
 * 提供智能缓存功能，提升插件性能
 * 
 * @package AI-Post
 * @since 2.8.9
 */

namespace HaoZiTeam\AIPost\Inc;

defined('ABSPATH') || exit;

/**
 * 缓存系统类
 */
class CacheSystem {
    
    /**
     * 缓存组常量
     */
    const CACHE_GROUP_API = 'ai_post_api';
    const CACHE_GROUP_DB = 'ai_post_db';
    const CACHE_GROUP_IMAGE = 'ai_post_image';
    const CACHE_GROUP_TASK = 'ai_post_task';
    
    /**
     * 缓存统计
     */
    private static $stats = [
        'hits' => 0,
        'misses' => 0,
        'sets' => 0,
        'deletes' => 0,
        'clears' => 0
    ];
    
    /**
     * 获取缓存
     * 
     * @param string $key 缓存键
     * @param string $group 缓存组
     * @param mixed $default 默认值
     * @return mixed 缓存值
     */
    public static function get($key, $group = 'default', $default = false) {
        $cache_key = self::build_key($key, $group);
        $value = wp_cache_get($cache_key, $group);
        
        if ($value === false) {
            self::$stats['misses']++;
            return $default;
        }
        
        self::$stats['hits']++;
        return $value;
    }
    
    /**
     * 设置缓存
     * 
     * @param string $key 缓存键
     * @param mixed $value 缓存值
     * @param string $group 缓存组
     * @param int $expire 过期时间（秒）
     * @return bool 是否成功
     */
    public static function set($key, $value, $group = 'default', $expire = 3600) {
        $cache_key = self::build_key($key, $group);
        $result = wp_cache_set($cache_key, $value, $group, $expire);
        
        if ($result) {
            self::$stats['sets']++;
        }
        
        return $result;
    }
    
    /**
     * 删除缓存
     * 
     * @param string $key 缓存键
     * @param string $group 缓存组
     * @return bool 是否成功
     */
    public static function delete($key, $group = 'default') {
        $cache_key = self::build_key($key, $group);
        $result = wp_cache_delete($cache_key, $group);
        
        if ($result) {
            self::$stats['deletes']++;
        }
        
        return $result;
    }
    
    /**
     * 清除缓存组
     * 
     * @param string $group 缓存组
     * @return bool 是否成功
     */
    public static function clear_group($group = 'default') {
        // WordPress 没有直接的组清除功能，这里使用模式匹配
        global $wp_object_cache;
        
        if (isset($wp_object_cache->cache[$group])) {
            unset($wp_object_cache->cache[$group]);
            self::$stats['clears']++;
            return true;
        }
        
        return false;
    }
    
    /**
     * 构建缓存键
     * 
     * @param string $key 原始键
     * @param string $group 缓存组
     * @return string 完整缓存键
     */
    private static function build_key($key, $group) {
        // 添加博客ID前缀，支持多站点
        $blog_id = get_current_blog_id();
        return "ai_post_{$blog_id}_{$group}_{$key}";
    }
    
    /**
     * 获取API响应缓存
     * 
     * @param string $api_endpoint API端点
     * @param array $params 请求参数
     * @param mixed $default 默认值
     * @return mixed 缓存值
     */
    public static function get_api_response($api_endpoint, $params = [], $default = false) {
        $cache_key = md5($api_endpoint . serialize($params));
        return self::get($cache_key, self::CACHE_GROUP_API, $default);
    }
    
    /**
     * 设置API响应缓存
     * 
     * @param string $api_endpoint API端点
     * @param array $params 请求参数
     * @param mixed $value 缓存值
     * @param int $expire 过期时间（秒）
     * @return bool 是否成功
     */
    public static function set_api_response($api_endpoint, $params = [], $value, $expire = 1800) {
        $cache_key = md5($api_endpoint . serialize($params));
        return self::set($cache_key, $value, self::CACHE_GROUP_API, $expire);
    }
    
    /**
     * 获取数据库查询缓存
     * 
     * @param string $query SQL查询
     * @param array $params 查询参数
     * @param mixed $default 默认值
     * @return mixed 缓存值
     */
    public static function get_db_query($query, $params = [], $default = false) {
        $cache_key = md5($query . serialize($params));
        return self::get($cache_key, self::CACHE_GROUP_DB, $default);
    }
    
    /**
     * 设置数据库查询缓存
     * 
     * @param string $query SQL查询
     * @param array $params 查询参数
     * @param mixed $value 缓存值
     * @param int $expire 过期时间（秒）
     * @return bool 是否成功
     */
    public static function set_db_query($query, $params = [], $value, $expire = 3600) {
        $cache_key = md5($query . serialize($params));
        return self::set($cache_key, $value, self::CACHE_GROUP_DB, $expire);
    }
    
    /**
     * 获取图片数据缓存
     * 
     * @param string $image_url 图片URL
     * @param mixed $default 默认值
     * @return mixed 缓存值
     */
    public static function get_image_data($image_url, $default = false) {
        $cache_key = md5($image_url);
        return self::get($cache_key, self::CACHE_GROUP_IMAGE, $default);
    }
    
    /**
     * 设置图片数据缓存
     * 
     * @param string $image_url 图片URL
     * @param mixed $value 缓存值
     * @param int $expire 过期时间（秒）
     * @return bool 是否成功
     */
    public static function set_image_data($image_url, $value, $expire = 86400) {
        $cache_key = md5($image_url);
        return self::set($cache_key, $value, self::CACHE_GROUP_IMAGE, $expire);
    }
    
    /**
     * 获取任务数据缓存
     * 
     * @param int $task_id 任务ID
     * @param mixed $default 默认值
     * @return mixed 缓存值
     */
    public static function get_task_data($task_id, $default = false) {
        return self::get("task_{$task_id}", self::CACHE_GROUP_TASK, $default);
    }
    
    /**
     * 设置任务数据缓存
     * 
     * @param int $task_id 任务ID
     * @param mixed $value 缓存值
     * @param int $expire 过期时间（秒）
     * @return bool 是否成功
     */
    public static function set_task_data($task_id, $value, $expire = 300) {
        return self::set("task_{$task_id}", $value, self::CACHE_GROUP_TASK, $expire);
    }
    
    /**
     * 删除任务数据缓存
     * 
     * @param int $task_id 任务ID
     * @return bool 是否成功
     */
    public static function delete_task_data($task_id) {
        return self::delete("task_{$task_id}", self::CACHE_GROUP_TASK);
    }
    
    /**
     * 获取缓存统计
     * 
     * @return array 统计信息
     */
    public static function get_stats() {
        return self::$stats;
    }
    
    /**
     * 重置缓存统计
     */
    public static function reset_stats() {
        self::$stats = [
            'hits' => 0,
            'misses' => 0,
            'sets' => 0,
            'deletes' => 0,
            'clears' => 0
        ];
    }
    
    /**
     * 获取缓存命中率
     * 
     * @return float 命中率（百分比）
     */
    public static function get_hit_rate() {
        $total = self::$stats['hits'] + self::$stats['misses'];
        if ($total === 0) {
            return 0;
        }
        return round((self::$stats['hits'] / $total) * 100, 2);
    }
    
    /**
     * 清理所有缓存
     * 
     * @return bool 是否成功
     */
    public static function flush_all() {
        $groups = [
            self::CACHE_GROUP_API,
            self::CACHE_GROUP_DB,
            self::CACHE_GROUP_IMAGE,
            self::CACHE_GROUP_TASK
        ];
        
        $success = true;
        foreach ($groups as $group) {
            if (!self::clear_group($group)) {
                $success = false;
            }
        }
        
        self::reset_stats();
        return $success;
    }
    
    /**
     * 初始化缓存系统
     */
    public static function init() {
        // 注册缓存清理定时任务
        if (!wp_next_scheduled('ai_post_cache_cleanup')) {
            wp_schedule_event(time(), 'daily', 'ai_post_cache_cleanup');
        }
        
        // 添加缓存清理回调
        add_action('ai_post_cache_cleanup', [__CLASS__, 'cleanup_expired_cache']);
        
        // 添加缓存统计显示（仅管理员）
        if (current_user_can('manage_options')) {
            add_action('admin_notices', [__CLASS__, 'display_cache_stats']);
        }
    }
    
    /**
     * 清理过期缓存
     */
    public static function cleanup_expired_cache() {
        // WordPress 会自动清理过期缓存
        // 这里可以添加自定义的缓存清理逻辑
        error_log('AI Post: 缓存清理任务执行完成');
    }
    
    /**
     * 显示缓存统计
     */
    public static function display_cache_stats() {
        $stats = self::get_stats();
        $hit_rate = self::get_hit_rate();
        
        if ($stats['hits'] + $stats['misses'] === 0) {
            return; // 没有缓存活动，不显示
        }
        
        echo '<div class="notice notice-info">';
        echo '<p><strong>AI Post 缓存统计：</strong></p>';
        echo '<ul>';
        echo '<li>命中次数：' . esc_html($stats['hits']) . '</li>';
        echo '<li>未命中次数：' . esc_html($stats['misses']) . '</li>';
        echo '<li>命中率：' . esc_html($hit_rate) . '%</li>';
        echo '<li>设置次数：' . esc_html($stats['sets']) . '</li>';
        echo '<li>删除次数：' . esc_html($stats['deletes']) . '</li>';
        echo '</ul>';
        echo '</div>';
    }
}
