#ifndef THIRD_PARTY_MILOTIC_EXTERNAL_CC_HFT_SUBSCRIPTION_STORE_H_
#define THIRD_PARTY_MILOTIC_EXTERNAL_CC_HFT_SUBSCRIPTION_STORE_H_

#include <cstddef>
#include <memory>
#include <utility>

#include "absl/base/thread_annotations.h"
#include "absl/container/flat_hash_map.h"
#include "absl/status/status.h"
#include "absl/synchronization/mutex.h"
#include "nlohmann/json.hpp"
#include "subscription_params.pb.h"

namespace milotic_hft {

class SubscriptionStore;

// A subscription to a data source.
class Subscription {
 public:
  Subscription(size_t subscription_id,
               std::unique_ptr<SubscriptionParams> subscription_params,
               SubscriptionStore* subscription_store)
      : subscription_id_(subscription_id),
        subscription_params_(std::move(subscription_params)),
        subscription_store_(subscription_store) {}
  virtual ~Subscription() = 0;
  virtual const SubscriptionParams& GetParams() const = 0;
  virtual void Cancel() = 0;
  virtual nlohmann::json ToJson() const = 0;

 private:
  const size_t subscription_id_;
  const std::unique_ptr<SubscriptionParams> subscription_params_;
  SubscriptionStore* subscription_store_;
};

// A store of subscriptions.
class SubscriptionStore {
 public:
  virtual ~SubscriptionStore() = 0;

  virtual absl::Status AddSubscription(
      std::unique_ptr<Subscription> subscription) = 0;
  virtual absl::Status RemoveSubscription(size_t subscription_id) = 0;
  virtual nlohmann::json ToJson() const = 0;

 private:
  absl::Mutex mutex_;
  absl::flat_hash_map<size_t, std::unique_ptr<Subscription>> subscriptions_
      ABSL_GUARDED_BY(mutex_);
};

}  // namespace milotic_hft

#endif  // THIRD_PARTY_MILOTIC_EXTERNAL_CC_HFT_SUBSCRIPTION_STORE_H_
