# 导入WeRoBot框架的会话存储基类和工具函数
from werobot.session import SessionStorage
from werobot.utils import json_loads, json_dumps

# 导入Django项目的缓存工具
from djangoblog.utils import cache


class MemcacheStorage(SessionStorage):
    """
    基于Memcached的WeRoBot会话存储实现
    继承自WeRoBot的SessionStorage基类，用于将会话数据存储到Memcached中
    """
    
    def __init__(self, prefix='ws_'):
        """
        初始化方法
        
        Args:
            prefix (str): 缓存键的前缀，默认为'ws_'，用于区分其他缓存数据
        """
        self.prefix = prefix  # 设置缓存键前缀
        self.cache = cache    # Django缓存实例（通常是Memcached）

    @property
    def is_available(self):
        """
        检查缓存存储是否可用的属性
        
        Returns:
            bool: 如果缓存系统工作正常返回True，否则返回False
        """
        value = "1"  # 测试值
        # 尝试设置一个测试键值对
        self.set('checkavaliable', value=value)
        # 读取测试值并比较，验证缓存系统是否正常工作
        return value == self.get('checkavaliable')

    def key_name(self, s):
        """
        生成完整的缓存键名
        
        Args:
            s (str): 原始会话ID
            
        Returns:
            str: 添加前缀后的完整缓存键名
        """
        return '{prefix}{s}'.format(prefix=self.prefix, s=s)

    def get(self, id):
        """
        根据会话ID获取会话数据
        
        Args:
            id (str): 会话ID
            
        Returns:
            dict: 解析后的会话数据字典，如果不存在返回空字典
        """
        id = self.key_name(id)  # 生成完整缓存键
        # 从缓存获取数据，如果不存在则返回空JSON对象
        session_json = self.cache.get(id) or '{}'
        # 将JSON字符串解析为Python字典
        return json_loads(session_json)

    def set(self, id, value):
        """
        设置会话数据
        
        Args:
            id (str): 会话ID
            value (dict): 要存储的会话数据字典
        """
        id = self.key_name(id)  # 生成完整缓存键
        # 将会话数据序列化为JSON字符串并存储到缓存
        self.cache.set(id, json_dumps(value))

    def delete(self, id):
        """
        删除指定会话ID的数据
        
        Args:
            id (str): 要删除的会话ID
        """
        id = self.key_name(id)  # 生成完整缓存键
        # 从缓存中删除对应的数据
        self.cache.delete(id)