#include "jidu_dataCenter.h"
#include "jidu.h"
#include <iostream>
#include <fstream>
#include <sstream>
#include <cstring>
#include <mutex>
#include "cJSON.h"
#include "tracer.h"
#include "algorithm.h"
#include "jidu_vehicleConfig.h"
#include <MyStringUtils.h>

static std::mutex mItemLock;
int get_jd_orderInfo_vehicle_vin(char* outBuffer, uint32_t outBufferSize)
{
	JD_VEHICLE_ORDER_t vehicleOrderInfo = DataCenter::getInstance()->m_VehicleOrderInfo;
	string tempString = vehicleOrderInfo.strVin;

	if (tempString.empty()) {
		tempString = "L6T79T2E2PP002401";
	}
	memcpy(outBuffer, tempString.c_str(), tempString.length());
	return (int)tempString.length();
}

int get_jd_orderInfo_byEcuId(uint32_t ecuId, char* outBuffer, uint32_t outBufferSize)
{
	return get_jd_orderInfo_ecuName_byEcuId(ecuId, outBuffer, outBufferSize);
}

int get_jd_orderInfo_ecuName_byEcuId(uint32_t ecuId, char* outBuffer, uint32_t outBufferSize)
{
	JD_VEHICLE_ORDER_t vehicleOrderInfo = DataCenter::getInstance()->m_VehicleOrderInfo;
	memset(outBuffer, 0, outBufferSize);
	for (JD_ECU_INFO_t ecu : vehicleOrderInfo.vecListEcu) {
		if (ecu.nEcuId == ecuId) {
			string tempString = ecu.strEcuName;
			memcpy(outBuffer, tempString.c_str(), tempString.length());
			return (int)tempString.length();
		}
	}

	return -1;
}

int get_jd_orderInfo_ecuId_byEcuName(const char* ecuName)
{
	JD_VEHICLE_ORDER_t vehicleOrderInfo = DataCenter::getInstance()->m_VehicleOrderInfo;
	for (JD_ECU_INFO_t ecu : vehicleOrderInfo.vecListEcu) {
		if (ecu.strEcuName._Equal(ecuName)) {
			return ecu.nEcuId;
		}
	}

	string newName = ecuName;
	if (MyStringUtils::endWith(newName, "_SOC") || MyStringUtils::endWith(newName, "_MCU")) {
		newName = newName.substr(0, newName.find('_'));
		for (JD_ECU_INFO_t ecu : vehicleOrderInfo.vecListEcu) {
			if (ecu.strEcuName._Equal(newName)) {
				return ecu.nEcuId;
			}
		}
	}

	Tracer::error(__FUNCTION__, string("invalid ecuName: ") + ecuName);
	return 0;
}

int get_jd_orderInfo_vehicle_ccp(uint8_t* outBuffer, uint32_t outBufferSize)
{
	JD_VEHICLE_ORDER_t vehicleOrderInfo = DataCenter::getInstance()->m_VehicleOrderInfo;

	string tempString = vehicleOrderInfo.strCCPCode;
	int rLen = radix_hex2Array(tempString.c_str(), tempString.length(), outBuffer, outBufferSize);
	return rLen;
}

