from __future__ import annotations

import json
import struct
from typing import Any


def SerializeSymbolTable(SymbolTable: dict[str, Any]) -> bytes:
    """将符号表序列化为二进制格式

    格式:
    - 4字节: JSON数据长度（小端序）
    - N字节: JSON数据（UTF-8编码）

    Args:
        SymbolTable: 符号表字典

    Returns:
        二进制字节数据
    """
    JsonData: bytes = json.dumps(SymbolTable, ensure_ascii=False).encode('utf-8')
    length: int = len(JsonData)
    # 使用4字节小端序整数表示长度
    header: bytes = struct.pack('<I', length)
    return header + JsonData


def deSerializeSymbolTable(data: bytes) -> dict[str, Any]:
    """从二进制数据反序列化符号表

    Args:
        data: 二进制字节数据

    Returns:
        符号表字典
    """
    if len(data) < 4:
        raise ValueError("Invalid symbin file: data too short")
    # 解析4字节长度头（小端序）
    length: int = struct.unpack('<I', data[:4])[0]
    JsonData: bytes = data[4:4+length]
    return json.loads(JsonData.decode('utf-8'))


class SymbolFile:
    """符号文件类，用于解析和存储符号信息"""

    def __init__(self, file: str | None = None, string: str | None = None, type: str | None = None, encoding: str = 'utf-8') -> None:
        """初始化SymbolFile对象

        Args:
            file: 文件路径
            string: 代码字符串
            type: 文件类型，支持"c"或"py"
            encoding: 文件编码
        """
        self.FilePath: str | None = file
        self.CodeString: str | None = string
        self.FileType: str | None = type
        self.encoding: str = encoding
        self.symbols: dict[str, Any] = {}
