#pragma once

#include "device.hpp"
#include "pmbus.hpp"
#include "tools/i2c/i2c_interface.hpp"

#include <sdbusplus/bus.hpp>

#include <algorithm>
#include <filesystem>

namespace phosphor
{
namespace power
{

/**
 * @class MihawkCPLD
 *
 * This class implements fault analysis for Mihawk's CPLD
 * power sequencer device.
 *
 */
class MihawkCPLD : public Device
{
  public:
    MihawkCPLD() = delete;
    ~MihawkCPLD() = default;
    MihawkCPLD(const MihawkCPLD&) = delete;
    MihawkCPLD& operator=(const MihawkCPLD&) = delete;
    MihawkCPLD(MihawkCPLD&&) = default;
    MihawkCPLD& operator=(MihawkCPLD&&) = default;

    /**
     * Constructor
     *
     * @param[in] instance - the device instance number
     * @param[in] bus - D-Bus bus object
     */
    MihawkCPLD(size_t instance, sdbusplus::bus_t& bus);

    /**
     * Analyzes the device for errors when the device is
     * known to be in an error state.  A log will be created.
     */
    void onFailure() override;

    /**
     * Checks the device for errors and only creates a log
     * if one is found.
     */
    void analyze() override;

    /**
     * Clears faults in the device
     */
    void clearFaults() override
    {}

  private:
    /**
     * If checkPoweronFault() or checkPowerreadyFault()
     * returns "true", use readFromCPLDErrorCode()
     * to read CPLD-error-code-register
     * to analyze the fail reason.
     *
     * @param[in] statusReg - I2C's statusReg, slaveAddr
     * offset.
     * ex.Mihawk's CPLD-register is on slaveAddr ox40 of
     * i2c-11, but poweron_errcode-register is on slaveAddr
     * offset 0x21, power_ready-errorcode-register is on
     * slaveAddr offset 0x22.
     *
     * @return int - the error-code value which is read on
     * CPLD-error-code-register.
     */
    int readFromCPLDErrorCode(int statusReg);

    /**
     * Checks for PoweronFault on Mihawk's
     * CPLD-power_on-error-interrupt-bit-register
     * whether is transfered to "1".
     *
     * @return bool - true if power_on fail.
     */
    bool checkPoweronFault();

    /**
     * Clear CPLD intrupt record after reading CPLD_register.
     */
    void clearCPLDregister();

    /**
     * Check for PowerreadyFault on Mihawk's
     * CPLD-power_ready-error-interrupt-bit-register
     * whether is transfered to "1".
     *
     * @return bool - true if power_ready fail.
     */
    bool checkPowerreadyFault();

    /**
     * Use I2CInterface to read & write CPLD_register.
     */
    std::unique_ptr<i2c::I2CInterface> i2c;

    /**
     * The D-Bus bus object
     */
    sdbusplus::bus_t& bus;

    /**
     * Open CPLD_register via i2c.
     */
    void openCPLDDevice();

    /**
     * The parameter which is checked CPLD's the same error
     * whether is created again.
     */
    bool errorcodeMask;

    enum class ErrorCode : int
    {
        /**
         * All of powerOnErrorcode are the definition of error-code
         * which are read on CPLD-error-code-register.
         */
        /**
         * The definition of error-code:
         * Read CPLD-error-code-register fail.
         */
        _0 = 0,

        /**
         * The definition of error-code:
         * PSU0_PGOOD fail.
         */
        _1 = 1,

        /**
         * The definition of error-code:
         * PSU1_PGOOD fail.
         */
        _2 = 2,

        /**
         * The definition of error-code:
         * 240Va_Fault_A fail.
         */
        _3 = 3,

        /**
         * The definition of error-code:
         * 240Va_Fault_B fail.
         */
        _4 = 4,

        /**
         * The definition of error-code:
         * 240Va_Fault_C fail.
         */
        _5 = 5,

        /**
         * The definition of error-code:
         * 240Va_Fault_D fail.
         */
        _6 = 6,

        /**
         * The definition of error-code:
         * 240Va_Fault_E fail.
         */
        _7 = 7,

        /**
         * The definition of error-code:
         * 240Va_Fault_F fail.
         */
        _8 = 8,

        /**
         * The definition of error-code:
         * 240Va_Fault_G fail.
         */
        _9 = 9,

        /**
         * The definition of error-code:
         * 240Va_Fault_H fail.
         */
        _10 = 10,

        /**
         * The definition of error-code:
         * 240Va_Fault_J fail.
         */
        _11 = 11,

        /**
         * The definition of error-code:
         * 240Va_Fault_K fail.
         */
        _12 = 12,

        /**
         * The definition of error-code:
         * 240Va_Fault_L fail.
         */
        _13 = 13,

        /**
         * The definition of error-code:
         * P5V_PGOOD fail.
         */
        _14 = 14,

        /**
         * The definition of error-code:
         * P3V3_PGOOD fail.
         */
        _15 = 15,

        /**
         * The definition of error-code:
         * P1V8_PGOOD fail.
         */
        _16 = 16,

        /**
         * The definition of error-code:
         * P1V1_PGOOD fail.
         */
        _17 = 17,

        /**
         * The definition of error-code:
         * P0V9_PGOOD fail.
         */
        _18 = 18,

        /**
         * The definition of error-code:
         * P2V5A_PGOOD fail.
         */
        _19 = 19,

        /**
         * The definition of error-code:
         * P2V5B_PGOOD fail.
         */
        _20 = 20,

        /**
         * The definition of error-code:
         * Vdn0_PGOOD fail.
         */
        _21 = 21,

        /**
         * The definition of error-code:
         * Vdn1_PGOOD fail.
         */
        _22 = 22,

        /**
         * The definition of error-code:
         * P1V5_PGOOD fail.
         */
        _23 = 23,

        /**
         * The definition of error-code:
         * Vio0_PGOOD fail.
         */
        _24 = 24,

        /**
         * The definition of error-code:
         * Vio1_PGOOD fail.
         */
        _25 = 25,

        /**
         * The definition of error-code:
         * Vdd0_PGOOD fail.
         */
        _26 = 26,

        /**
         * The definition of error-code:
         * Vcs0_PGOOD fail.
         */
        _27 = 27,

        /**
         * The definition of error-code:
         * Vdd1_PGOOD fail.
         */
        _28 = 28,

        /**
         * The definition of error-code:
         * Vcs1_PGOOD fail.
         */
        _29 = 29,

        /**
         * The definition of error-code:
         * Vddr0_PGOOD fail.
         */
        _30 = 30,

        /**
         * The definition of error-code:
         * Vtt0_PGOOD fail.
         */
        _31 = 31,

        /**
         * The definition of error-code:
         * Vddr1_PGOOD fail.
         */
        _32 = 32,

        /**
         * The definition of error-code:
         * Vtt1_PGOOD fail.
         */
        _33 = 33,

        /**
         * The definition of error-code:
         * GPU0_PGOOD fail.
         */
        _34 = 34,

        /**
         * The definition of error-code:
         * GPU1_PGOOD fail.
         */
        _35 = 35,

        /**
         * The definition of error-code:
         * PSU0PSU1_PGOOD fail.
         */
        _36 = 170
    };
};

} // namespace power
} // namespace phosphor