int get_jd_orderInfo_ebocCount()
{
	return DataCenter::getInstance()->m_vecEbocInfo.size();
}
int get_jd_orderInfo_eboc_byAttributeName(const char* attribute, char* outBuffer, uint32_t outBufferSize)
{
	memset(outBuffer, 0, outBufferSize);
	int total = DataCenter::getInstance()->m_vecEbocInfo.size();

	for (EbocInfo eInfo : DataCenter::getInstance()->m_vecEbocInfo)
	{
		if (eInfo.featureFamilyCname._Equal(attribute)) {
			string tempString = eInfo.featureCname;
			memcpy(outBuffer, tempString.c_str(), tempString.length());
			return tempString.length();
		}
	}

	return -1;

}
int get_jd_orderInfo_eboc_featureCode(int index, char* outBuffer, uint32_t outBufferSize)
{
	memset(outBuffer, 0, outBufferSize);
	int total = DataCenter::getInstance()->m_vecEbocInfo.size();
	if (index >= total) {
		Tracer::error("index", "index must less than: " + to_string(total));
		return -1;
	}
	string tempString = DataCenter::getInstance()->m_vecEbocInfo.at(index).featureCode;
	memcpy(outBuffer, tempString.c_str(), tempString.length());
	return tempString.length();
}
int get_jd_orderInfo_eboc_featureName(int index, char* outBuffer, uint32_t outBufferSize)
{
	memset(outBuffer, 0, outBufferSize);
	int total = DataCenter::getInstance()->m_vecEbocInfo.size();
	if (index >= total) {
		Tracer::error("index", "index must less than: " + to_string(total));
		return -1;
	}
	string tempString = DataCenter::getInstance()->m_vecEbocInfo.at(index).featureName;
	memcpy(outBuffer, tempString.c_str(), tempString.length());
	return tempString.length();
}
int get_jd_orderInfo_eboc_featureCname(int index, char* outBuffer, uint32_t outBufferSize)
{
	memset(outBuffer, 0, outBufferSize);
	int total = DataCenter::getInstance()->m_vecEbocInfo.size();
	if (index >= total) {
		Tracer::error("index", "index must less than: " + to_string(total));
		return -1;
	}
	string tempString = DataCenter::getInstance()->m_vecEbocInfo.at(index).featureCname;
	memcpy(outBuffer, tempString.c_str(), tempString.length());
	return tempString.length();
}
int get_jd_orderInfo_eboc_featureFamilyName(int index, char* outBuffer, uint32_t outBufferSize)
{
	memset(outBuffer, 0, outBufferSize);
	int total = DataCenter::getInstance()->m_vecEbocInfo.size();
	if (index >= total) {
		Tracer::error("index", "index must less than: " + to_string(total));
		return -1;
	}
	string tempString = DataCenter::getInstance()->m_vecEbocInfo.at(index).featureFamilyName;
	memcpy(outBuffer, tempString.c_str(), tempString.length());
	return tempString.length();
}
int get_jd_orderInfo_eboc_featureFamilyCname(int index, char* outBuffer, uint32_t outBufferSize)
{
	memset(outBuffer, 0, outBufferSize);
	int total = DataCenter::getInstance()->m_vecEbocInfo.size();
	if (index >= total) {
		Tracer::error("index", "index must less than: " + to_string(total));
		return -1;
	}
	string tempString = DataCenter::getInstance()->m_vecEbocInfo.at(index).featureFamilyCname;
	memcpy(outBuffer, tempString.c_str(), tempString.length());
	return tempString.length();
}
int get_jd_orderInfo_swpn(char* outBuffer, uint32_t outBufferSize)
{
	JD_VEHICLE_ORDER_t vehicleOrderInfo = DataCenter::getInstance()->m_VehicleOrderInfo;

	memset(outBuffer, 0, outBufferSize);
	string tempString = vehicleOrderInfo.strSwpn;
	memcpy(outBuffer, tempString.c_str(), tempString.length());
	return (int)tempString.length();
}

