#pragma once

#include <sdbusplus/bus.hpp>
#include <xyz/openbmc_project/Time/EpochTime/server.hpp>

#include <chrono>

namespace phosphor
{
namespace time
{

/** @class EpochBase
 *  @brief Base class for OpenBMC EpochTime implementation.
 *  @details A base class that implements xyz.openbmc_project.Time.EpochTime
 *  DBus API for epoch time.
 */
class EpochBase : public sdbusplus::server::object::object <
    sdbusplus::xyz::openbmc_project::Time::server::EpochTime >
{
    public:
        friend class TestEpochBase;

        /** @brief Supported time modes
         *  NTP     Time sourced by Network Time Server
         *  MANUAL  User of the system need to set the time
         */
        enum class Mode
        {
            NTP,
            MANUAL,
        };

        /** @brief Supported time owners
         *  BMC     Time source may be NTP or MANUAL but it has to be set natively
         *          on the BMC. Meaning, host can not set the time. What it also
         *          means is that when BMC gets IPMI_SET_SEL_TIME, then its ignored.
         *          similarly, when BMC gets IPMI_GET_SEL_TIME, then the BMC's time
         *          is returned.
         *
         *  HOST    Its only IPMI_SEL_SEL_TIME that will set the time on BMC.
         *          Meaning, IPMI_GET_SEL_TIME and request to get BMC time will
         *          result in same value.
         *
         *  SPLIT   Both BMC and HOST will maintain their individual clocks but then
         *          the time information is stored in BMC. BMC can have either NTP
         *          or MANUAL as it's source of time and will set the time directly
         *          on the BMC. When IPMI_SET_SEL_TIME is received, then the delta
         *          between that and BMC's time is calculated and is stored.
         *          When BMC reads the time, the current time is returned.
         *          When IPMI_GET_SEL_TIME is received, BMC's time is retrieved and
         *          then the delta offset is factored in prior to returning.
         *
         *  BOTH:   BMC's time is set with whoever that sets the time. Similarly,
         *          BMC's time is returned to whoever that asks the time.
         */
        enum class Owner
        {
            BMC,
            HOST,
            SPLIT,
            BOTH,
        };

        EpochBase(sdbusplus::bus::bus& bus,
                  const char* objPath);

    protected:
        /** @brief Persistent sdbusplus DBus connection */
        sdbusplus::bus::bus& bus;

        /** @brief The current time mode */
        Mode timeMode;

        /** @brief The current time owner */
        Owner timeOwner;

        /** @brief Set current time to system
         *
         * This function set the time to system by invoking systemd
         * org.freedesktop.timedate1's SetTime method.
         *
         * @param[in] timeOfDayUsec - Microseconds since UTC
         */
        void setTime(const std::chrono::microseconds& timeOfDayUsec);

        /** @brief Get current time
         *
         * @return Microseconds since UTC
         */
        std::chrono::microseconds getTime() const;

        /** @brief Convert a string to enum Mode
         *
         * Convert the time mode string to enum.
         * Valid strings are "NTP", "MANUAL"
         * If it's not a valid time mode string, return NTP.
         *
         * @param[in] mode - The string of time mode
         *
         * @return The Mode enum
         */
        static Mode convertToMode(const std::string& mode);

        /** @brief Convert a string to enum Owner
         *
         * Convert the time owner string to enum.
         * Valid strings are "BMC", "HOST", "SPLIT", "BOTH"
         * If it's not a valid time owner string, return BMC.
         *
         * @param[in] owner - The string of time owner
         *
         * @return The Owner enum
         */
        static Owner convertToOwner(const std::string& owner);

    private:
        /** @brief Initialize the time mode and owner */
        void initialize();

        /** @brief Set current time mode
         *
         * @param[in] mode - The string of time mode
         */
        void setCurrentTimeMode(const std::string& mode);

        /** @brief Set current time owner
         *
         * @param[in] owner - The string of time owner
         */
        void setCurrentTimeOwner(const std::string& owner);

        /** @brief Get setting value from settings manager
         *
         * @param[in] setting - The string of the setting to get
         *
         * @return The value of the setting
         */
        std::string getSettings(const char* setting) const;

        /** @brief The map maps the string key to enum Owner */
        static const std::map<std::string, Owner> ownerMap;
};

} // namespace time
} // namespace phosphor
