/**
 * 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 I2CWriteByteAction
 *
 * Writes a byte to a device register.  Communicates with the device directly
 * using the I2C interface.
 *
 * Implements the i2c_write_byte action in the JSON config file.
 */
class I2CWriteByteAction : public I2CAction
{
  public:
    // Specify which compiler-generated methods we want
    I2CWriteByteAction() = delete;
    I2CWriteByteAction(const I2CWriteByteAction&) = delete;
    I2CWriteByteAction(I2CWriteByteAction&&) = delete;
    I2CWriteByteAction& operator=(const I2CWriteByteAction&) = delete;
    I2CWriteByteAction& operator=(I2CWriteByteAction&&) = delete;
    virtual ~I2CWriteByteAction() = default;

    /**
     * Constructor.
     *
     * @param reg Device register address.  Note: named 'reg' because 'register'
     *            is a reserved keyword.
     * @param value Byte value to write.
     * @param mask Bit mask.  Specifies which bits to write within the byte
     *             value.  Only the bits with a value of 1 in the mask will be
     *             written.
     */
    explicit I2CWriteByteAction(uint8_t reg, uint8_t value,
                                uint8_t mask = 0xFF) :
        reg{reg},
        value{value}, mask{mask}
    {}

    /**
     * Executes this action.
     *
     * Writes a byte to a device register 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
     */
    virtual bool execute(ActionEnvironment& environment) override;

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

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

    /**
     * Returns the bit mask.
     *
     * Specifies which bits to write within the byte value.  Only the bits with
     * a value of 1 in the mask will be written.
     *
     * @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};

    /**
     * Byte value to write.
     */
    const uint8_t value{0x00};

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

} // namespace phosphor::power::regulators