int get_jd_orderInfo_vehicleType(char* outBuffer, uint32_t outBufferSize)
{
	JD_VEHICLE_ORDER_t vehicleOrderInfo = DataCenter::getInstance()->m_VehicleOrderInfo;

	memset(outBuffer, 0, outBufferSize);

	string tempString = vehicleOrderInfo.strVehicleType;
	memcpy(outBuffer, tempString.c_str(), tempString.length());
	return (int)tempString.length();
}
int get_jd_orderInfo_baseLine(char* outBuffer, uint32_t outBufferSize)
{
	JD_VEHICLE_ORDER_t vehicleOrderInfo = DataCenter::getInstance()->m_VehicleOrderInfo;

	string tempString = vehicleOrderInfo.strBaseLine;
	memcpy(outBuffer, tempString.c_str(), tempString.length());
	return (int)tempString.length();
}
int get_jd_orderInfo_displayVersion(char* outBuffer, uint32_t outBufferSize)
{
	JD_VEHICLE_ORDER_t vehicleOrderInfo = DataCenter::getInstance()->m_VehicleOrderInfo;

	string tempString = vehicleOrderInfo.strDisplayVersion;
	memcpy(outBuffer, tempString.c_str(), tempString.length());
	return (int)tempString.length();
}
int get_jd_orderInfo_eboc(char* outBuffer, uint32_t outBufferSize)
{
	JD_VEHICLE_ORDER_t vehicleOrderInfo = DataCenter::getInstance()->m_VehicleOrderInfo;

	string tempString = vehicleOrderInfo.strEBOC;
	memcpy(outBuffer, tempString.c_str(), tempString.length());
	return (int)tempString.length();
}
int get_jd_orderInfo_mixNo(char* outBuffer, uint32_t outBufferSize)
{
	JD_VEHICLE_ORDER_t vehicleOrderInfo = DataCenter::getInstance()->m_VehicleOrderInfo;

	string tempString = vehicleOrderInfo.strMixNo;
	memcpy(outBuffer, tempString.c_str(), tempString.length());
	return (int)tempString.length();
}
int get_jd_orderInfo_ecuHwpn_byEcuName(const char* ecuName, char* outBuffer, uint32_t outBufferSize)
{
	JD_VEHICLE_ORDER_t vehicleOrderInfo = DataCenter::getInstance()->m_VehicleOrderInfo;

	memset(outBuffer, 0, outBufferSize);
	vector<JD_ECU_INFO_t> vecListEcu = vehicleOrderInfo.vecListEcu;

	if (vecListEcu.size() == 0) {
		string tempString = "-/-";
		memcpy(outBuffer, tempString.c_str(), tempString.length());
		return (int)tempString.length();
	}
	else {
		for (int i = 0; i < vecListEcu.size(); i++) {
			if (strcmp(vecListEcu.at(i).strEcuName.c_str(), ecuName) == 0) {
				string tempString = vecListEcu.at(i).strEcuHwpn;
				memcpy(outBuffer, tempString.c_str(), tempString.length());
				return (int)tempString.length();
			}
		}
	}

	return -1;
}
int get_jd_orderInfo_ecuSwpn_byEcuName(const char* ecuName, char* outBuffer, uint32_t outBufferSize)
{
	JD_VEHICLE_ORDER_t vehicleOrderInfo = DataCenter::getInstance()->m_VehicleOrderInfo;

	memset(outBuffer, 0, outBufferSize);
	vector<JD_ECU_INFO_t> vecListEcu = vehicleOrderInfo.vecListEcu;

	if (vecListEcu.size() == 0) {
		string tempString = "-/-";
		memcpy(outBuffer, tempString.c_str(), tempString.length());
		return (int)tempString.length();
	}
	else {
		for (int index = 0; index < vecListEcu.size(); index++) {
			if (strcmp(vecListEcu.at(index).strEcuName.c_str(), ecuName) == 0) {
				vector<JD_ECU_SWPN_INFO_t> ecuSwpnInfoList = vehicleOrderInfo.vecListEcu.at(index).vecEcuSwpnList;
				string tempString = "-/-";
				if (ecuSwpnInfoList.size() != 0) {

					for (int i = 0; i < ecuSwpnInfoList.size(); i++) {
						if (i != 0)
						{
							tempString.append("\t");
						}
						tempString.append(ecuSwpnInfoList.at(i).strEcuSwpn);
					}
				}

				memcpy(outBuffer, tempString.c_str(), tempString.length());
				return (int)tempString.length();
			}
		}
	}

	return -1;
}
int get_jd_orderInfo_ecuCount()
{
	JD_VEHICLE_ORDER_t vehicleOrderInfo = DataCenter::getInstance()->m_VehicleOrderInfo;

	//TODO ÅÅÐò Óò¿Ø·ÅÔÚÇ°Ãæ
	std::vector<std::string> domainEcuNames = { "TCAM", "BGM", "CDC", "ACU" };
	vector<JD_ECU_INFO_t> vecNew;
	for (JD_ECU_INFO_t ecuInfo : vehicleOrderInfo.vecListEcu) {
		if (std::find(domainEcuNames.begin(), domainEcuNames.end(), ecuInfo.strEcuName) != domainEcuNames.end()) {
			vecNew.push_back(ecuInfo);
		}
	}
	for (JD_ECU_INFO_t ecuInfo : vehicleOrderInfo.vecListEcu) {
		if (std::find(domainEcuNames.begin(), domainEcuNames.end(), ecuInfo.strEcuName) != domainEcuNames.end()) {
			continue;
		}
		vecNew.push_back(ecuInfo);
	}
	DataCenter::getInstance()->m_VehicleOrderInfo.vecListEcu = vecNew;

	return vehicleOrderInfo.vecListEcu.size();
}

