﻿#include "jidu_dataCenter.h"
#include "algorithm.h"
#include "MyStringUtils.h"
#include "tracer.h"

DataCenter* DataCenter::instance;
JD_VEHICLE_ORDER_t DataCenter::m_VehicleOrderInfo;
JD_EOL_KEY_t DataCenter::m_EolKey;
JD_OTA_CERT_t DataCenter::m_OtaCert;
map<string, string>DataCenter::m_aesKey;
JD_SummaryData_t DataCenter::m_summaryData;
JD_EcuCertInfo_t DataCenter::m_EcuCertInfo;
string DataCenter::m_deviceSN;
map<string, JD_EcuStatusInfo_t> DataCenter::m_EcuStatus;
VehicleInfo DataCenter::m_vehicleInfo;
JD_ECU_DIAGNOSTIC_INFO_t DataCenter::m_EcuBncmCloudInfo;
vector<JD_ECU_DIAGNOSTIC_INFO_t> DataCenter::m_vecEcuDiagnosticInfo;
map<string, vector<JIDU_DTC_INFO_t>> DataCenter::m_mapDtcDatabase;
map<int, CallServerRecord> DataCenter::m_callServerRecord;
std::vector<EbocInfo> DataCenter::m_vecEbocInfo;
string DataCenter::errMsg;
string DataCenter::factory;
string DataCenter::language = "zh-CN";
DataCenter::DataCenter()
{

}

void DataCenter::reset()
{
	m_vehicleInfo.mapEcuInfo.clear();
	m_vehicleInfo.vecEcuName.clear();
	m_vehicleInfo.vecEcuNameOrderByInitial.clear();
}

bool DataCenter::setEcuSafetyConstant(string ecuName, JD_ECU_SAFETY_CONSTANT_t safetyConstant)
{
	this->m_EcuSafetyConstant[ecuName] = safetyConstant;
	return false;
}

