#pragma once

#include "pmbus.hpp"
#include "power_sequencer_monitor.hpp"

#include <gpiod.hpp>
#include <sdbusplus/bus.hpp>
#include <sdbusplus/bus/match.hpp>

#include <filesystem>
#include <vector>

namespace phosphor::power::sequencer
{

struct Pin
{
    std::string name;
    unsigned int line;
};

/**
 * @class UCD90320Monitor
 * This class implements fault analysis for the UCD90320
 * power sequencer device.
 */
class UCD90320Monitor : public PowerSequencerMonitor
{
  public:
    UCD90320Monitor() = delete;
    UCD90320Monitor(const UCD90320Monitor&) = delete;
    UCD90320Monitor& operator=(const UCD90320Monitor&) = delete;
    UCD90320Monitor(UCD90320Monitor&&) = delete;
    UCD90320Monitor& operator=(UCD90320Monitor&&) = delete;
    virtual ~UCD90320Monitor() = default;

    /**
     * Create a device object for UCD90320 monitoring.
     * @param bus D-Bus bus object
     * @param i2cBus The bus number of the power sequencer device
     * @param i2cAddress The I2C address of the power sequencer device
     */
    UCD90320Monitor(sdbusplus::bus::bus& bus, std::uint8_t i2cBus,
                    std::uint16_t i2cAddress);

    /**
     * Callback function to handle interfacesAdded D-Bus signals
     * @param msg Expanded sdbusplus message data
     */
    void interfacesAddedHandler(sdbusplus::message::message& msg);

    /** @copydoc PowerSequencerMonitor::onFailure() */
    void onFailure(bool timeout, const std::string& powerSupplyError) override;

  private:
    /**
     * The match to Entity Manager interfaces added.
     */
    sdbusplus::bus::match_t match;

    /**
     * List of pins
     */
    std::vector<Pin> pins;

    /**
     * The read/write interface to this hardware
     */
    pmbus::PMBus pmbusInterface;

    /**
     * List of rail names
     */
    std::vector<std::string> rails;

    /**
     * Finds the list of compatible system types using D-Bus methods.
     * This list is used to find the correct JSON configuration file for the
     * current system.
     */
    void findCompatibleSystemTypes();

    /**
     * Finds the JSON configuration file.
     * Looks for a configuration file based on the list of compatible system
     * types.
     * Throws an exception if an operating system error occurs while checking
     * for the existance of a file.
     * @param compatibleSystemTypes List of compatible system types
     */
    void findConfigFile(const std::vector<std::string>& compatibleSystemTypes);

    /**
     * Analyzes the device pins for errors when the device is known to be in an
     * error state.
     * @param message Message property of the error log entry
     * @param additionalData AdditionalData property of the error log entry
     */
    void onFailureCheckPins(std::string& message,
                            std::map<std::string, std::string>& additionalData);

    /**
     * Analyzes the device rails for errors when the device is known to be in an
     * error state.
     * @param message Message property of the error log entry
     * @param additionalData AdditionalData property of the error log entry
     * @param powerSupplyError The power supply error to log. A default
     * std:string, i.e. empty string (""), is passed when there is no power
     * supply error to log.
     */
    void onFailureCheckRails(std::string& message,
                             std::map<std::string, std::string>& additionalData,
                             const std::string& powerSupplyError);

    /**
     * Parse the JSON configuration file.
     * @param pathName the path name
     */
    void parseConfigFile(const std::filesystem::path& pathName);

    /**
     * Reads the mfr_status register
     * @return the register contents
     */
    uint32_t readMFRStatus();

    /**
     * Reads the status_word register
     * @return the register contents
     */
    uint16_t readStatusWord();
};

} // namespace phosphor::power::sequencer
