#ifndef PRODUCTION_SUSHID_SAFEPOWER_AGENT_SAFEPOWER_AGENT_H_
#define PRODUCTION_SUSHID_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 absl::Nonnull<
          std::shared_ptr<StateUpdater<safepower_agent_proto::SystemState>>>&
          system_state_updater,
      absl::Nonnull<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:
  absl::Nonnull<
      std::shared_ptr<StateUpdater<safepower_agent_proto::SystemState>>>
      system_state_updater_;
  absl::Nonnull<std::unique_ptr<ActionContextManager>> action_context_manager_;
};

}  // namespace safepower_agent

#endif  // PRODUCTION_SUSHID_SAFEPOWER_AGENT_SAFEPOWER_AGENT_H_
