#pragma once

#include <iostream>
#include "PIDSDataDefine.h"
#include <map>


using namespace std;


class PIDSServerResultMsg
{
public:
    // 当前站站号
    int CurrentSite;
    // 下一站站号
    int NextSite;
    // 起始站站号
    int StartSite;
    // 终点站站好
    int EndSite;
    // 时间是否有效
    bool TimeFlag;


    // 车门标志位
    uint8_t DoorFlag;
    // TC2、TC1激活情况
    uint8_t PIDSFlag;

    std::map<int,int> DynamicLoad;

public:
    PIDSServerResultMsg(){};
    ~PIDSServerResultMsg(){};
    
    // 反序列化
    int32_t Deserialization(uint8_t *data, int length)
    {
        // 检查数据头尾
        if(data[0] != PIDS_DATA_HEAD || data[length-1] != PIDS_DATA_END) {
            ErrorL << "Incorrect data head and tail";
            return ERR;
        }
        // 获取数据长度
        uint16_t DataLength = ((uint16_t)data[8] << 8 | data[7]);

        // 检查数据校验位
        int16_t crc = Crc16::GetCRC16(data, 9, DataLength);

        // if(data[length-3] != ((crc & 0xFF00) >> 8) || data[length-2] != (crc & 0x00FF)){
        //     ErrorL << "Incorrect data check digit";
        // }

        // 数据校验通过提取数据
        this->CurrentSite = data[9];
        this->NextSite = data[10];
        this->StartSite = data[11];
        this->EndSite = data[12];
        this->TimeFlag = data[13] ? true:false;

        // 时间
        // 标志
        this->DoorFlag = data[21];
        this->PIDSFlag = data[22];
        // 提取动态负载
        int id = 1;
        for(int i = 0; i < 12; i+=2){
            this->DynamicLoad[id] = (uint16_t)data[24 + i] << 8 | data[23 + i];
            id++;
        }
        return OK;
    }
};