/**
 * Copyright © 2019 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.hpp"
#include "action_environment.hpp"
#include "action_utils.hpp"

#include <memory>
#include <string>
#include <utility>
#include <vector>

namespace phosphor::power::regulators
{

/**
 * @class Rule
 *
 * A rule is a sequence of actions that can be shared by multiple voltage
 * regulators.
 *
 * Rules define a standard way to perform an operation.  For example, the
 * following action sequences might be sharable using a rule:
 * - Actions that set the output voltage of a regulator rail
 * - Actions that read all the sensors of a regulator rail
 * - Actions that detect down-level hardware using version registers
 */
class Rule
{
  public:
    // Specify which compiler-generated methods we want
    Rule() = delete;
    Rule(const Rule&) = delete;
    Rule(Rule&&) = delete;
    Rule& operator=(const Rule&) = delete;
    Rule& operator=(Rule&&) = delete;
    ~Rule() = default;

    /**
     * Constructor.
     *
     * @param id unique rule ID
     * @param actions actions in the rule
     */
    explicit Rule(const std::string& id,
                  std::vector<std::unique_ptr<Action>> actions) :
        id{id},
        actions{std::move(actions)}
    {}

    /**
     * Executes the actions in this rule.
     *
     * Returns the return value from the last action.
     *
     * Throws an exception if an error occurs and an action cannot be
     * successfully executed.
     *
     * @param environment action execution environment
     * @return return value from last action in rule
     */
    bool execute(ActionEnvironment& environment)
    {
        return action_utils::execute(actions, environment);
    }

    /**
     * Returns the actions in this rule.
     *
     * @return actions in rule
     */
    const std::vector<std::unique_ptr<Action>>& getActions() const
    {
        return actions;
    }

    /**
     * Returns the unique ID of this rule.
     *
     * @return rule ID
     */
    const std::string& getID() const
    {
        return id;
    }

  private:
    /**
     * Unique ID of this rule.
     */
    const std::string id{};

    /**
     * Actions in this rule.
     */
    std::vector<std::unique_ptr<Action>> actions{};
};

} // namespace phosphor::power::regulators
