/** @file dc_api_wrap.cpp — C API 包装函数（类型工具） */
#include "dc_internal.h"

/** @brief 获取数据类型名称字符串 (extern "C", 使用 thread_local 缓冲区避免竞态) */
extern "C" const char *dc_get_type_name(uint8_t dt)
{
	static __thread char s_buf[32] = { 0 };

	dc_internal_type_name(dt, s_buf, sizeof(s_buf));

	return s_buf;
}

/** @brief 通过名称获取数据类型 ID */
extern "C" uint8_t dc_get_type_id_by_name(const char *name)
{
    return dc_util_type_id_by_name(name ? name : "");
}

/** @brief 获取数据类型的字节长度 */
extern "C" uint8_t dc_get_type_len(uint8_t dt)
{
    return dc_util_type_len(dt);
}

/** @brief 根据数据类型创建零初始化内存块 */
extern "C" void *dc_create_data(uint8_t dt)
{
    return dc_util_create_data(dt);
}

/** @brief 释放由 dc_create_data 分配的内存 */
extern "C" void dc_destroy_data(void *p, uint8_t dt)
{
    dc_util_destroy_data(p, dt);
}

/** @brief 将源数据按类型拷贝到目标 */
extern "C" int dc_copy_val(void *dst, const void *src, uint8_t dt)
{
    if (!dst || !src)
    {
        return DC_ERR_PARAM;
    }

    dc_util_val_copy(dst, src, dt);

    return DC_OK;
}

/** @brief 按类型比较两个值，返回 0 相等、-1 不等或参数错误 */
extern "C" int dc_compare_val(const void *p1, const void *p2, uint8_t dt)
{
    if (!p1 || !p2)
    {
        return -1;
    }

    return dc_util_val_compare(dt, p1, p2);
}

/** @brief 从字符串解析值并按类型写入内存 */
extern "C" int dc_set_val_from_str(void *p, uint8_t dt, const char *s)
{
    if (!p || !s)
    {
        return DC_ERR_PARAM;
    }

    return dc_util_val_from_string(p, dt, s);
}

/** @brief 检查参数配置文件是否已变更 */
extern "C" int dc_param_cfg_changed(void)
{
    std::lock_guard<std::mutex> lk(g_param_cfg_mutex);

    return g_param_cfg_changed ? 1 : 0;
}
