#pragma once

#include "types.hpp"

#include <stdint.h>

#include <sdbusplus/asio/connection.hpp>

#include <string>

namespace openpower
{
namespace vpd
{
namespace manager
{

class Manager;
/**
 * @brief A class that handles changes to BIOS attributes backed by VPD.
 *
 * This class has APIs that handle updates to BIOS attributes that need to
 * be backed up to VPD. It mainly does the following:
 * 1) Checks if the VPD keywords that BIOS attributes are backed to are
 * uninitialized. If so, it initializes them.
 * 2) Listens for changes to BIOS attributes and synchronizes them to the
 * appropriate VPD keyword.
 *
 * Since on a factory reset like scenario, the BIOS attributes are initialized
 * by PLDM, this code waits until PLDM has grabbed a bus name before attempting
 * any syncs.
 */
class BiosHandler
{
  public:
    // Some default and deleted constructors and assignments.
    BiosHandler() = delete;
    BiosHandler(const BiosHandler&) = delete;
    BiosHandler& operator=(const BiosHandler&) = delete;
    BiosHandler(Manager&&) = delete;
    BiosHandler& operator=(BiosHandler&&) = delete;
    ~BiosHandler() = default;

    BiosHandler(std::shared_ptr<sdbusplus::asio::connection>& conn,
                Manager& manager) :
        conn(conn),
        manager(manager)
    {
        checkAndListenPLDMService();
    }

  private:
    /**
     * @brief Check if PLDM service is running and run BIOS sync
     *
     * This API checks if the PLDM service is running and if yes it will start
     * an immediate sync of BIOS attributes. If the service is not running, it
     * registers a listener to be notified when the service starts so that a
     * restore can be performed.
     */
    void checkAndListenPLDMService();

    /**
     * @brief Register listener for changes to BIOS Attributes.
     *
     * The VPD manager needs to listen to changes to certain BIOS attributes
     * that are backed by VPD. When the attributes we are interested in
     * change, the VPD manager will make sure that we write them back to the
     * VPD keywords that back them up.
     */
    void listenBiosAttribs();

    /**
     * @brief Callback for BIOS Attribute changes
     *
     * Checks if the BIOS attribute(s) changed are those backed up by VPD. If
     * yes, it will update the VPD with the new attribute value.
     * @param[in] msg - The callback message.
     */
    void biosAttribsCallback(sdbusplus::message_t& msg);

    /**
     * @brief Persistently saves the Memory mirror mode
     *
     * Memory mirror mode setting is saved to the UTIL/D0 keyword in the
     * motherboard VPD. If the mirror mode in BIOS is "Disabled", set D0 to 1,
     * if "Enabled" set D0 to 2
     *
     * @param[in] mirrorMode - The mirror mode BIOS attribute.
     */
    void saveAMMToVPD(const std::string& mirrorMode);

    /**
     * @brief Persistently saves the Field Core Override setting
     *
     * Saves the field core override value (FCO) into the VSYS/RG keyword in
     * the motherboard VPD.
     *
     * @param[in] fcoVal - The FCO value as an integer.
     */
    void saveFCOToVPD(int64_t fcoVal);

    /**
     * @brief Persistently saves the Keep and Clear setting
     *
     * Keep and clear setting is saved to the UTIL/D1 keyword's 0th bit in the
     * motherboard VPD. If the keep and clear in BIOS is "Disabled", set D1:0 to
     * 0, if "Enabled" set D1:0 to 1
     *
     * @param[in] keepAndClear - The keep and clear BIOS attribute.
     */
    void saveKeepAndClearToVPD(const std::string& keepAndClear);

    /**
     * @brief Persistently saves the Create default LPAR setting
     *
     * Create default LPAR setting is saved to the UTIL/D1 keyword's 1st bit in
     * the motherboard VPD. If the create default LPAR in BIOS is "Disabled",
     * set D1:1 to 0, if "Enabled" set D1:1 to 1
     *
     * @param[in] createDefaultLpar - The mirror mode BIOS attribute.
     */
    void saveCreateDefaultLparToVPD(const std::string& createDefaultLpar);

