/**
 * Copyright © 2020 IBM Corporation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#pragma once

#include "action_environment.hpp"
#include "i2c_action.hpp"

#include <cstdint>
#include <string>

namespace phosphor::power::regulators
{

/**
 * @class I2CCompareByteAction
 *
 * Compares a device register to a byte value.  Communicates with the device
 * directly using the I2C interface.
 *
 * Implements the i2c_compare_byte action in the JSON config file.
 */
class I2CCompareByteAction : public I2CAction
{
  public:
    // Specify which compiler-generated methods we want
    I2CCompareByteAction() = delete;
    I2CCompareByteAction(const I2CCompareByteAction&) = delete;
    I2CCompareByteAction(I2CCompareByteAction&&) = delete;
    I2CCompareByteAction& operator=(const I2CCompareByteAction&) = delete;
    I2CCompareByteAction& operator=(I2CCompareByteAction&&) = delete;
    virtual ~I2CCompareByteAction() = default;

    /**
     * Constructor.
     *
     * @param reg Device register address.  Note: named 'reg' because 'register'
     *            is a reserved keyword.
     * @param value Expected byte value.
     * @param mask Bit mask.  Specifies which bits should be compared within the
     *             byte value.  Only the bits with a value of 1 in the mask will
     *             be compared.  If not specified, defaults to 0xFF which means
     *             that all bits will be compared.
     */
    explicit I2CCompareByteAction(uint8_t reg, uint8_t value,
                                  uint8_t mask = 0xFF) :
        reg{reg},
        value{value}, mask{mask}
    {
    }

    /**
     * Executes this action.
     *
     * Compares a device register to a byte value using the I2C interface.
     *
     * The device register, byte value, and mask (if any) were specified in the
     * constructor.
     *
     * The device is obtained from the specified action environment.
     *
     * Throws an exception if an error occurs.
     *
     * @param environment action execution environment
     * @return true if the register contained the expected value, otherwise
     *         returns false.
     */
    virtual bool execute(ActionEnvironment& environment) override;

    /**
     * Returns the device register address.
     *
     * @return register address
     */
    uint8_t getRegister() const
    {
        return reg;
    }

    /**
     * Returns the expected byte value.
     *
     * @return expected value
     */
    uint8_t getValue() const
    {
        return value;
    }

    /**
     * Returns the bit mask.
     *
     * Specifies which bits should be compared within the byte value.  Only the
     * bits with a value of 1 in the mask will be compared.
     *
     * @return bit mask
     */
    uint8_t getMask() const
    {
        return mask;
    }

    /**
     * Returns a string description of this action.
     *
     * @return description of action
     */
    virtual std::string toString() const override;

  private:
    /**
     * Device register address.  Note: named 'reg' because 'register' is a
     * reserved keyword.
     */
    const uint8_t reg{0x00};

    /**
     * Expected byte value.
     */
    const uint8_t value{0x00};

    /**
     * Bit mask.  Specifies which bits should be compared within the byte value.
     * Only the bits with a value of 1 in the mask will be compared.
     */
    const uint8_t mask{0xFF};
};

} // namespace phosphor::power::regulators
