#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
#include <string.h>  // 添加memcpy函数支持
#include "JZring.h"

typedef struct T_JZring
{
    U8_t *buffer;   // 缓冲区指针
    U32_t size;     // 缓冲区总容量
    U32_t head;     // 写入位置(下一个可写位置)
    U32_t tail;     // 读取位置(下一个可读位置)
    U32_t count;    // 当前数据量(可选改进)
} T_JZring;


// 初始化环形缓冲区
T_JZsdkReturnCode JZring_Init(T_JZringHandle *ring, U8_t *buffer, U32_t size)
{
    if (!buffer || size == 0) 
    {
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }

    //注册ring
    T_JZring *r = (T_JZring*)malloc(sizeof(T_JZring));
    if (!r) {
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }

    r->buffer = buffer;
    r->size = size;
    r->head = 0;
    r->tail = 0;
    r->count = 0;  // 初始化数据计数

    *ring = (T_JZringHandle)r;

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

// 写入数据到环形缓冲区
T_JZsdkReturnCode JZring_Write(T_JZringHandle ring, const U8_t *data, U32_t size)
{
    if (!ring || !data) {
        return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
    }
    if (size == 0) {
        return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
    }

    T_JZring *r = (T_JZring*)ring;
    
    // 检查可用空间
    U32_t free_space = r->size - r->count;
    if (size > free_space) {
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }

    // 分两段复制数据(处理回绕)
    U32_t first_chunk = r->size - r->head;
    if (first_chunk >= size) {
        memcpy(r->buffer + r->head, data, size);
        r->head = (r->head + size) % r->size;
    } else {
        memcpy(r->buffer + r->head, data, first_chunk);
        memcpy(r->buffer, data + first_chunk, size - first_chunk);
        r->head = size - first_chunk;
    }
    
    r->count += size;  // 更新数据计数
    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

// 从环形缓冲区读取数据
T_JZsdkReturnCode JZring_Read(T_JZringHandle ring, U8_t *data, U32_t size, U32_t *readSize)
{
    if (!ring || !data || !readSize) {
        return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
    }

    T_JZring *r = (T_JZring*)ring;
    *readSize = 0;
    
    if (r->count == 0 || size == 0) {
        return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
    }

    // 计算实际可读数量
    U32_t bytes_to_read = (size > r->count) ? r->count : size;
    
    // 分两段复制数据(处理回绕)
    U32_t first_chunk = r->size - r->tail;
    if (first_chunk >= bytes_to_read) {
        memcpy(data, r->buffer + r->tail, bytes_to_read);
        r->tail = (r->tail + bytes_to_read) % r->size;
    } else {
        memcpy(data, r->buffer + r->tail, first_chunk);
        memcpy(data + first_chunk, r->buffer, bytes_to_read - first_chunk);
        r->tail = bytes_to_read - first_chunk;
    }
    
    r->count -= bytes_to_read;  // 更新数据计数
    *readSize = bytes_to_read;
    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

T_JZsdkReturnCode JZring_GetSize(T_JZringHandle ring, U32_t *size)
{
    T_JZring *ringHandle = (T_JZring*)ring;

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

T_JZsdkReturnCode JZring_GetFreeSize(T_JZringHandle ring, U32_t *size)
{
    T_JZring *ringHandle = (T_JZring*)ring;

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

T_JZsdkReturnCode JZring_Reset(T_JZringHandle ring)
{
    T_JZring *ringHandle = (T_JZring*)ring;

    ringHandle->head = 0;
    ringHandle->tail = 0;

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

T_JZsdkReturnCode JZring_DeInit(T_JZringHandle ring)
{
    T_JZring *ringHandle = (T_JZring*)ring;

    ringHandle->buffer = NULL;
    ringHandle->size = 0;
    ringHandle->head = 0;
    ringHandle->tail = 0;

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}