#include "subscription_tracker.h"

#include <optional>

#include "absl/status/status.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/substitute.h"
#include "absl/synchronization/mutex.h"
#include "config_parser.h"

namespace milotic::authz {

namespace {
constexpr int kDefaultSubscriptionLimit = 1;
}  // namespace

SubscriptionTracker::SubscriptionTracker()
    : SubscriptionTracker(kDefaultSubscriptionLimit) {}

absl::Status SubscriptionTracker::RecordNewUnsubscription(
    const PeerSpiffeIdentity& peer) {
  std::optional<AuthzConfiguration::SpiffeIdentityMatcher> peer_matcher =
      AuthzConfiguration::CreateIdentityMatcherFromPeerSpiffeIdentity(peer);

  if (!peer_matcher) {
    return absl::InvalidArgumentError(
        absl::StrCat("Peer spiffe id '", peer.spiffe_id, "' is malformed"));
  }

  absl::MutexLock lock(mutex_);
  auto it = peer_to_subscription_count_.find(*peer_matcher);
  if (it == peer_to_subscription_count_.end()) {
    return absl::OkStatus();
  }

  it->second--;
  if (it->second == 0) {
    peer_to_subscription_count_.erase(it);
  }

  return absl::OkStatus();
}

absl::Status SubscriptionTracker::RecordNewSubscription(
    const PeerSpiffeIdentity& peer) {
  std::optional<AuthzConfiguration::SpiffeIdentityMatcher> peer_matcher =
      AuthzConfiguration::CreateIdentityMatcherFromPeerSpiffeIdentity(peer);

  if (!peer_matcher) {
    return absl::InvalidArgumentError(
        absl::StrCat("Peer spiffe id '", peer.spiffe_id, "' is malformed"));
  }

  absl::MutexLock lock(mutex_);
  auto it = peer_to_subscription_count_.find(*peer_matcher);
  if (it == peer_to_subscription_count_.end()) {
    peer_to_subscription_count_.insert({*peer_matcher, 1});
    return absl::OkStatus();
  }

  if (it->second >= universal_subscription_limit_) {
    return absl::PermissionDeniedError(absl::Substitute(
        "Peer '$0' has reached the limit; the limit is '$1'; currently used "
        "'$2'",
        peer.DebugString(), universal_subscription_limit_, it->second));
  }
  it->second++;
  return absl::OkStatus();
}

}  // namespace milotic::authz
