/**
 * 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 "i2c_interface.hpp"
#include "pmbus_utils.hpp"

#include <cstdint>
#include <optional>
#include <stdexcept>
#include <string>

namespace phosphor::power::regulators
{

/**
 * @class PMBusWriteVoutCommandAction
 *
 * Writes the value of VOUT_COMMAND to set the output voltage of a PMBus
 * regulator rail.  Communicates with the device directly using the I2C
 * interface.
 *
 * Implements the pmbus_write_vout_command action in the JSON config file.
 *
 * The volts value to write can be specified in the constructor.  Otherwise, the
 * volts value will be obtained from the ActionEnvironment.
 *
 * The PMBus specification defines four data formats for the value of
 * VOUT_COMMAND:
 * - Linear
 * - VID
 * - Direct
 * - IEEE Half-Precision Floating Point
 * Currently only the linear data format is supported.  The volts value is
 * converted into linear format before being written.
 *
 * The linear data format requires an exponent value.  The exponent value can be
 * specified in the constructor.  Otherwise the exponent value will be obtained
 * from the PMBus VOUT_MODE command.  Note that some PMBus devices do not
 * support the VOUT_MODE command.  The exponent value for a device is often
 * found in the device documentation (data sheet).
 *
 * If desired, write verification can be performed.  The value of VOUT_COMMAND
 * will be read from the device after it is written to ensure that it contains
 * the expected value.  If VOUT_COMMAND contains an unexpected value, a
 * WriteVerificationError is thrown.  To perform verification, the device must
 * return all 16 bits of voltage data that were written to VOUT_COMMAND.
 */
class PMBusWriteVoutCommandAction : public I2CAction
{
  public:
    // Specify which compiler-generated methods we want
    PMBusWriteVoutCommandAction() = delete;
    PMBusWriteVoutCommandAction(const PMBusWriteVoutCommandAction&) = delete;
    PMBusWriteVoutCommandAction(PMBusWriteVoutCommandAction&&) = delete;
    PMBusWriteVoutCommandAction&
        operator=(const PMBusWriteVoutCommandAction&) = delete;
    PMBusWriteVoutCommandAction&
        operator=(PMBusWriteVoutCommandAction&&) = delete;
    virtual ~PMBusWriteVoutCommandAction() = default;

    /**
     * Constructor.
     *
     * Throws an exception if any of the input parameters are invalid.
     *
     * @param volts Optional volts value to write to VOUT_COMMAND.
     * @param format Data format of the volts value written to VOUT_COMMAND.
     *               Currently the only supported format is linear.
     * @param exponent Optional exponent to use to convert the volts value to
     *                 linear data format.
     * @param isVerified Specifies whether the updated value of VOUT_COMMAND is
     *                   verified by reading it from the device.
     */
    explicit PMBusWriteVoutCommandAction(std::optional<double> volts,
                                         pmbus_utils::VoutDataFormat format,
                                         std::optional<int8_t> exponent,
                                         bool isVerified) :
        volts{volts},
        format{format}, exponent{exponent}, isWriteVerified{isVerified}
    {
        // Currently only linear format is supported
        if (format != pmbus_utils::VoutDataFormat::linear)
        {
            throw std::invalid_argument{"Unsupported data format specified"};
        }
    }

    /**
     * Executes this action.
     *
     * Writes a volts value to VOUT_COMMAND using the I2C interface.
     *
     * If a volts value was specified in the constructor, that value will be
     * used.  Otherwise the volts value will be obtained from the
     * ActionEnvironment.
     *
     * The data format is specified in the constructor.  Currently only the
     * linear format is supported.
     *
     * An exponent value is required to convert the volts value to linear
     * format.  If an exponent value was specified in the constructor, that
     * value will be used.  Otherwise the exponent value will be obtained from
     * the VOUT_MODE command.
     *
     * Write verification will be performed if specified in the constructor.
     *
     * The device is obtained from the ActionEnvironment.
     *
     * Throws an exception if an error occurs.
     *
     * @param environment action execution environment
     * @return true
     */
    virtual bool execute(ActionEnvironment& environment) override;

    /**
     * Returns the optional exponent value used to convert the volts value to
     * linear data format.
     *
     * @return optional exponent value
     */
    std::optional<int8_t> getExponent() const
    {
        return exponent;
    }

    /**
     * Returns the data format of the value written to VOUT_COMMAND.
     *
     * @return data format
     */
    pmbus_utils::VoutDataFormat getFormat() const
    {
        return format;
    }

    /**
     * Returns the optional volts value to write to VOUT_COMMAND.
     *
     * @return optional volts value
     */
    std::optional<double> getVolts() const
    {
        return volts;
    }

    /**
     * Returns whether write verification will be performed when writing to
     * VOUT_COMMAND.
     *
     * @return true if write verification will be performed, false otherwise
     */
    bool isVerified() const
    {
        return isWriteVerified;
    }

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

  private:
    /**
     * Gets the exponent value to use to convert the volts value to linear data
     * format.
     *
     * If an exponent value is defined for this action, that value is returned.
     * Otherwise VOUT_MODE is read from the current device to obtain the
     * exponent value.
     *
     * Throws an exception if an error occurs.
     *
     * @param interface I2C interface to the current device
     * @return exponent value
     */
    int8_t getExponentValue(i2c::I2CInterface& interface);

    /**
     * Gets the volts value to write to VOUT_COMMAND.
     *
     * If a volts value is defined for this action, that value is returned.
     * Otherwise the volts value is obtained from the specified
     * ActionEnvironment.
     *
     * Throws an exception if no volts value is defined.
     *
     * @param environment action execution environment
     * @return volts value
     */
    double getVoltsValue(ActionEnvironment& environment);

    /**
     * Verifies the value written to VOUT_COMMAND.  Reads the current value of
     * VOUT_COMMAND and ensures that it matches the value written.
     *
     * Throws an exception if the values do not match or a communication error
     * occurs.
     *
     * @param environment action execution environment
     * @param interface I2C interface to the current device
     * @param valueWritten linear format volts value written to VOUT_COMMAND
     */
    void verifyWrite(ActionEnvironment& environment,
                     i2c::I2CInterface& interface, uint16_t valueWritten);

    /**
     * Optional volts value to write.
     */
    const std::optional<double> volts{};

    /**
     * Data format of the volts value written to VOUT_COMMAND.
     */
    const pmbus_utils::VoutDataFormat format{};

    /**
     * Optional exponent value to use to convert the volts value to linear data
     * format.
     */
    const std::optional<int8_t> exponent{};

    /**
     * Indicates whether write verification will be performed when writing to
     * VOUT_COMMAND.
     */
    const bool isWriteVerified{false};
};

} // namespace phosphor::power::regulators
