#ifndef THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_HAL_IPC_CLIENT_H_
#define THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_HAL_IPC_CLIENT_H_

#include <cstdint>
#include <memory>
#include <string>

#include "absl/base/thread_annotations.h"
#include "absl/container/flat_hash_map.h"
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "absl/synchronization/mutex.h"
#include "tlbmc/hal/shared_mem/metrics.h"
#include "tlbmc/hal/shared_mem/segment_manager.h"
#include "tlbmc/hal/shared_mem/sensors.h"

namespace milotic_tlbmc {

class IpcClient {
 public:
  virtual ~IpcClient() = default;
  // Updates the sensor value.
  // Returns whether the update is successful.
  virtual absl::Status UpdateSensorValue(const std::string& sensor_name,
                                         float value) = 0;
  // Updates the sensor value and timestamp.
  // Returns whether the update is successful.
  virtual absl::Status UpdateSensorValue(const std::string& sensor_name,
                                         float value, uint64_t timestamp) = 0;

  virtual const TlbmcMetrics* GetMetrics() = 0;
};

// The class is thread-safe.
class SharedMemoryClient : public IpcClient {
 private:
  class Token;

 public:
  static IpcClient& GetInstance();
  // Avoid permission issues in /run/.
  static void SetUpInstanceForUnitTest();
  SharedMemoryClient(Token token, const std::string& initialized_file_path,
                     std::unique_ptr<SegmentManager> segment_manager);

  virtual ~SharedMemoryClient() = default;
  // Updates the sensor value in the shared memory.
  absl::Status UpdateSensorValue(const std::string& sensor_name,
                                 float value) override;
  absl::Status UpdateSensorValue(const std::string& sensor_name, float value,
                                 uint64_t timestamp) override;
  const TlbmcMetrics* GetMetrics() override;

 protected:
  SharedMemoryClient(const std::string& initialized_file_path,
                     std::unique_ptr<SegmentManager> segment_manager);
  // For testing only. Provides the ability to set `initialized_file_path` which
  // works in test environment.
  static IpcClient& GetInstance(const std::string& initialized_file_path);
  SharedMemoryClient() = default;
  SegmentManager* GetSegmentManager()
      ABSL_LOCKS_EXCLUDED(segment_manager_mutex_);
  void SetSegmentManager(std::unique_ptr<SegmentManager> segment_manager)
      ABSL_LOCKS_EXCLUDED(segment_manager_mutex_);
  IpcSensor* GetSensor(const std::string& sensor_name)
      ABSL_LOCKS_EXCLUDED(sensors_mutex_);

 private:
  class Token {
   private:
    explicit Token() = default;
    friend SharedMemoryClient;
  };

  const std::string initialized_file_path_;
  absl::Mutex segment_manager_mutex_;
  std::unique_ptr<SegmentManager> segment_manager_
      ABSL_GUARDED_BY(segment_manager_mutex_);
  absl::Mutex sensors_mutex_;
  absl::flat_hash_map<std::string, IpcSensor*> sensors_
      ABSL_GUARDED_BY(sensors_mutex_);

  absl::Mutex metrics_mutex_;
  TlbmcMetrics* metrics_ ABSL_GUARDED_BY(metrics_mutex_) = nullptr;
};

}  // namespace milotic_tlbmc

#endif  // THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_HAL_IPC_CLIENT_H_
