#pragma once
#include "stream.hpp"

#include <chrono>

namespace openpower
{
namespace pels
{

/**
 * @brief A structure that contains a PEL timestamp in BCD.
 */
struct BCDTime
{
    uint8_t yearMSB;
    uint8_t yearLSB;
    uint8_t month;
    uint8_t day;
    uint8_t hour;
    uint8_t minutes;
    uint8_t seconds;
    uint8_t hundredths;

    BCDTime() :
        yearMSB(0), yearLSB(0), month(0), day(0), hour(0), minutes(0),
        seconds(0), hundredths(0)
    {}

    BCDTime(uint8_t yearMSB, uint8_t yearLSB, uint8_t month, uint8_t day,
            uint8_t hour, uint8_t minutes, uint8_t seconds,
            uint8_t hundredths) :
        yearMSB(yearMSB),
        yearLSB(yearLSB), month(month), day(day), hour(hour), minutes(minutes),
        seconds(seconds), hundredths(hundredths)
    {}

    bool operator==(const BCDTime& right) const;
    bool operator!=(const BCDTime& right) const;

} __attribute__((packed));

/**
 * @brief Converts a time_point into a BCD time
 *
 * @param[in] time - the time_point to convert
 * @return BCDTime - the BCD time
 */
BCDTime getBCDTime(std::chrono::time_point<std::chrono::system_clock>& time);

/**
 * @brief Converts the number of milliseconds since the epoch into BCD time
 *
 * @param[in] milliseconds - Number of milliseconds since the epoch
 * @return BCDTime - the BCD time
 */
BCDTime getBCDTime(uint64_t milliseconds);

/**
 * @brief Convert a BCDTime value into the number of
 *        milliseconds since the epoch (1/1/1970).
 *
 * @param[in] bcdTime - The BCD time value
 * @return uint64_t - The milliseconds value
 */
uint64_t getMillisecondsSinceEpoch(const BCDTime& bcdTime);

/**
 * @brief Converts a number to a BCD.
 *
 * For example 32 -> 0x32.
 *
 * Source: PLDM repository
 *
 * @param[in] value - the value to convert.
 *
 * @return T - the BCD value
 */
template <typename T>
T toBCD(T decimal)
{
    T bcd = 0;
    T remainder = 0;
    auto count = 0;

    while (decimal)
    {
        remainder = decimal % 10;
        bcd = bcd + (remainder << count);
        decimal = decimal / 10;
        count += 4;
    }

    return bcd;
}

/**
 * @brief Converts a BCD byte to a decimal number.
 *
 * For example 0x22 -> 22.
 *
 * @param[in] bcd - The value in BCD
 * @return int - The number in decimal
 */
inline int fromBCD(uint8_t bcd)
{
    return (((bcd & 0xF0) >> 4) * 10) + (bcd & 0xF);
}

/**
 * @brief Stream extraction operator for BCDTime
 *
 * @param[in] s - the Stream
 * @param[out] time - the BCD time
 *
 * @return Stream&
 */
Stream& operator>>(Stream& s, BCDTime& time);

/**
 * @brief Stream insertion operator for BCDTime
 *
 * @param[in/out] s - the Stream
 * @param[in] time - the BCD time
 *
 * @return Stream&
 */
Stream& operator<<(Stream& s, const BCDTime& time);

} // namespace pels
} // namespace openpower
