#include "mqtt_report/fault_codes.h"

ErrorCodeSet vehicle_error_code; // 整车错误码

// 根据错误码列表，生成错误上报json
std::string generateFaultJson(int code, const std::string &vin, int64_t timestamp)
{
    auto it = faultMap.find(code);
    if (it == faultMap.end())
    {
        throw std::runtime_error("错误码不存在");
    }

    const FaultInfo &info = it->second;

    ordered_json j;
    j["vin"] = vin;
    j["deviceName"] = info.subsystem;
    j["code"] = code;
    j["msg"] = info.error_name;
    j["level"] = info.level;
    j["timestamp"] = timestamp;

    return j.dump(4);
}

// 修改map里错误码对应的错误等级
bool updateFaultLevel(int code, int newLevel)
{
    auto it = faultMap.find(code);
    if (it == faultMap.end())
    {
        return false;
    }

    it->second.level = newLevel;
    return true;
}

const uint8_t mcuErrorCode[25] = {1, 2, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 30, 31, 32, 33, 34};

const uint8_t epsErrorCode[18] = {0x10, 0x14, 0x12, 0x21, 0x22, 0x23, 0x24, 0x25, 0x32, 0x33, 0x35, 0x37, 0x43, 0x46, 0x51, 0x55, 0x61, 0x62};

