#pragma once
#include <sdbusplus/bus/match.hpp>
#include "average.hpp"
#include "device.hpp"
#include "maximum.hpp"
#include "names_values.hpp"
#include "pmbus.hpp"
#include "record_manager.hpp"
#include "timer.hpp"

namespace witherspoon
{
namespace power
{
namespace psu
{

namespace sdbusRule = sdbusplus::bus::match::rules;

constexpr auto FAULT_COUNT = 3;

/**
 * @class PowerSupply
 * Represents a PMBus power supply device.
 */
class PowerSupply : public Device
{
    public:
        PowerSupply() = delete;
        PowerSupply(const PowerSupply&) = delete;
        PowerSupply(PowerSupply&&) = default;
        PowerSupply& operator=(const PowerSupply&) = default;
        PowerSupply& operator=(PowerSupply&&) = default;
        ~PowerSupply() = default;

        /**
         * Constructor
         *
         * @param[in] name - the device name
         * @param[in] inst - the device instance
         * @param[in] objpath - the path to monitor
         * @param[in] invpath - the inventory path to use
         * @param[in] bus - D-Bus bus object
         * @param[in] e - event object
         * @param[in] t - time to allow power supply to assert PG#
         * @param[in] p - time to allow power supply presence state to
         *                settle/deglitch and allow for application of power
         *                prior to fault checking
         */
        PowerSupply(const std::string& name, size_t inst,
                    const std::string& objpath,
                    const std::string& invpath,
                    sdbusplus::bus::bus& bus,
                    event::Event& e,
                    std::chrono::seconds& t,
                    std::chrono::seconds& p);

        /**
         * Power supply specific function to analyze for faults/errors.
         *
         * Various PMBus status bits will be checked for fault conditions.
         * If a certain fault bits are on, the appropriate error will be
         * committed.
         */
        void analyze() override;

        /**
         * Write PMBus CLEAR_FAULTS
         *
         * This function will be called in various situations in order to clear
         * any fault status bits that may have been set, in order to start over
         * with a clean state. Presence changes and power state changes will
         * want to clear any faults logged.
         */
        void clearFaults() override;

        /**
         * Mark error for specified callout and message as resolved.
         *
         * @param[in] callout - The callout to be resolved (inventory path)
         * @parma[in] message - The message for the fault to be resolved
         */
        void resolveError(const std::string& callout,
                          const std::string& message);

        /**
         * Enables making the input power history available on D-Bus
         *
         * @param[in] objectPath - the D-Bus object path to use
         * @param[in] maxRecords - the number of history records to keep
         * @param[in] syncGPIOPath - The gpiochip device path to use for
         *                           sending the sync command
         * @paramp[in] syncGPIONum - the GPIO number for the sync command
         */
        void enableHistory(const std::string& objectPath,
                           size_t numRecords,
                           const std::string& syncGPIOPath,
                           size_t syncGPIONum);

    private:
        /**
         * The path to use for reading various PMBus bits/words.
         */
        std::string monitorPath;

        /**
         * @brief Pointer to the PMBus interface
         *
         * Used to read out of or write to the /sysfs tree(s) containing files
         * that a device driver monitors the PMBus interface to the power
         * supplies.
         */
        witherspoon::pmbus::PMBus pmbusIntf;

        /**
         * @brief D-Bus path to use for this power supply's inventory status.
         */
        std::string inventoryPath;

        /** @brief Connection for sdbusplus bus */
        sdbusplus::bus::bus& bus;

        /** @brief True if the power supply is present. */
        bool present = false;

        /** @brief Used to subscribe to D-Bus property changes for Present */
        std::unique_ptr<sdbusplus::bus::match_t> presentMatch;

        /** @brief The sd_event structure used by the power on and present
         *  timers. */
        event::Event& event;

        /**
         * @brief Interval for setting present to true.
         *
         * The amount of time to wait from not present to present change before
         * updating the internal present indicator. Allows person servicing
         * the power supply some time to plug in the cable.
         */
        std::chrono::seconds presentInterval;

        /**
         * @brief Timer used to delay setting the internal present state.
         *
         * The timer used to do the callback after the present property has
         * changed.
         */
        Timer presentTimer;

