#include "app_get_json.h"
#include "cJSON.h"
#include "bsp_uart.h"
#include "string.h"
#include "stdio.h"
#include <stdlib.h>  // 必须包含，用于atoi函数
#include "app_scan.h"

uint8_t uart_rx_buffer[1024];
cJSON *cjson = NULL;
int Max_resis;
int Min_resis;
int Div_resis;

// 辅助函数：解析JSON数组到uint8_t数组
// json_arr: cJSON数组对象, arr: 目标数组, max_len: 数组最大长度
void parse_json_array(cJSON *json_item, uint8_t *arr, int max_len) {
    // 1. 初始化数组为0，避免脏数据
    memset(arr, 0, max_len * sizeof(uint8_t));
    
    // 2. 检查JSON项是否有效（是字符串类型）
    if (json_item == NULL || !cJSON_IsString(json_item) || json_item->valuestring == NULL) {
        return; // 不是有效字符串，直接返回
    }
    
    // 3. 复制字符串到临时缓冲区（避免修改原JSON数据）
    char temp_buf[64] = {0}; // 足够容纳12个数字+逗号的长度
    strncpy(temp_buf, json_item->valuestring, sizeof(temp_buf) - 1);
    
    // 4. 按逗号分割字符串，解析为数字数组
    char *token = strtok(temp_buf, ",");
    int idx = 0;
    while (token != NULL && idx < max_len) {
        // 把分割后的字符串转为数字，存入数组
        arr[idx++] = (uint8_t)atoi(token);
        token = strtok(NULL, ",");
    }
}


int get_Json_data(json_data_struct * sys){
    int result = -1;  // 1 表示成功，其他值表示错误
    uint16_t uart_get_num = usart_rx_get_rx_data_count(USART_3_TR);

    // 只有当串口接收到数据时才进行解析
    if(uart_get_num > 0 && uart_get_num < sizeof(uart_rx_buffer)){ // 增加缓冲区溢出保护
        // 读取串口接收的数据到缓冲区
        uint16_t get_size = usart_rx_recv(USART_3_TR, uart_rx_buffer, uart_get_num);
        
        // 确保数据读取成功
        if(get_size != uart_get_num){
            memset(uart_rx_buffer, 0, sizeof(uart_rx_buffer)); // 清空缓冲区
            return -2; // 读取数据失败错误码
        }

        // 先释放之前的cJSON内存，避免内存泄漏
        if(cjson != NULL ){
            cJSON_Delete(cjson);
            cjson = NULL; // 释放后置空，避免野指针
        }

        // 解析JSON字符串（将串口缓冲区数据转为cJSON对象）
        cjson = cJSON_Parse((const char*)uart_rx_buffer);
		memset(uart_rx_buffer, 0, sizeof(uart_rx_buffer));//解析完成，清空
        if (cjson != NULL) {
            // 2. 依次获取JSON中的三个字段，并进行有效性检查
            cJSON *Max_resis_item = cJSON_GetObjectItem(cjson, "Max_resis");
            cJSON *Min_resis_item = cJSON_GetObjectItem(cjson, "Min_resis");
            cJSON *Div_resis_item = cJSON_GetObjectItem(cjson, "Div_resis");
			
			
			cJSON *x_rank_arr = cJSON_GetObjectItem(cjson, "x_rank");
			cJSON *y_rank_arr = cJSON_GetObjectItem(cjson, "y_rank");
			if(x_rank_arr != NULL && y_rank_arr != NULL)
			{
				uint8_t x_rank[12] = {0};
				parse_json_array(x_rank_arr, x_rank, 12);
				
				// 3. 直接解析y_rank JSON数组
				
				uint8_t y_rank[12] = {0};
				parse_json_array(y_rank_arr, y_rank, 12);
				
				// 4. 调用保存函数
				save_config_ranks(x_rank, y_rank);
			}
			
            // 检查所有需要的字段是否存在且为字符串类型（你的JSON中值是字符串格式）
            if(Max_resis_item != NULL && cJSON_IsString(Max_resis_item) &&
               Min_resis_item != NULL && cJSON_IsString(Min_resis_item) &&
               Div_resis_item != NULL && cJSON_IsString(Div_resis_item))
            {
                // 3. 将字符串类型的值转换为int并存储到结构体中
                Max_resis = atoi(Max_resis_item->valuestring);
                Min_resis = atoi(Min_resis_item->valuestring);
                Div_resis = atoi(Div_resis_item->valuestring);
				sys->max_trigger_res_value = Max_resis;
				sys->min_trigger_res_value = Min_resis;
				sys->div_trigger_res = Div_resis;
                result = 1; // 解析成功，返回1
            }
            else{
                result = -3; // 字段缺失或类型错误
            }

            // 4. 清理cJSON内存（解析完成后必须释放，避免内存泄漏）
            cJSON_Delete(cjson);
            cjson = NULL; // 置空，防止重复释放
        }
        else{
            result = -4; // JSON格式错误，解析失败
        }

        // 清空串口接收缓冲区，准备下一次接收
        
    }
    else{
        result = -5; // 串口无数据或数据超出缓冲区大小
    }

    return result;
}