std::unordered_map<int, FaultInfo> faultMap = {
    {1001, {"BMS", "BMS_TEMP_HIGH_ERR", "温度过高", 0}},
    {1002, {"BMS", "BMS_TEMP_LOW_ERR", "温度过低", 0}},
    {1003, {"BMS", "BMS_TEMP_DIFF_BIG_ERR", "温度差过大", 0}},
    {1004, {"BMS", "BMS_VOL_HIGH_ERR", "单体电压过高", 0}},
    {1005, {"BMS", "BMS_VOL_LOW_ERR", "单体电压过低", 0}},
    {1006, {"BMS", "BMS_VOL_DIFF_OVER_ERR", "电梯压差过大", 0}},
    {1007, {"BMS", "BMS_CHA_CURR_OVER_ERR", "充电电流过大", 0}},
    {1008, {"BMS", "BMS_DISCHA_CURR_OVER_ERR", "放电电流过大", 0}},
    {1009, {"BMS", "BMS_ISOLATION_ERR", "绝缘异常", 0}},
    {1010, {"BMS", "BMS_CHA_POW_OVER_ERR", "充电功率过大", 0}},
    {1011, {"BMS", "BMS_DISCHA_POW_OVER_ERR", "放电功率过大", 0}},
    {1012, {"BMS", "BMS_SOC_LOW_ERR", "电池容量低", 0}},
    {1013, {"BMS", "BMS_CONT_ADHENSION_ERR", "主接触器粘连", 0}},
    {1014, {"BMS", "BMS_CONT_INVALID_ERR", "主接触器失效", 0}},
    {1015, {"BMS", "BMS_PRECHA_ERR", "预充电失败", 0}},
    {1016, {"BMS", "BMS_INTER_COM_ERR", "内部通信故障", 0}},
    {1017, {"BMS", "BMS_EXTER_COM_ERR", "外部通信故障", 0}},
    {1018, {"BMS", "BMS_DISCHA_VOL_LOW_ERR", "放电12V系统电压低", 0}},
    {1019, {"BMS", "BMS_CHA_VOL_LOW_ERR", "充电12V系统电压低", 0}},
    {1020, {"BMS", "BMS_HIGH_LEVEL_ERR", "最高故障等级", 0}},
    {1021, {"BMS", "BMS_CHA_TEMP_LOW_ERR", "充电温度过低", 0}},
    {1022, {"BMS", "BMS_WIRES_ERR", "采集线束故障", 0}},
    {1023, {"BMS", "BMS_TEMP_SENSOR_ERR", "温度检测故障", 0}},
    {1024, {"BMS", "BMS_CAP_WARN_INFO_ERR", "容量预警信息", 0}},
    {1025, {"BMS", "BMS_INTER_TEMP_ERR", "内部温度故障", 0}},
    {1026, {"BMS", "BMS_HEATING_MOD_ERR", "加热模块故障", 0}},
    {1027, {"BMS", "BMS_CHAR_STATUS_ERR", "充电枪状态", 0}},
    {1028, {"BMS", "BMS_HALL_ZERO_ERR", "霍尔零点故障", 0}},

    {1101, {"MCU", "MCU_EEPROM_ERR", "EEPROM故障", 0}},
    {1102, {"MCU", "MCU_PARAM_ERR", "参数故障", 0}},
    {1103, {"MCU", "MCU_WALKING_OVER_CURR_ERR", "行走过流故障", 0}},
    {1104, {"MCU", "MCU_PRECHG_TIMEOUT_ERR", "预充超时", 0}},
    {1105, {"MCU", "MCU_CAP_SHORT_CIRCUIT_ERR", "电容组短路", 0}},
    {1106, {"MCU", "MCU_OVER_VOL_ERR", "过压关断", 0}},
    {1107, {"MCU", "MCU_UNDER_VOL_ERR", "欠压关断", 0}},
    {1108, {"MCU", "MCU_MAIN_CONT_PULL_IN_ERR", "主接触器吸合故障", 0}},
    {1109, {"MCU", "MCU_MAIN_CONT_STICKING_ERR", "主接触器粘连", 0}},
    {1110, {"MCU", "MCU_MOTOR_OVER_TEMP_ERR", "电机过温关断", 0}},
    {1111, {"MCU", "MCU_CTRL_OVER_TEMP_ERR", "控制器过温关断", 0}},
    {1112, {"MCU", "MCU_MOTOR_TEMP_SENSOR_ERR", "电机温度传感器故障", 0}},
    {1113, {"MCU", "MCU_MOTOR_ENCODER_ERR", "电机编码器故障", 0}},
    {1114, {"MCU", "MCU_WALKING_HPD_ERR", "行走HPD", 0}},
    {1115, {"MCU", "MCU_DIRECTION_HPD_ERR", "方向HPD", 0}},
    {1116, {"MCU", "MCU_DRIVE2_ERR", "驱动2故障", 0}},
    {1117, {"MCU", "MCU_DRIVE1_ERR", "驱动1故障", 0}},
    {1118, {"MCU", "MCU_CURR_SENSOR_ERR", "电流传感器故障", 0}},
    {1119, {"MCU", "MCU_MOS_ERR", "MOS故障", 0}},
    {1120, {"MCU", "MCU_OVER_SPEED_ERR", "超速故障", 0}},
    {1121, {"MCU", "MCU_CAN_COMM_ERR", "CAN通讯故障", 0}},
    {1122, {"MCU", "MCU_OVER_VOL_ERR", "过压", 0}},
    {1123, {"MCU", "MCU_UNDER_VOL_ERR", "欠压", 0}},
    {1124, {"MCU", "MCU_CONT_OVER_TEMP_ERR", "控制器过温", 0}},
    {1125, {"MCU", "MCU_MOTOR_OVER_TEMP_ERR", "电机过温", 0}},

    {1201, {"EPS", "EPS_NO_EXTER_OSC_ERR", "没有外部晶振", 0}},
    {1202, {"EPS", "EPS_EEPROM_ERR", "EEPROM读写故障", 0}},
    {1203, {"EPS", "EPS_MISS_STEERING_ANGLE_ERR", "未写入方向盘角度中点", 0}},
    {1204, {"EPS", "EPS_MAIN_TORQUE_BREAK_ERR", "主力矩传感器断开", 0}},
    {1205, {"EPS", "EPS_MAIN_TORQUE_OUTPUT_ERR", "主力矩传感器输出异常", 0}},
    {1206, {"EPS", "EPS_SUB_TORQUE_BREAK_ERR", "副力矩传感器断开", 0}},
    {1207, {"EPS", "EPS_SUB_TORQUE_OUTPUT_ERR", "副力矩传感器输出异常", 0}},
    {1208, {"EPS", "EPS_MS_TORQUE_DIFF_OVER_ERR", "主副力矩差异过大", 0}},
    {1209, {"EPS", "EPS_MOTOR_NO_ASSIST_ERR", "电机无助力(Q轴无反馈)", 0}},
    {1210, {"EPS", "EPS_OVER_CURR_ERR", "过电流", 0}},
    {1211, {"EPS", "EPS_MOTOR_CURR_ERR", "电机电流异常", 0}},
    {1212, {"EPS", "EPS_BUS_CURR_ERR", "母线电流异常", 0}},
    {1213, {"EPS", "EPS_MOTOR_VOL_ERR", "电机端电压异常", 0}},
    {1214, {"EPS", "EPS_THERMAL_ERR", "热保护", 0}},
    {1215, {"EPS", "EPS_STEERING_ANGLE_OVER_ERR", "方向盘角度超限", 0}},
    {1216, {"EPS", "EPS_XOR_CHECK_ERR", "异或校验错误", 0}},
    {1217, {"EPS", "EPS_MIN_GEAR_BREAK_ERR", "小齿轮角度传感器断开", 0}},
    {1218, {"EPS", "EPS_MED_GEAR_BREAK_ERR", "中齿轮角度传感器断开", 0}},

    {1301, {"MBC", "MBCM_ZERO_CURR_DRIFT_ERR", "零点电流漂移", 0}},
    {1302, {"MBC", "MBCM_MS_COMM_ERR", "主从芯片通讯故障", 0}},
    {1303, {"MBC", "MBCM_OVER_CURR_ERR", "过流", 0}},
    {1304, {"MBC", "MBCM_PHASE_LOSS_ERR", "缺相（也有可能会由于大电流导致）", 0}},
    {1305, {"MBC", "MBCM_MOS_ERR", "MOS故障", 0}},
    {1306, {"MBC", "MBCM_LOCKED_ROTOR_ERR", "堵转", 0}},
    {1307, {"MBC", "MBCM_OVER_VOL_ERR", "过压", 0}},
    {1308, {"MBC", "MBCM_UNDER_VOL_ERR", "欠压", 0}},
    {1309, {"MBC", "MBCS_ZERO_CURR_DRIFT_ERR", "零点电流漂移", 0}},
    {1310, {"MBC", "MBCS_MS_COMM_ERR", "主从芯片通讯故障", 0}},
    {1311, {"MBC", "MBCS_OVER_CURR_ERR", "过流", 0}},
    {1312, {"MBC", "MBCS_PHASE_LOSS_ERR", "缺相（也有可能会由于大电流导致）", 0}},
    {1313, {"MBC", "MBCS_MOS_ERR", "MOS故障", 0}},
    {1314, {"MBC", "MBCS_LOCKED_ROTOR_ERR", "堵转", 0}},
    {1315, {"MBC", "MBCS_OVER_VOL_ERR", "过压", 0}},
    {1316, {"MBC", "MBCS_UNDER_VOL_ERR", "欠压", 0}},

    {1401, {"EBC", "EBCM_ZERO_CURR_DRIFT_ERR", "零点电流漂移", 0}},
    {1402, {"EBC", "EBCM_MS_COMM_ERR", "主从芯片通讯故障", 0}},
    {1403, {"EBC", "EBCM_OVER_CURR_ERR", "过流", 0}},
    {1404, {"EBC", "EBCM_PHASE_LOSS_ERR", "缺相（也有可能会由于大电流导致）", 0}},
    {1405, {"EBC", "EBCM_MOS_ERR", "MOS故障", 0}},
    {1406, {"EBC", "EBCM_LOCKED_ROTOR_ERR", "堵转", 0}},
    {1407, {"EBC", "EBCM_OVER_VOL_ERR", "过压", 0}},
    {1408, {"EBC", "EBCM_UNDER_VOL_ERR", "欠压", 0}},
    {1409, {"EBC", "EBCS_ZERO_CURR_DRIFT_ERR", "零点电流漂移", 0}},
    {1410, {"EBC", "EBCS_MS_COMM_ERR", "主从芯片通讯故障", 0}},
    {1411, {"EBC", "EBCS_OVER_CURR_ERR", "过流", 0}},
    {1412, {"EBC", "EBCS_PHASE_LOSS_ERR", "缺相（也有可能会由于大电流导致）", 0}},
    {1413, {"EBC", "EBCS_MOS_ERR", "MOS故障", 0}},
    {1414, {"EBC", "EBCS_LOCKED_ROTOR_ERR", "堵转", 0}},
    {1415, {"EBC", "EBCS_OVER_VOL_ERR", "过压", 0}},
    {1416, {"EBC", "EBCS_UNDER_VOL_ERR", "欠压", 0}}};