#include "xysdk_common.h"
#include "xysdk_platform.h"

#undef FILE __FILE
#include  "system/includes.h"
#include  "app_config.h"
#define  TEST_DEVICE_ID   "121212345678"


/* #define XY_USER_INFO   	  "storage/sd0/C/info.bin" */
#define XY_USER_INFO   	  "storage/virfat_flash/C/info.bin"
#define CST_OFFSET_TIME			(8*60*60)	// 北京时间时差

uint32_t xy_api_get_sys_time(void)
{
	struct sys_time time;
	himalaya_get_sys_time(&time);
	u32 timestamp=timestamp_mytime_2_utc_sec(&time)-CST_OFFSET_TIME;
	printf(">>>>>>>>>>>>func %s line %d  timestamp %d \n",__FUNCTION__,__LINE__,timestamp);
	return timestamp;
}


void xy_api_timestamp_to_date(char *date_str, uint32_t timestamp)
{
	struct sys_time time;
	himalaya_get_sys_time(&time);
	timestamp = timestamp_mytime_2_utc_sec(&time)-CST_OFFSET_TIME;
}


//存储用户信息到文件,根据情况配置XY_USER_INFO宏来修改文件存放路径
int xy_api_write_user_data(char *user_info, uint32_t len)
{
    if (user_info == NULL || len == 0) 
	{
        return -1; 
    }

    FILE *file = fopen(XY_USER_INFO, "w+");
    if (file == NULL)
	 {
        return -1; 
    }

    if (fwrite(file,user_info,len) != len) 
	{
        fclose(file);
        return -2; // 返回特定错误码表示写入失败
    }

    if (fclose(file) != 0) {
        // 关闭文件时出现错误
        return -3; 
    }

	return 0;
}

int xy_api_clear_user_data(void)
{
	int ret=fdelete_by_name(XY_USER_INFO);

	return ret;
}

//读取用户信息
int xy_api_read_user_data(char *read_buf, uint16_t read_len)
{
    if (read_buf == NULL || read_len == 0) {
        return -1;    
    }

    FILE *file = fopen(XY_USER_INFO, "r");
    if (file == NULL) 
	{
        return -2; 
    }
    size_t bytes_read = fread(file,read_buf,read_len);
	/*
    if (ferror(file))
	{
        fclose(file);
        return -3;
    }
	*/

    if (fclose(file) != 0)
	{
        return -4; 
    }

    // 如果一切正常，返回实际读取的字节数量
    // 注意：如果文件内容少于read_len字节，bytes_read会小于read_len
    return (int)bytes_read;
}

//获取设备的唯一标识码
char *xy_api_get_device_id(void)
{
	static char *device_id= NULL;
	if(!device_id)
	{
		device_id = (char *)xy_common_malloc(35);
		if(!device_id)
		{
			return NULL;
		}
	}
	memset(device_id, 0, 35);
    sprintf(device_id, "%s", TEST_DEVICE_ID);
	return device_id;
}

void xy_print_long_data(uint8_t *data, uint16_t len)
{
    #if (XY_LOG_LEVEL>= XY_LOG_INFO_LEVEL)
	bool zero_flag = false;
    printf("%s: %d\r\n", __func__, len);
    printf("===================================================================\r\n");
    for (uint16_t i = 0; i < len; i++)
    {
        if ('\0' == data[i])
        {
            zero_flag = true;
            continue;
        }
        if (true == zero_flag)
        {
            printf("\r\n");
            zero_flag = false;
        }
        printf("%c", data[i]);
    }
    printf("\r\n===================================================================\r\n");
    #endif
}

//用于大内存申请
void *xy_common_big_mem_malloc(uint32_t size)
{
	if(size > 0)
	{
		/* void *src = (void *)malloc_psram(size); */
		void *src = (void *)malloc(size);
		if(src == NULL)
			return NULL;
		memset(src,0,size);
		XY_LOG_I("%s[0x%x], %d",__func__, src, size);
		return src;
	}
	return NULL;
}

//用于大内存释放
void xy_common_big_mem_free(void **src)
{
	if(*src != NULL)
	{
		XY_LOG_I("%s[0x%x]",__func__, *src);
		/* free_psram(*src); */
		free(*src);
		*src = NULL;
	}
}

//获取appkey，修改宏（一般情况下不用修改）
char *xy_api_get_appkey(void)
{
	return XY_CLOUD_KEY;
}

//获取appSecret，修改宏（一般情况下不用修改）
char *xy_api_get_appsecret(void)
{
	return XY_CLOUD_SECRET;
}

//获取sn，修改宏（一般情况下不用修改）
char *xy_api_get_app_sn(void)
{
	return XY_SN;
}
