#include "bmc/register_actions_bmc.h"
#include <safepower_agent.pb.h>

#include <gmock/gmock.h>
#include <gtest/gtest.h>

#include "absl/log/log.h"
#include "action_context.h"
#include "state_updater.h"

namespace safepower_agent {

namespace {

bool isASanEnabled() {
  return std::getenv("ASAN_OPTIONS") != nullptr;
}
using safepower_agent_proto::ActionType;
using safepower_agent_proto::ActionSeverity;

TEST(RegisterActionsTest, RegisterAction ) {
    if (isASanEnabled())
    {
       LOG(ERROR) << "b/349393089 absl::map insert fails asan" << std::endl;
       GTEST_SKIP() << "Skipping test in ASan environment.";
       // TODO b/349393089 absl::map insert fails asan
       // Error message //https://paste.googleplex.com/6557456877748224
    }
    safepower_agent_proto::SystemState initialState;
    auto reactor =
        std::make_shared<StateUpdater<safepower_agent_proto::SystemState>>(
            std::move(initialState), true);
    auto action_context_manager =
        std::make_unique<safepower_agent::ActionContextManager>(reactor);
  safepower_agent_config::SafePowerAgentConfig safepower_agent_config;

  std::vector<std::tuple<ActionType,
                         ActionSeverity, std::string, std::string> > data = {
      {
        {safepower_agent_proto::ACTION_TYPE_CYCLE},
        {safepower_agent_proto::ACTION_SEVERITY_FORCE},
        {"/redfish/v1/Systems/system/Actions/ComputerSystem.Reset"},
        {"/{\"ResetType\":\"ForceRestart\"/}"}},
      {
        {safepower_agent_proto::ACTION_TYPE_CYCLE},
        {safepower_agent_proto::ACTION_SEVERITY_GRACEFUL},
        {"/redfish/v1/Systems/system/Actions/ComputerSystem.Reset"},
        {"/{\"ResetType\":\"GracefulRestart\"/}"}}
      };
    for (auto [action_type, action_severity, uri, json_body] : data) {
    safepower_agent_config::ActionConfig* action_config =
        safepower_agent_config.add_action_configs();
    action_config->mutable_action()->set_action_type(action_type);
    action_config->mutable_action()->set_action_severity(action_severity);
    action_config->mutable_redfish()->set_uri(uri);
    action_config->mutable_redfish()->set_json_body(json_body);
  };

  (void)RegisterActionFromConfig(action_context_manager.get(),
                                       safepower_agent_config);

  safepower_agent_proto::GetSupportedActionsResponse response;
  action_context_manager->GetSupportedActions(response);
  EXPECT_EQ(response.actions_size(), 2);
  for (const auto& action : response.actions()) {
    EXPECT_EQ(action.action_type(), safepower_agent_proto::ACTION_TYPE_CYCLE);
    EXPECT_THAT(action.action_severity(), testing::AnyOf(
              safepower_agent_proto::ACTION_SEVERITY_FORCE,
              safepower_agent_proto::ACTION_SEVERITY_GRACEFUL));
  }
}


}  // namespace

}  // namespace safepower_agent
