"""PySQLit的常量定义模块。

定义了数据库系统的所有常量，包括：
- 行结构定义
- 页面大小
- 节点结构
- 表结构
- 错误代码
- 语句类型
"""

# 行结构定义
ID_SIZE = 4  # ID字段大小（4字节整数）
USERNAME_SIZE = 32  # 用户名字段大小（32字节字符串）
EMAIL_SIZE = 255  # 邮箱字段大小（255字节字符串）
ID_OFFSET = 0  # ID字段偏移量
USERNAME_OFFSET = ID_OFFSET + ID_SIZE  # 用户名字段偏移量
EMAIL_OFFSET = USERNAME_OFFSET + USERNAME_SIZE  # 邮箱字段偏移量
ROW_SIZE = ID_SIZE + USERNAME_SIZE + EMAIL_SIZE  # 单行总大小（291字节）

# 页面大小（4KB）
PAGE_SIZE = 4096

# 通用节点头部结构
NODE_TYPE_SIZE = 1  # 节点类型大小（1字节）
IS_ROOT_SIZE = 1  # 根节点标识大小（1字节）
PARENT_POINTER_SIZE = 4  # 父节点指针大小（4字节）
COMMON_NODE_HEADER_SIZE = NODE_TYPE_SIZE + IS_ROOT_SIZE + PARENT_POINTER_SIZE  # 通用头部总大小（6字节）

# 叶子节点头部结构
LEAF_NODE_NUM_CELLS_SIZE = 4  # 单元格数量大小（4字节）
LEAF_NODE_NEXT_LEAF_SIZE = 4  # 下一个叶子节点指针大小（4字节）
LEAF_NODE_HEADER_SIZE = COMMON_NODE_HEADER_SIZE + LEAF_NODE_NUM_CELLS_SIZE + LEAF_NODE_NEXT_LEAF_SIZE  # 叶子节点头部总大小（14字节）

# 叶子节点单元格结构
LEAF_NODE_KEY_SIZE = 4  # 键大小（4字节）
LEAF_NODE_VALUE_SIZE = ROW_SIZE  # 值大小（等于行大小）
LEAF_NODE_CELL_SIZE = LEAF_NODE_KEY_SIZE + LEAF_NODE_VALUE_SIZE  # 单元格总大小（295字节）
LEAF_NODE_SPACE_FOR_CELLS = PAGE_SIZE - LEAF_NODE_HEADER_SIZE  # 可用于存储单元格的空间（4082字节）
LEAF_NODE_MAX_CELLS = LEAF_NODE_SPACE_FOR_CELLS // LEAF_NODE_CELL_SIZE  # 最大单元格数量（13个）

# 叶子节点分裂
LEAF_NODE_RIGHT_SPLIT_COUNT = (LEAF_NODE_MAX_CELLS + 1) // 2  # 右分裂数量（7个）
LEAF_NODE_LEFT_SPLIT_COUNT = (LEAF_NODE_MAX_CELLS + 1) - LEAF_NODE_RIGHT_SPLIT_COUNT  # 左分裂数量（7个）

# 内部节点头部结构
INTERNAL_NODE_NUM_KEYS_SIZE = 4  # 键数量大小（4字节）
INTERNAL_NODE_RIGHT_CHILD_SIZE = 4  # 右子节点指针大小（4字节）
INTERNAL_NODE_HEADER_SIZE = COMMON_NODE_HEADER_SIZE + INTERNAL_NODE_NUM_KEYS_SIZE + INTERNAL_NODE_RIGHT_CHILD_SIZE  # 内部节点头部总大小（14字节）

# 内部节点单元格结构
INTERNAL_NODE_KEY_SIZE = 4  # 键大小（4字节）
INTERNAL_NODE_CHILD_SIZE = 4  # 子节点指针大小（4字节）
INTERNAL_NODE_CELL_SIZE = INTERNAL_NODE_KEY_SIZE + INTERNAL_NODE_CHILD_SIZE  # 单元格总大小（8字节）
INTERNAL_NODE_MAX_KEYS = 3  # 最大键数量（简化实现）

# 表结构
TABLE_MAX_PAGES = 100  # 表最大页数
ROWS_PER_PAGE = PAGE_SIZE // ROW_SIZE  # 每页行数（14行）
TABLE_MAX_ROWS = TABLE_MAX_PAGES * ROWS_PER_PAGE  # 表最大行数（1400行）

# 节点类型
NODE_INTERNAL = 1  # 内部节点类型
NODE_LEAF = 0  # 叶子节点类型

# 页号定义
INVALID_PAGE_NUM = 0  # 无效页号

# 偏移量定义
LEAF_NODE_NUM_CELLS_OFFSET = COMMON_NODE_HEADER_SIZE  # 叶子节点单元格数量偏移量
LEAF_NODE_NEXT_LEAF_OFFSET = LEAF_NODE_NUM_CELLS_OFFSET + LEAF_NODE_NUM_CELLS_SIZE  # 下一个叶子节点偏移量

INTERNAL_NODE_NUM_KEYS_OFFSET = COMMON_NODE_HEADER_SIZE  # 内部节点键数量偏移量
INTERNAL_NODE_RIGHT_CHILD_OFFSET = INTERNAL_NODE_NUM_KEYS_OFFSET + INTERNAL_NODE_NUM_KEYS_SIZE  # 右子节点偏移量

# 错误代码
PREPARE_SUCCESS = 0  # 准备成功
PREPARE_NEGATIVE_ID = 1  # 负ID错误
PREPARE_STRING_TOO_LONG = 2  # 字符串过长错误
PREPARE_SYNTAX_ERROR = 3  # 语法错误
PREPARE_UNRECOGNIZED_STATEMENT = 4  # 无法识别的语句错误

# 语句类型
STATEMENT_INSERT = 0  # 插入语句
STATEMENT_SELECT = 1  # 查询语句

# 执行结果
EXECUTE_SUCCESS = 0  # 执行成功
EXECUTE_TABLE_FULL = 1  # 表已满
EXECUTE_DUPLICATE_KEY = 2  # 重复键错误