#ifndef THIRD_PARTY_MILOTIC_EXTERNAL_CC_AUTHZ_SUBSCRIPTION_TRACKER_H_
#define THIRD_PARTY_MILOTIC_EXTERNAL_CC_AUTHZ_SUBSCRIPTION_TRACKER_H_

#include <cstdint>
#include <map>

#include "absl/base/thread_annotations.h"
#include "absl/status/status.h"
#include "absl/synchronization/mutex.h"
#include "config_parser.h"

namespace milotic::authz {

class SubscriptionTracker {
 public:
  SubscriptionTracker();
  explicit SubscriptionTracker(int universal_subscription_limit)
      : universal_subscription_limit_(universal_subscription_limit) {}

  // Records a new subscription for the given `peer`.
  // Returns error if the client has reached to the subscription limit.
  absl::Status RecordNewSubscription(const PeerSpiffeIdentity& peer);

  // Records the an unsubscription for the given `peer`.
  absl::Status RecordNewUnsubscription(const PeerSpiffeIdentity& peer);

  // Returns the subscription limit for the given `peer`. Currently returns the
  // universal subscription limit.
  int64_t GetSubscriptionLimit(const PeerSpiffeIdentity&) {
    absl::MutexLock lock(mutex_);
    return universal_subscription_limit_;
  }

  // Sets the limit for the universal subscription limit.
  // Will be called when authorization policy is reloaded.
  void SetUniversalSubscriptionLimit(int64_t limit) {
    absl::MutexLock lock(mutex_);
    universal_subscription_limit_ = limit;
  }

 private:
  absl::Mutex mutex_;
  int64_t universal_subscription_limit_ ABSL_GUARDED_BY(mutex_) = 0;
  std::map<AuthzConfiguration::SpiffeIdentityMatcher, int64_t>
      peer_to_subscription_count_ ABSL_GUARDED_BY(mutex_);
};
}  // namespace milotic::authz

#endif  // THIRD_PARTY_MILOTIC_EXTERNAL_CC_AUTHZ_SUBSCRIPTION_TRACKER_H_
