#ifndef PRODUCTION_BORG_MGMT_NODE_PROXY_SAFEPOWER_SAFEPOWER_AGENT_SAFEPOWER_AGENT_H_
#define PRODUCTION_BORG_MGMT_NODE_PROXY_SAFEPOWER_SAFEPOWER_AGENT_SAFEPOWER_AGENT_H_

#include <memory>
#include <utility>

#include "action_context.h"
#include "safepower_agent.grpc.pb.h"
#include "safepower_agent.pb.h"
#include "state_updater.h"
#include "absl/base/nullability.h"
#include "grpcpp/server_context.h"
#include "grpcpp/support/server_callback.h"

namespace safepower_agent {
class SafepowerLocalAgentImpl
    : public safepower_agent_proto::SafepowerLocalAgent::CallbackService {
 public:
  explicit SafepowerLocalAgentImpl(
      const 
      std::shared_ptr<StateUpdater<safepower_agent_proto::SystemState>>&
          system_state_updater,
       std::unique_ptr<ActionContextManager> action_context_manager)
      : system_state_updater_(system_state_updater),
        action_context_manager_(std::move(action_context_manager)) {}

  grpc::ServerUnaryReactor* StartAction(
      grpc::CallbackServerContext* context,
      const safepower_agent_proto::StartActionRequest* request,
      safepower_agent_proto::StartActionResponse* response) override;

  grpc::ServerWriteReactor<safepower_agent_proto::ActionStateLog>*
  MonitorAction(
      grpc::CallbackServerContext* context,
      const safepower_agent_proto::MonitorActionRequest* request) override;

  grpc::ServerWriteReactor<safepower_agent_proto::SystemState>* MonitorState(
      grpc::CallbackServerContext* context,
      const safepower_agent_proto::MonitorStateRequest* request) override;

  grpc::ServerUnaryReactor* GetSupportedActions(
      grpc::CallbackServerContext* context,
      const safepower_agent_proto::GetSupportedActionsRequest* request,
      safepower_agent_proto::GetSupportedActionsResponse* response) override;

 private:
   std::shared_ptr<StateUpdater<safepower_agent_proto::SystemState>>
      system_state_updater_;
   std::unique_ptr<ActionContextManager> action_context_manager_;
};

}  // namespace safepower_agent

#endif  // PRODUCTION_BORG_MGMT_NODE_PROXY_SAFEPOWER_SAFEPOWER_AGENT_SAFEPOWER_AGENT_H_