int get_jd_orderInfo_ecuName(int index, char* outBuffer, uint32_t outBufferSize)
{
	JD_VEHICLE_ORDER_t vehicleOrderInfo = DataCenter::getInstance()->m_VehicleOrderInfo;

	memset(outBuffer, 0, outBufferSize);
	int total = vehicleOrderInfo.vecListEcu.size();
	if (index >= total) {
		Tracer::error("index", "index must less than: " + to_string(total));
		return -1;
	}

	string tempString = vehicleOrderInfo.vecListEcu.at(index).strEcuName;
	memcpy(outBuffer, tempString.c_str(), tempString.length());
	return (int)tempString.length();
}
int get_jd_orderInfo_ecuSwpn(int index, char* outBuffer, uint32_t outBufferSize)
{
	JD_VEHICLE_ORDER_t vehicleOrderInfo = DataCenter::getInstance()->m_VehicleOrderInfo;

	memset(outBuffer, 0, outBufferSize);
	int total = vehicleOrderInfo.vecListEcu.size();
	if (index >= total) {
		Tracer::error("index", "index must less than: " + to_string(total));
		return -1;
	}

	string tempString;
	vector<JD_ECU_SWPN_INFO_t> ecuSwpnInfoList = vehicleOrderInfo.vecListEcu.at(index).vecEcuSwpnList;

	if (ecuSwpnInfoList.size() == 0) {
		tempString = "-/-";
	}
	else {
		for (int i = 0; i < ecuSwpnInfoList.size(); i++) {
			if (i != 0)
			{
				tempString.append("\t");
			}
			tempString.append(ecuSwpnInfoList.at(i).strEcuSwpn);
		}
	}

	memcpy(outBuffer, tempString.c_str(), tempString.length());
	return (int)tempString.length();
}

int get_jd_orderInfo_ecuHwpn(int index, char* outBuffer, uint32_t outBufferSize)
{
	JD_VEHICLE_ORDER_t vehicleOrderInfo = DataCenter::getInstance()->m_VehicleOrderInfo;

	memset(outBuffer, 0, outBufferSize);
	int total = vehicleOrderInfo.vecListEcu.size();
	if (index >= total) {
		Tracer::error("index", "index must less than: " + to_string(total));
		return -1;
	}

	string tempString = vehicleOrderInfo.vecListEcu.at(index).strEcuHwpn;
	memcpy(outBuffer, tempString.c_str(), tempString.length());
	return (int)tempString.length();
}

int get_jd_orderInfo_vehicleEnvironment()
{
	return 	DataCenter::m_VehicleOrderInfo.iVehicleEnvironment;
}

int get_jd_orderInfo_ecuId(int index)
{
	JD_VEHICLE_ORDER_t vehicleOrderInfo = DataCenter::getInstance()->m_VehicleOrderInfo;
	int total = vehicleOrderInfo.vecListEcu.size();
	if (index >= total) {
		Tracer::error("index", "index must less than: " + to_string(total));
		return -1;
	}

	return vehicleOrderInfo.vecListEcu.at(index).nEcuId;
}


int get_jd_orderInfo_ecuSn_byEcuId(int ecuId, char* outBuffer, uint32_t outBufferSize)
{
	JD_VEHICLE_ORDER_t vehicleOrderInfo = DataCenter::getInstance()->m_VehicleOrderInfo;

	memset(outBuffer, 0, outBufferSize);
	int total = vehicleOrderInfo.vecListEcu.size();
	for (JD_ECU_INFO_t ecuInfo : vehicleOrderInfo.vecListEcu) {
		if (ecuId == ecuInfo.nEcuId) {
			string tempString = ecuInfo.strEcuDn;
			memcpy(outBuffer, tempString.c_str(), tempString.length());
			return (int)tempString.length();
		}
	}

	return -1;
}