        /** @brief True if a fault has already been found and not cleared */
        bool faultFound = false;

        /** @brief True if the power is on. */
        bool powerOn = false;

        /**
         * @brief Equal to FAULT_COUNT if power on fault has been
         * detected.
         */
        size_t powerOnFault = 0;

        /**
         * @brief Interval to setting powerOn to true.
         *
         * The amount of time to wait from power state on to setting the
         * internal powerOn state to true. The amount of time the power supply
         * is allowed to delay setting DGood/PG#.
         */
        std::chrono::seconds powerOnInterval;

        /**
         * @brief Timer used to delay setting the internal powerOn state.
         *
         * The timer used to do the callback after the power state has been on
         * long enough.
         */
        Timer powerOnTimer;

        /** @brief Used to subscribe to D-Bus power on state changes */
        std::unique_ptr<sdbusplus::bus::match_t> powerOnMatch;

        /** @brief Indicates that a read failure has occurred.
         *
         * @details This will be incremented each time a read failure is
         *          encountered. If it is incremented to FAULT_COUNT, an error
         *          will be logged.
         */
        size_t readFail = 0;

        /** @brief Has a PMBus read failure already been logged? */
        bool readFailLogged = false;

        /**
         * @brief Indicates an input fault or warning if equal to FAULT_COUNT.
         *
         * @details This is the "INPUT FAULT OR WARNING" bit in the high byte,
         *          or the VIN_UV_FAULT bit in the low byte in the STATUS_WORD
         *          command response. If either of those bits are on, this will
         *          be incremented.
         */
        size_t inputFault = 0;

        /**
         * @brief Indicates output over current fault if equal to FAULT_COUNT
         *
         * @details This is incremented when the "IOUT_OC_FAULT" bit in the low
         *          byte from the STATUS_WORD command response is on.
         */
        size_t outputOCFault = 0;

        /**
         * @brief Indicates output overvoltage fault if equal to FAULT_COUNT.
         *
         * @details This is incremented when the "VOUT_OV_FAULT" bit in the
         *          STATUS_WORD command response is on.
         */
        size_t outputOVFault = 0;

        /**
         * @brief Indicates a fan fault or warning condition was detected if
         *        equal to FAULT_COUNT.
         *
         * @details This is incremented when the 'FAN_FAULT' bit in the
         *          STATUS_WORD command response is on.
         */
        size_t fanFault = 0;

        /**
         * @brief Indicates a temperature fault or warn condition was detected
         *        if equal to FAULT_COUNT.
         *
         * @details This is incremented when the 'TEMPERATURE_FAULT_WARN' bit
         *          in the STATUS_WORD command response is on, or if the
         *          'OT_FAULT' bit in the STATUS_TEMPERATURE command response
         *          is on.
         */
        size_t temperatureFault = 0;

        /**
         * @brief Class that manages the input power history records.
         */
        std::unique_ptr<history::RecordManager> recordManager;

        /**
         * @brief The D-Bus object for the average input power history
         */
        std::unique_ptr<history::Average> average;

        /**
         * @brief The D-Bus object for the maximum input power history
         */
        std::unique_ptr<history::Maximum> maximum;

        /**
         * @brief The base D-Bus object path to use for the average
         *        and maximum objects.
         */
        std::string historyObjectPath;

        /**
         * @brief The GPIO device path to use for sending the 'sync'
         *        command to the PS.
         */
        std::string syncGPIODevPath;

        /**
         * @brief The GPIO number to use for sending the 'sync'
         *        command to the PS.
         */
        size_t syncGPIONumber = 0;

        /**
         * @brief Callback for inventory property changes
         *
         * Process change of Present property for power supply.
         *
         * @param[in]  msg - Data associated with Present change signal
         *
         */
        void inventoryChanged(sdbusplus::message::message& msg);

        /**
         * Updates the presence status by querying D-Bus
         *
         * The D-Bus inventory properties for this power supply will be read to
         * determine if the power supply is present or not and update this
         * objects present member variable to reflect current status.
         */
        void updatePresence();

