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

#include <ios>
#include <sstream>
#include <string>

namespace phosphor::power::regulators
{

/**
 * @class ComparePresenceAction
 *
 * Compares a hardware component's presence to an expected value.
 *
 * Implements the compare_presence action in the JSON config file.
 */
class ComparePresenceAction : public Action
{
  public:
    // Specify which compiler-generated methods we want
    ComparePresenceAction() = delete;
    ComparePresenceAction(const ComparePresenceAction&) = delete;
    ComparePresenceAction(ComparePresenceAction&&) = delete;
    ComparePresenceAction& operator=(const ComparePresenceAction&) = delete;
    ComparePresenceAction& operator=(ComparePresenceAction&&) = delete;
    virtual ~ComparePresenceAction() = default;

    /**
     * Constructor.
     *
     * @param fru Field-Replaceable Unit (FRU)
     * @param value Expected presence value
     */
    explicit ComparePresenceAction(const std::string& fru, bool value) :
        fru{fru}, value{value}
    {
    }

    /**
     * Executes this action.
     *
     * TODO: Not implemented yet
     *
     * @param environment Action execution environment.
     * @return true
     */
    virtual bool execute(ActionEnvironment& /* environment */) override
    {
        // TODO: Not implemented yet
        return true;
    }

    /**
     * Returns the Field-Replaceable Unit (FRU).
     *
     * @return FRU
     */
    const std::string& getFRU() const
    {
        return fru;
    }

    /**
     * Returns the expected presence value.
     *
     * @return value
     */
    bool getValue() const
    {
        return value;
    }

    /**
     * Returns a string description of this action.
     *
     * @return description of action
     */
    virtual std::string toString() const override
    {
        std::ostringstream ss;
        ss << "compare_presence: { ";

        ss << "fru: " << fru << ", ";

        ss << "value: " << std::boolalpha << value << " }";

        return ss.str();
    }

  private:
    /**
     * Field-Replaceable Unit (FRU) for this action.
     *
     * Specify the D-Bus inventory path of the FRU.
     */
    const std::string fru{};

    /**
     * Expected presence value.
     */
    const bool value{};
};

} // namespace phosphor::power::regulators