int get_jd_orderInfo_ecuName_byEcuId(int ecuId, char* outBuffer, uint32_t outBufferSize)
{
	JD_VEHICLE_ORDER_t vehicleOrderInfo = DataCenter::getInstance()->m_VehicleOrderInfo;

	memset(outBuffer, 0, outBufferSize);
	int total = vehicleOrderInfo.vecListEcu.size();
	for (JD_ECU_INFO_t ecuInfo : vehicleOrderInfo.vecListEcu) {
		if (ecuId == ecuInfo.nEcuId) {
			string tempString = ecuInfo.strEcuName;
			memcpy(outBuffer, tempString.c_str(), tempString.length());
			return (int)tempString.length();
		}
	}

	return -1;
}

int get_jd_orderInfo_ecuSwpn_byEcuId(int ecuId, char* outBuffer, uint32_t outBufferSize)
{
	JD_VEHICLE_ORDER_t vehicleOrderInfo = DataCenter::getInstance()->m_VehicleOrderInfo;

	memset(outBuffer, 0, outBufferSize);
	int total = vehicleOrderInfo.vecListEcu.size();
	for (JD_ECU_INFO_t ecuInfo : vehicleOrderInfo.vecListEcu) {
		if (ecuId == ecuInfo.nEcuId) {
			string tempString;
			vector<JD_ECU_SWPN_INFO_t> ecuSwpnInfoList = ecuInfo.vecEcuSwpnList;
			if (ecuSwpnInfoList.size() == 0) {
				tempString = "-/-";
			}
			else {
				for (int i = 0; i < ecuSwpnInfoList.size(); i++) {
					if (i != 0)
					{
						tempString.append("\t");
					}
					tempString.append(ecuSwpnInfoList.at(i).strEcuSwpn);
				}
			}

			memcpy(outBuffer, tempString.c_str(), tempString.length());
			return (int)tempString.length();
		}
	}

	return -1;
}

int get_jd_orderInfo_ecuHwpn_byEcuId(int ecuId, char* outBuffer, uint32_t outBufferSize)
{
	JD_VEHICLE_ORDER_t vehicleOrderInfo = DataCenter::getInstance()->m_VehicleOrderInfo;

	memset(outBuffer, 0, outBufferSize);
	int total = vehicleOrderInfo.vecListEcu.size();
	for (JD_ECU_INFO_t ecuInfo : vehicleOrderInfo.vecListEcu) {
		if (ecuId == ecuInfo.nEcuId) {
			string tempString = ecuInfo.strEcuHwpn;
			memcpy(outBuffer, tempString.c_str(), tempString.length());
			return (int)tempString.length();
		}
	}

	return -1;
}

uint64_t get_jd_orderInfo_ecuFlashFileSize(int index, char* outBuffer, uint32_t outBufferSize)
{
	JD_VEHICLE_ORDER_t vehicleOrderInfo = DataCenter::getInstance()->m_VehicleOrderInfo;

	memset(outBuffer, 0, outBufferSize);
	int total = vehicleOrderInfo.vecListEcu.size();
	if (index >= total) {
		Tracer::error("index", "index must less than: " + to_string(total));
		return -1;
	}

	string ecuName = vehicleOrderInfo.vecListEcu.at(index).strEcuName;
	int ecuId = vehicleOrderInfo.vecListEcu.at(index).nEcuId;
	vector<JD_ECU_SWPN_INFO_t> ecuSwpnInfoList = vehicleOrderInfo.vecListEcu.at(index).vecEcuSwpnList;
	string ecuHwpn = vehicleOrderInfo.vecListEcu.at(index).strEcuHwpn;

	uint64_t totalSize = 0;
	for (int i = 0; i < ecuSwpnInfoList.size(); i++) {
		string ecuSwpn = ecuSwpnInfoList.at(i).strEcuSwpn;

		uint64_t fileSize = CVehicleConfig::getInstance()->GetFlashFileSize(ecuId, ecuName, ecuHwpn, ecuSwpn);
		totalSize += fileSize;
	}

	Tracer::warn("totalSize", to_string(totalSize));

	if (totalSize == 0)
	{
		sprintf(outBuffer, "---");
	}
	else if (totalSize / 1024 == 0)
	{
		float nValue = totalSize;
		sprintf(outBuffer, "%.2f bytes", nValue);
	}
	else if ((totalSize / 1024) / 1024 == 0)
	{
		float nValue = totalSize / ((float)1024.00);
		sprintf(outBuffer, "%.2f K", nValue);
	}
	else
	{
		float nValue = (totalSize / ((float)1024.00)) / ((float)1024.00);
		sprintf(outBuffer, "%.2f M", nValue);
	}

	return totalSize;
}

