/**
 * 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 "rule.hpp"

#include <string>

namespace phosphor::power::regulators
{

/**
 * @class RunRuleAction
 *
 * Runs the specified rule.
 *
 * Implements the run_rule action in the JSON config file.
 */
class RunRuleAction : public Action
{
  public:
    // Specify which compiler-generated methods we want
    RunRuleAction() = delete;
    RunRuleAction(const RunRuleAction&) = delete;
    RunRuleAction(RunRuleAction&&) = delete;
    RunRuleAction& operator=(const RunRuleAction&) = delete;
    RunRuleAction& operator=(RunRuleAction&&) = delete;
    virtual ~RunRuleAction() = default;

    /**
     * Constructor.
     *
     * @param ruleID rule ID
     */
    explicit RunRuleAction(const std::string& ruleID) : ruleID{ruleID}
    {
    }

    /**
     * Executes this action.
     *
     * Runs the rule specified in the constructor.
     *
     * Returns the return value from the last action in the rule.
     *
     * 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
     */
    virtual bool execute(ActionEnvironment& environment) override
    {
        // Increment rule call stack depth since we are running a rule.  Rule
        // depth is used to detect infinite recursion.
        environment.incrementRuleDepth(ruleID);

        // Execute rule
        bool returnValue = environment.getRule(ruleID).execute(environment);

        // Decrement rule depth since rule has returned
        environment.decrementRuleDepth();

        return returnValue;
    }

    /**
     * Returns the rule ID.
     *
     * @return rule ID
     */
    const std::string& getRuleID() const
    {
        return ruleID;
    }

    /**
     * Returns a string description of this action.
     *
     * @return description of action
     */
    virtual std::string toString() const override
    {
        return "run_rule: " + ruleID;
    }

  private:
    /**
     * Rule ID.
     */
    const std::string ruleID{};
};

} // namespace phosphor::power::regulators
