"""
数据压缩/解压工具

提供JSON数据的gzip压缩和解压功能
"""

import gzip
import json
from typing import Any, Optional


def compress_json(data: Any) -> Optional[bytes]:
    """
    将JSON数据压缩为gzip格式的字节

    Args:
        data: 任意可JSON序列化的数据

    Returns:
        gzip压缩后的字节，如果输入为None则返回None
    """
    if data is None:
        return None

    try:
        # 转换为JSON字符串
        json_str = json.dumps(data, ensure_ascii=False)
        # gzip压缩
        compressed = gzip.compress(json_str.encode("utf-8"), compresslevel=6)
        return compressed
    except Exception:
        # 如果压缩失败，返回None
        return None


def decompress_json(compressed_data: Optional[bytes]) -> Optional[Any]:
    """
    解压gzip格式的字节为JSON数据

    Args:
        compressed_data: gzip压缩的字节数据

    Returns:
        解压后的JSON数据，如果输入为None或解压失败则返回None
    """
    if compressed_data is None:
        return None

    try:
        # gzip解压
        json_str = gzip.decompress(compressed_data).decode("utf-8")
        # 解析JSON
        data = json.loads(json_str)
        return data
    except Exception:
        # 如果解压失败，返回None
        return None


def get_body_size(data: Any) -> int:
    """
    获取JSON数据序列化后的字节大小

    Args:
        data: 任意可JSON序列化的数据

    Returns:
        字节大小
    """
    if data is None:
        return 0
    try:
        return len(json.dumps(data, ensure_ascii=False).encode("utf-8"))
    except Exception:
        return 0
