/**
 * 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 <stdexcept>
#include <string>
#include <vector>

namespace phosphor::power::regulators
{

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

    /**
     * Constructor.
     *
     * Throws an exception if any of the input parameters are invalid.
     *
     * @param reg Device register address.  Note: named 'reg' because 'register'
     *            is a reserved keyword.
     * @param values One or more expected byte values.  The bytes must be
     *               specified in the same order as they will be received from
     *               the device (e.g. in little-endian order).
     */
    explicit I2CCompareBytesAction(uint8_t reg,
                                   const std::vector<uint8_t>& values) :
        I2CCompareBytesAction(reg, values,
                              std::vector<uint8_t>(values.size(), 0xFF))
    {
    }

    /**
     * Constructor.
     *
     * Throws an exception if any of the input parameters are invalid.
     *
     * @param reg Device register address.  Note: named 'reg' because 'register'
     *            is a reserved keyword.
     * @param values One or more expected byte values.  The bytes must be
     *               specified in the same order as they will be received from
     *               the device (e.g. in little-endian order).
     * @param masks One or more bit masks.  The number of bit masks must match
     *              the number of expected byte values.  Each mask specifies
     *              which bits should be compared within the corresponding byte
     *              value.  Only the bits with a value of 1 in the mask will be
     *              compared.
     */
    explicit I2CCompareBytesAction(uint8_t reg,
                                   const std::vector<uint8_t>& values,
                                   const std::vector<uint8_t>& masks) :
        reg{reg},
        values{values}, masks{masks}
    {
        // Values vector must not be empty
        if (values.size() < 1)
        {
            throw std::invalid_argument{"Values vector is empty"};
        }

        // Masks vector must have same size as values vector
        if (masks.size() != values.size())
        {
            throw std::invalid_argument{"Masks vector has invalid size"};
        }
    }

    /**
     * Executes this action.
     *
     * Compares device register bytes to a list of expected values using the
     * I2C interface.
     *
     * All of the bytes will be read in a single I2C operation.
     *
     * The device register, byte values, and bit masks (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 bytes contained the expected values,
     *         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 values.
     *
     * @return expected values
     */
    const std::vector<uint8_t>& getValues() const
    {
        return values;
    }

    /**
     * Returns the bit masks.
     *
     * Each mask specifies which bits should be compared within the
     * corresponding byte value.  Only the bits with a value of 1 in the mask
     * will be compared.
     *
     * @return bit masks
     */
    const std::vector<uint8_t>& getMasks() const
    {
        return masks;
    }

    /**
     * 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 values.
     */
    const std::vector<uint8_t> values{};

    /**
     * Bit masks.  Each mask specifies which bits should be compared within the
     * corresponding byte value.  Only the bits with a value of 1 in the mask
     * will be compared.
     */
    const std::vector<uint8_t> masks{};
};

} // namespace phosphor::power::regulators
