#include <stddef.h>
#include <stdbool.h>
#include "cJSON.h"

// DDM数据类型枚举
typedef enum {
    // 基本类型
    DDM_TYPE_INT,
    DDM_TYPE_DOUBLE,
    DDM_TYPE_BOOL,
    DDM_TYPE_STRING,

    // 结构类型
    DDM_TYPE_STRUCT,
    DDM_TYPE_STRUCT_ANONYMOUS, // 匿名数组，数组中的元素个数固定，但是类型可能不一致，按照结构体解析
    
    // 数组类型（新增：明确区分数组和基本类型）
    DDM_TYPE_ARRAY_INT,
    DDM_TYPE_ARRAY_DOUBLE,
    DDM_TYPE_ARRAY_BOOL,
    DDM_TYPE_ARRAY_STRING,
    DDM_TYPE_ARRAY_STRUCT,
    
    // 特殊数组类型：匿名数组的数组，数组中的元素个数固定，但是类型可能不一致
    DDM_TYPE_ARRAY_STRUCT_ANONYMOUS,
    // 特殊类型
    DDM_TYPE_CUSTOM = 100  // 预留自定义处理
} DDM_Type;

// 数组描述符结构体
typedef struct DDM_ArrayDesc {
    DDM_Type        element_type;                          // 数组元素的类型
    size_t          element_size;                          // 单个元素的大小（字节）
    const void     *element_submap;                        // 如果是结构体数组，指向元素的映射表
} DDM_ArrayDesc;

// 字段映射描述符
typedef struct DDM_FieldMap {
    const char                 *json_key;               // JSON中的键名
    size_t                      member_offset;          // 字段在结构体中的偏移量
    DDM_Type                    type;                   // 字段类型
    size_t                      member_cnt_offset;      // 字段长度
    union {
        const struct DDM_FieldMap  *str_map;            // 嵌套结构
        const struct DDM_ArrayDesc *arr_map;
    } submap;
} DDM_FieldMap;

int ddm_parse_object(cJSON *json_obj, void *target_struct, const DDM_FieldMap *map);
int ddm_parse_file(const char *filepath, void *target_struct, const DDM_FieldMap *map);
void ddm_free_object(void *target_struct, const DDM_FieldMap *map);
