#pragma once

#include <sensor.hpp>

using IpmbMethodType =
    std::tuple<int, uint8_t, uint8_t, uint8_t, uint8_t, std::vector<uint8_t>>;

enum class SDRType : uint8_t
{
    sdrType01 = 1,
    sdrType02 = 2,
    sdrType03 = 3
};

namespace sdr
{
// IPMB Commands
static constexpr uint8_t netfnStorageReq = 0x0a;
static constexpr uint8_t cmdStorageGetSdrInfo = 0x20;
static constexpr uint8_t cmdStorageReserveSdr = 0x22;
static constexpr uint8_t cmdStorageGetSdr = 0x23;

// Get SDR Commands
static constexpr uint8_t sdrNxtRecLSB = 0;
static constexpr uint8_t sdrNxtRecMSB = 1;
static constexpr uint8_t perCountByte = 16;

// Sensor Record Bytes
static constexpr uint8_t sdrType = 5;
static constexpr uint8_t dataLengthByte = 6;
static constexpr uint8_t sdrSensorNum = 9;

} // namespace sdr

namespace sdrtype01
{
// Negative Handle Commands
static constexpr uint8_t maxPosReadingMargin = 127;
static constexpr uint8_t twosCompVal = 128;
static constexpr double thermalConst = 256;

static constexpr uint8_t sdrSensNoThres = 0;
static constexpr uint8_t sensorCapability = 13;
static constexpr uint8_t sdrNegHandle = 24;
static constexpr uint8_t sdrUnitType = 25;
static constexpr uint8_t sdrLinearByte = 27;

// SDR Type 1 Thresholds Commands
static constexpr uint8_t mDataByte = 28;
static constexpr uint8_t mTolDataByte = 29;
static constexpr uint8_t bDataByte = 30;
static constexpr uint8_t bAcuDataByte = 31;
static constexpr uint8_t rbExpDataByte = 33;
static constexpr uint8_t upperCriticalThreshold = 43;
static constexpr uint8_t lowerCriticalThreshold = 46;
static constexpr uint8_t nameLengthByte = 53;

} // namespace sdrtype01

struct SensorInfo
{
    std::string sensorReadName;
    uint8_t sensorUnit = 0;
    double thresUpperCri = 0;
    double thresLowerCri = 0;
    uint8_t sensorNumber = 0;
    uint8_t sensCap = 0;
};

struct SensorValConversion
{
    uint16_t mValue = 0;
    double bValue = 0;
    double expoVal = 0;
    uint8_t negRead = 0;
};

inline std::map<int, std::vector<SensorInfo>> sensorRecord;
inline std::map<int, std::map<uint8_t, SensorValConversion>> sensorValRecord;

class IpmbSDRDevice : public std::enable_shared_from_this<IpmbSDRDevice>
{
  public:
    IpmbSDRDevice(std::shared_ptr<sdbusplus::asio::connection>& dbusConnection,
                  uint8_t cmdAddr);

    uint8_t commandAddress = 0;
    int hostIndex = 0;

    std::shared_ptr<sdbusplus::asio::connection> conn;

    std::vector<uint8_t> sdrData;
    uint16_t validRecordCount = 1;
    uint8_t iCnt = 0;
    uint8_t nextRecordIDLSB = 0;
    uint8_t nextRecordIDMSB = 0;

    std::vector<uint8_t> sdrCommandData;

    void getSDRRepositoryInfo();

    void reserveSDRRepository(uint16_t recordCount);

    void getSDRSensorData(uint16_t recordCount, uint8_t resrvIDLSB,
                          uint8_t resrvIDMSB);

    void handleSDRData(const std::vector<uint8_t>& data, uint16_t recordCount,
                       uint8_t resrvIDLSB, uint8_t resrvIDMSB);

    void checkSDRData(std::vector<uint8_t>& sdrDataBytes,
                      uint8_t dataLength) const;

    static void checkSDRType01Threshold(std::vector<uint8_t>& sdrDataBytes,
                                        int busIndex, std::string tempName);

    inline static double sensorValCalculation(uint16_t mValue, double bValue,
                                              double expValue, double value);
};