    /**
     * @brief Persistently saves the Clear NVRAM setting
     *
     * Create default LPAR setting is saved to the UTIL/D1 keyword's 2nd bit in
     * the motherboard VPD. If the clear NVRAM in BIOS is "Disabled",
     * set D1:2 to 0, if "Enabled" set D1:2 to 1
     *
     * @param[in] createDefaultLpar - The mirror mode BIOS attribute.
     */
    void saveClearNVRAMToVPD(const std::string& clearNVRAM);

    /**
     * @brief Writes Memory mirror mode to BIOS
     *
     * Writes to the hb_memory_mirror_mode BIOS attribute, if the value is
     * not already the same as we are trying to write.
     *
     * @param[in] ammVal - The mirror mode as read from VPD.
     * @param[in] ammInBIOS - The mirror mode in the BIOS table.
     */
    void saveAMMToBIOS(const std::string& ammVal, const std::string& ammInBIOS);

    /**
     * @brief Writes Field Core Override to BIOS
     *
     * Writes to the hb_field_core_override BIOS attribute, if the value is not
     * already the same as we are trying to write.
     *
     * @param[in] fcoVal - The FCO value as read from VPD.
     * @param[in] fcoInBIOS - The FCO value already in the BIOS table.
     */
    void saveFCOToBIOS(const std::string& fcoVal, int64_t fcoInBIOS);

    /**
     * @brief Writes Keep and clear setting to BIOS
     *
     * Writes to the pvm_keep_and_clear BIOS attribute, if the value is
     * not already the same as we are trying to write.
     *
     * @param[in] keepAndClear - The keep and clear as read from VPD.
     * @param[in] keepAndClearInBIOS - The keep and clear in the BIOS table.
     */
    void saveKeepAndClearToBIOS(const std::string& keepAndClear,
                                const std::string& keepAndClearInBIOS);

    /**
     * @brief Writes Create default LPAR setting to BIOS
     *
     * Writes to the pvm_create_default_lpar BIOS attribute, if the value is
     * not already the same as we are trying to write.
     *
     * @param[in] createDefaultLpar - The create default LPAR as read from VPD.
     * @param[in] createDefaultLparInBIOS - The create default LPAR in the BIOS
     * table.
     */
    void
        saveCreateDefaultLparToBIOS(const std::string& createDefaultLpar,
                                    const std::string& createDefaultLparInBIOS);

    /**
     * @brief Writes Clear NVRAM setting to BIOS
     *
     * Writes to the pvm_clear_nvram BIOS attribute, if the value is
     * not already the same as we are trying to write.
     *
     * @param[in] clearNVRAM - The clear NVRAM as read from VPD.
     * @param[in] clearNVRAMInBIOS - The clear NVRAM in the BIOS table.
     */
    void saveClearNVRAMToBIOS(const std::string& clearNVRAM,
                              const std::string& clearNVRAMInBIOS);

    /**
     * @brief Reads the hb_memory_mirror_mode attribute
     *
     * @return std::string - The AMM BIOS attribute. Empty string on failure.
     */
    std::string readBIOSAMM();

    /**
     * @brief Reads the hb_field_core_override attribute
     *
     * @return int64_t - The FCO BIOS attribute.  -1 on failure.
     */
    int64_t readBIOSFCO();

    /**
     * @brief Reads the pvm_keep_and_clear attribute
     *
     * @return std::string - The Keep and clear BIOS attribute. Empty string on
     * failure.
     */
    std::string readBIOSKeepAndClear();

    /**
     * @brief Reads the pvm_create_default_lpar attribute
     *
     * @return std::string - The Create default LPAR BIOS attribute. Empty
     * string on failure.
     */
    std::string readBIOSCreateDefaultLpar();

    /**
     * @brief Reads the pvm_clear_nvram attribute
     *
     * @return std::string - The Clear NVRAM BIOS attribute. Empty
     * string on failure.
     */
    std::string readBIOSClearNVRAM();

    /**
     * @brief Restore BIOS attributes
     *
     * This function checks if we are coming out of a factory reset. If yes,
     * it checks the VPD cache for valid backed up copy of the applicable
     * BIOS attributes. If valid values are found in the VPD, it will apply
     * those to the BIOS attributes.
     */
    void restoreBIOSAttribs();

    /**
     * @brief Reference to the connection.
     */
    std::shared_ptr<sdbusplus::asio::connection>& conn;

    /**
     * @brief Reference to the manager.
     */
    Manager& manager;
}; // class BiosHandler
} // namespace manager
} // namespace vpd
} // namespace openpower