uint64_t get_jd_orderInfo_ecuFlashFileSize_byEcuName(const char* ecuName, char* outBuffer, uint32_t outBufferSize)
{
	JD_VEHICLE_ORDER_t vehicleOrderInfo = DataCenter::getInstance()->m_VehicleOrderInfo;

	memset(outBuffer, 0, outBufferSize);

	uint64_t totalSize = 0;
	for (JD_ECU_INFO_t ecuInfo : vehicleOrderInfo.vecListEcu) {
		if (ecuInfo.strEcuName._Equal(ecuName)) {

			int ecuId = ecuInfo.nEcuId;
			vector<JD_ECU_SWPN_INFO_t> ecuSwpnInfoList = ecuInfo.vecEcuSwpnList;
			string ecuHwpn = ecuInfo.strEcuHwpn;

			for (int i = 0; i < ecuSwpnInfoList.size(); i++) {
				string ecuSwpn = ecuSwpnInfoList.at(i).strEcuSwpn;

				uint64_t fileSize = CVehicleConfig::getInstance()->GetFlashFileSize(ecuId, ecuName, ecuHwpn, ecuSwpn);
				totalSize += fileSize;
			}

			Tracer::warn("totalSize", to_string(totalSize));

			if (totalSize == 0)
			{
				sprintf(outBuffer, "---");
			}
			else if (totalSize / 1024 == 0)
			{
				float nValue = totalSize;
				sprintf(outBuffer, "%.2f bytes", nValue);
			}
			else if ((totalSize / 1024) / 1024 == 0)
			{
				float nValue = totalSize / ((float)1024.00);
				sprintf(outBuffer, "%.2f K", nValue);
			}
			else
			{
				float nValue = (totalSize / ((float)1024.00)) / ((float)1024.00);
				sprintf(outBuffer, "%.2f M", nValue);
			}
		}
	}

	return totalSize;
}

int get_jd_certInfo_ecuCa(uint8_t* outBuffer, uint32_t outBufferSize)
{
	std::lock_guard<std::mutex> lock(mItemLock);

	string tempString = DataCenter::m_EcuCertInfo.cls_strEcuCa;
	if (tempString.empty()) { return -1; }
	int rLen = base64_decode(tempString.c_str(), (int)tempString.size(), outBuffer, outBufferSize);
	Tracer::hex("certInfo_ca", outBuffer, rLen);
	return rLen;
}

int get_jd_certInfo_vid(uint8_t* outBuffer, uint32_t outBufferSize)
{
	std::lock_guard<std::mutex> lock(mItemLock);

	string tempString = DataCenter::m_EcuCertInfo.cls_strVid;
	if (tempString.empty()) { return -1; }
	int rLen = radix_hex2Array(tempString.c_str(), tempString.size(), outBuffer, outBufferSize);

	Tracer::hex("certInfo_vid", outBuffer, rLen);
	return rLen;
}

int get_jd_certInfo_dvcKey_byEcuName(const char* ecuName, uint8_t* outBuffer, uint32_t outBufferSize)
{
	std::lock_guard<std::mutex> lock(mItemLock);

	string newName = ecuName;
	if (newName.find("_") != string::npos) {
		newName = newName.substr(0, 3);
	}

	JD_EcuCertItem_t ecuCertItem = DataCenter::m_EcuCertInfo.ecuCertInfo[newName];
	string tempString = ecuCertItem.cls_strDvcKey;
	if (tempString.empty()) { return -1; }
	int rLen = base64_decode(tempString.c_str(), (int)tempString.size(), outBuffer, outBufferSize);
	Tracer::hex(string("certInfo_dvcKey") + newName, outBuffer, rLen);
	return rLen;
}

int get_jd_certInfo_p12_byEcuName(const char* ecuName, uint8_t* outBuffer, uint32_t outBufferSize)
{
	std::lock_guard<std::mutex> lock(mItemLock);

	string newName = ecuName;
	if (newName.find("_") != string::npos) {
		newName = newName.substr(0, 3);
	}

	JD_EcuCertItem_t ecuCertItem = DataCenter::m_EcuCertInfo.ecuCertInfo[newName];
	if (sizeof(ecuCertItem) == 0) {
		Tracer::error("no ecu certInfo", newName);
		return -1;
	}
	string tempString = ecuCertItem.cls_strP12;
	if (tempString.empty()) {
		Tracer::error("invalid ecu cert", newName);
		return -1;
	}
	int rLen = base64_decode(tempString.c_str(), (int)tempString.size(), outBuffer, outBufferSize);
	Tracer::hex(string("certInfo_p12") + newName, outBuffer, rLen);
	return rLen;
}