bool DataCenter::getEcuSafetyConstant(string ecuName, JD_ECU_SAFETY_CONSTANT_t& safetyConstant)
{
	if (this->m_EcuSafetyConstant.end() == this->m_EcuSafetyConstant.find(ecuName)) {

		if (MyStringUtils::startWith(ecuName, "IEM")) {
			ecuName = "IEM";
		}
		else if (MyStringUtils::startWith(ecuName, "BECM")) {
			ecuName = "BECM1";
		}
		else if (MyStringUtils::startWith(ecuName, "WPC") && !ecuName._Equal("WPC3")) {
			ecuName = "WPC";
		}
		else if (MyStringUtils::startWith(ecuName, "RCML")) {
			ecuName = "RCML";
		}
		else if (MyStringUtils::startWith(ecuName, "RCMR")) {
			ecuName = "RCMR";
		}
		else if (MyStringUtils::startWith(ecuName, "RCMM")) {
			ecuName = "RCMM";
		}
		else if (MyStringUtils::startWith(ecuName, "MGM")) {
			ecuName = "MGM";
		}
		else if (MyStringUtils::endWith(ecuName, "_400V") || MyStringUtils::endWith(ecuName, "_800V")) {
			ecuName = ecuName.substr(0, ecuName.find_last_of("_"));
		}
	}

	if (this->m_EcuSafetyConstant.end() != this->m_EcuSafetyConstant.find(ecuName)) {
		safetyConstant = this->m_EcuSafetyConstant.at(ecuName);
		return true;
	}

	return false;
}
/*
标续版(单电机 & 75kWh)
长续版(单电机 & 102kWh)
性能版(双电机 & 102kWh)
*/
bool DataCenter::getCarConfig(CBinary ccp, VehicleCfg& cfg)
{
	if (ccp.GetSize() > 1500)
	{
		//电机类型根据CCP#3=0x81→单电机、CCP#3=0x80→双电机；
		//CCP#566=0x10=246Ah/100.8kWh→102°电池、CCP#566=0x17=196Ah/75kw→75°电池
		if (ccp.GetAt(2) == 0x81 && ccp.GetAt(565) == 0x17) {
			cfg.iBatteryCapacity = 75;
			cfg.strMotor = "标续版(单电机 & 75kWh)";
		}
		else if (ccp.GetAt(2) == 0x81 && ccp.GetAt(565) == 0x10) {
			cfg.iBatteryCapacity = 102;
			cfg.strMotor = "长续版(单电机 & 102kWh)";
		}
		else if (ccp.GetAt(2) == 0x80 && ccp.GetAt(565) == 0x10) {
			cfg.iBatteryCapacity = 102;
			cfg.strMotor = "性能版(双电机 & 102kWh)";
		}
		else {
			cfg.iBatteryCapacity = 98;
			cfg.strMotor = "性能版(双电机 & 102kWh)";
		}

		//TODO //CCP#564 等于01是低配（无主动尾翼；等于02是高配（有尾翼）
		cfg.iEmpennage = ccp.GetAt(563);

		//TODO //CCP#450
		switch (ccp.GetAt(449))
		{
		case 1:
			cfg.strWpcConfig = "without NFC & without WPC";
			cfg.strWpcEcuName = "WPC";
			break;
		case 2:
			cfg.strWpcConfig = "with only NFC";
			cfg.strWpcEcuName = "WPC";
			break;
		case 3:
			cfg.strWpcConfig = "without only WPC";
			cfg.strWpcEcuName = "WPC";
			break;
		case 4:
			cfg.strWpcConfig = "with NFC & WPC";
			cfg.strWpcEcuName = "WPC";
			break;
		case 5:
			cfg.strWpcConfig = "with NFC & 2WPC";
			cfg.strWpcEcuName = "WPC2";
			break;
		default:
			cfg.strWpcEcuName = "WPC";
			break;
		}

		//TODO //CCP#962 获取高压平台电压(0:400V 02:800V)
		cfg.iPlatformVoltage = ccp.GetAt(961);

		cfg.strIemEcuName = "IEM_IGBT";
		for (JD_ECU_INFO_t ecuInfo : DataCenter::m_VehicleOrderInfo.vecListEcu) {
			if (MyStringUtils::startWith(ecuInfo.strEcuName, "IEM")) {
				if (ecuInfo.nEcuId == 0x5071) {
					cfg.strIemEcuName = "IEM_IGBT";
				}
				else if (ecuInfo.nEcuId == 0x5072) {
					cfg.strIemEcuName = "IEM_SIC";
				}
				else {
					cfg.strIemEcuName = "IEM2";
				}
				break;
			}
		}

		return true;
	}

	Tracer::error(__FUNCTION__, "invalid ccp");
	return false;
}

/*
标续版(单电机 & 75kWh)
长续版(单电机 & 102kWh)
性能版(双电机 & 102kWh)
*/
int DataCenter::getCarConfig(CBinary ccp)
{
	if (ccp.GetSize() > 1500)
	{
		//电机类型根据CCP#3=0x81→单电机、CCP#3=0x80→双电机；
		//CCP#566=0x10=246Ah/100.8kWh→102°电池、CCP#566=0x17=196Ah/75kw→75°电池
		if (ccp.GetAt(2) == 0x81 && ccp.GetAt(565) == 0x17) {
			return 75;
		}
		else if (ccp.GetAt(2) == 0x81 && ccp.GetAt(565) == 0x10) {
			return 102;
		}
		else if (ccp.GetAt(2) == 0x80 && ccp.GetAt(565) == 0x10) {
			return 102;
		}
		else if (ccp.GetAt(2) == 0x81 && ccp.GetAt(565) == 0x18) {
			return 76;
		}
		else if (ccp.GetAt(2) == 0x81 && ccp.GetAt(565) == 0x19) {
			return 98;
		}
		else if (ccp.GetAt(2) == 0x80 && ccp.GetAt(565) == 0x19) {
			return 98;
		}
	}

	return -1;
}

int DataCenter::getCarConfig(string ccp)
{
	uint8_t tempBuffer[4096];
	int rLen = radix_hex2Array(ccp.c_str(), ccp.length(), tempBuffer, 4096);
	CBinary binCCP(tempBuffer, rLen);

	return getCarConfig(CBinary(tempBuffer, rLen));
}