        /**
         * @brief Updates the poweredOn status by querying D-Bus
         *
         * The D-Bus property for the system power state will be read to
         * determine if the system is powered on or not.
         */
        void updatePowerState();

        /**
         * @brief Callback for power state property changes
         *
         * Process changes to the powered on stat property for the system.
         *
         * @param[in] msg - Data associated with the power state signal
         */
        void powerStateChanged(sdbusplus::message::message& msg);

        /**
         * @brief Wrapper for PMBus::read() and adding metadata
         *
         * @param[out] nv - NamesValues instance to store cmd string and value
         * @param[in] cmd - String for the command to read data from.
         * @param[in] type - The type of file to read the command from.
         */
        void captureCmd(util::NamesValues& nv, const std::string& cmd,
                        witherspoon::pmbus::Type type);

        /**
         * @brief Checks for input voltage faults and logs error if needed.
         *
         * Check for voltage input under voltage fault (VIN_UV_FAULT) and/or
         * input fault or warning (INPUT_FAULT), and logs appropriate error(s).
         *
         * @param[in] statusWord  - 2 byte STATUS_WORD value read from sysfs
         */
        void checkInputFault(const uint16_t statusWord);

        /**
         * @brief Checks for power good negated or unit is off in wrong state
         *
         * @param[in] statusWord  - 2 byte STATUS_WORD value read from sysfs
         */
        void checkPGOrUnitOffFault(const uint16_t statusWord);

        /**
         * @brief Checks for output current over current fault.
         *
         * IOUT_OC_FAULT is checked, if on, appropriate error is logged.
         *
         * @param[in] statusWord  - 2 byte STATUS_WORD value read from sysfs
         */
        void checkCurrentOutOverCurrentFault(const uint16_t statusWord);

        /**
         * @brief Checks for output overvoltage fault.
         *
         * VOUT_OV_FAULT is checked, if on, appropriate error is logged.
         *
         * @param[in] statusWord  - 2 byte STATUS_WORD value read from sysfs
         */
        void checkOutputOvervoltageFault(const uint16_t statusWord);

        /**
         * @brief Checks for a fan fault or warning condition.
         *
         * The high byte of STATUS_WORD is checked to see if the "FAN FAULT OR
         * WARNING" bit is turned on. If it is on, log an error.
         *
         * @param[in] statusWord - 2 byte STATUS_WORD value read from sysfs
         */
        void checkFanFault(const uint16_t statusWord);

        /**
         * @brief Checks for a temperature fault or warning condition.
         *
         * The low byte of STATUS_WORD is checked to see if the "TEMPERATURE
         * FAULT OR WARNING" bit is turned on. If it is on, log an error,
         * call out the power supply indicating the fault/warning condition.
         *
         * @parma[in] statusWord - 2 byte STATUS_WORD value read from sysfs
         */
        void checkTemperatureFault(const uint16_t statusWord);

        /**
         * @brief Adds properties to the inventory.
         *
         * Reads the values from the device and writes them to the
         * associated power supply D-Bus inventory object.
         *
         * This needs to be done on startup, and each time the presence
         * state changes.
         *
         * Properties added:
         * - Serial Number
         * - Part Number
         * - CCIN (Customer Card Identification Number) - added as the Model
         * - Firmware version
         */
        void updateInventory();

        /**
         * @brief Toggles the GPIO to sync power supply input history readings
         *
         * This GPIO is connected to all supplies.  This will clear the
         * previous readings out of the supplies and restart them both at the
         * same time zero and at record ID 0.  The supplies will return 0
         * bytes of data for the input history command right after this until
         * a new entry shows up.
         *
         * This will cause the code to delete all previous history data and
         * start fresh.
         */
        void syncHistory();

        /**
         * @brief Reads the most recent input history record from the power
         *        supply and updates the average and maximum properties in
         *        D-Bus if there is a new reading available.
         *
         * This will still run every time analyze() is called so code can
         * post new data as soon as possible and the timestamp will more
         * accurately reflect the correct time.
         *
         * D-Bus is only updated if there is a change and the oldest record
         * will be pruned if the property already contains the max number of
         * records.
         */
        void updateHistory();
};

}
}
}
