#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