int get_jd_certInfo_p12Key_byEcuName(const char* ecuName, uint8_t* outBuffer, uint32_t outBufferSize)
{
	std::lock_guard<std::mutex> lock(mItemLock);

	string newName = ecuName;
	if (newName.find("_") != string::npos) {
		newName = newName.substr(0, 3);
	}

	JD_EcuCertItem_t ecuCertItem = DataCenter::m_EcuCertInfo.ecuCertInfo[newName];
	if (sizeof(ecuCertItem) == 0) {
		Tracer::error("no ecu certInfo", newName);
		return -1;
	}
	string tempString = ecuCertItem.cls_strP12Key;
	if (tempString.empty()) {
		Tracer::error("invalid ecu cert", newName);
		return -1;
	}
	int rLen = base64_decode(tempString.c_str(), (int)tempString.size(), outBuffer, outBufferSize);
	Tracer::hex(string("certInfo_p12Key[") + newName + "]", outBuffer, rLen);
	return rLen;
}

int get_jd_certInfo_aesKey_byEcuName(const char* ecuName, uint8_t* outBuffer, uint32_t outBufferSize)
{
	std::lock_guard<std::mutex> lock(mItemLock);

	string newName = ecuName;
	if (newName.find("_") != string::npos) {
		newName = newName.substr(0, 3);
	}

	JD_EcuCertItem_t ecuCertItem = DataCenter::m_EcuCertInfo.ecuCertInfo[newName];
	if (sizeof(ecuCertItem) == 0) {
		Tracer::error("no ecu certInfo", newName);
		return -1;
	}
	string tempString = ecuCertItem.cls_strAESKey;
	if (tempString.empty()) { return -1; }
	int rLen = base64_decode(tempString.c_str(), (int)tempString.size(), outBuffer, outBufferSize);
	Tracer::hex(string("certInfo_aesKey") + newName, outBuffer, rLen);
	return rLen;
}

int get_jd_certInfo_soaKey_byEcuName(const char* ecuName, uint8_t* outBuffer, uint32_t outBufferSize)
{
	std::lock_guard<std::mutex> lock(mItemLock);

	string newName = ecuName;
	if (newName.find("_") != string::npos) {
		newName = newName.substr(0, 3);
	}

	JD_EcuCertItem_t ecuCertItem = DataCenter::m_EcuCertInfo.ecuCertInfo[newName];
	if (sizeof(ecuCertItem) == 0) {
		Tracer::error("no ecu certInfo", newName);
		return -1;
	}
	string tempString = ecuCertItem.cls_strSOAKey;
	if (tempString.empty()) { return -1; }
	int rLen = base64_decode(tempString.c_str(), (int)tempString.size(), outBuffer, outBufferSize);
	Tracer::hex(string("certInfo_soaKey") + newName, outBuffer, rLen);
	return rLen;
}

int get_jd_otaCert_ca(uint8_t* outBuffer, uint32_t outBufferSize)
{
	std::lock_guard<std::mutex> lock(mItemLock);

	string tempString = DataCenter::m_OtaCert.caCert;
	if (tempString.empty()) { return -1; }
	int rLen = base64_decode(tempString.c_str(), (int)tempString.size(), outBuffer, outBufferSize);
	Tracer::hex("ota_CA_Cert", outBuffer, rLen);
	return rLen;
}

int get_jd_otaCert_client(uint8_t* outBuffer, uint32_t outBufferSize)
{
	std::lock_guard<std::mutex> lock(mItemLock);

	string tempString = DataCenter::m_OtaCert.clientCert;
	if (tempString.empty()) { return -1; }
	int rLen = base64_decode(tempString.c_str(), (int)tempString.size(), outBuffer, outBufferSize);
	Tracer::hex("ota_client_Cert", outBuffer, rLen);
	return rLen;
}