
#ifndef THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_HAL_SHARED_MEM_STATIC_SHARED_MEMORY_SERVER_IMPL_H
#define THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_HAL_SHARED_MEM_STATIC_SHARED_MEMORY_SERVER_IMPL_H
#include <cstdint>
#include <memory>
#include <string>
#include <string_view>
#include <utility>

#include "absl/container/flat_hash_map.h"
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "absl/time/time.h"
#include "absl/types/span.h"
#include "tlbmc/hal/shared_mem/metrics.h"
#include "tlbmc/hal/shared_mem/sensors.h"
#include "tlbmc/hal/shared_mem/server_interface.h"
#include "tlbmc/hal/shared_mem/static_shm_common.h"

namespace milotic_tlbmc {
class StaticSharedMemoryServer : public IpcServer {
 public:
  StaticSharedMemoryServer(const StaticSharedMemoryServer& other) = delete;
  StaticSharedMemoryServer(StaticSharedMemoryServer&& other) noexcept = delete;
  StaticSharedMemoryServer& operator=(const StaticSharedMemoryServer& other) =
      delete;
  StaticSharedMemoryServer& operator=(
      StaticSharedMemoryServer&& other) noexcept = delete;
  static absl::Status InitializeSharedMemoryForUnitTest(
      absl::Span<const std::string> shm_sensors);
  static void SetupInstanceForUnitTest();
  static absl::Status InitializeSharedMemory(
      absl::Span<const std::string> shm_sensors);
  static absl::Status InitializeSharedMemory(
      const std::string& initialized_file_path, const std::string& shm_name,
      absl::Span<const std::string> shm_sensors);
  static IpcServer& GetInstance();

  static IpcServer& GetInstance(const std::string& initialized_file_path,
                                const std::string& shm_name,
                                bool force_reset_for_testing = false);
  absl::StatusOr<std::pair<float, uint64_t>> ReadSensorValue(
      const std::string& sensor_name) override;
  // copybara:strip_begin(g3-shared-libs)
  void UpdateMetricsRequestCount(bool is_tlbmc_request) override;
  void UpdateMetricsResponse(absl::Duration response_time, int status_code,
                             std::string_view resource_url) override;
  void UpdateMetricsRps(absl::Duration time_delta) override;
  // copybara:strip_end

  StaticSharedMemoryServer(
      std::unique_ptr<TlbmcSharedMemoryType> memory,
      absl::flat_hash_map<std::string, IpcSensor*> name_to_sensor,
      TlbmcMetrics* metrics);
  ~StaticSharedMemoryServer() override = default;

 protected:
  StaticSharedMemoryServer() = default;
  static std::unique_ptr<IpcServer> PerformServerInit(
      const std::string& initialized_file_path, const std::string& shm_name);

 private:
  std::unique_ptr<TlbmcSharedMemoryType> memory_;
  absl::flat_hash_map<std::string, IpcSensor*> name_to_sensor_;
  TlbmcMetrics* metrics_;
};

}  // namespace milotic_tlbmc
#endif  // THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_HAL_SHARED_MEM_STATIC_SHARED_MEMORY_SERVER_IMPL_H
