#include "request_stats.hpp"

#include <chrono>  // NOLINT
#include <string>

#include <gtest/gtest.h>
#include "logging.hpp"
#include "managed_store_clock.hpp"

namespace managedStore {
namespace {

TEST(RequestStatsTest, TestStatsStore) {
  auto stats_store_config = managedStore::RequestStatsStoreConfig();
  stats_store_config.enable = true;
  auto stats_store = managedStore::RequestStatsStore(stats_store_config);

  BMCWEB_LOG_INFO << "ping: stats_store: " << stats_store.toJson();
  EXPECT_EQ(true, stats_store_config.enable);

  const auto now_plus_500 =
      managedStore::clockNow() + std::chrono::milliseconds(500);
  const auto now_plus_800 =
      managedStore::clockNow() + std::chrono::milliseconds(800);

  const std::string rq_batman = "/batman/was/here";
  {
    auto rq = managedStore::RequestStatsContext(rq_batman);
    rq.setOK(false);
    stats_store.logRequestStats(now_plus_500, rq);
  }

  const std::string rq_superman = "/superman/was/here";
  {
    auto rq = managedStore::RequestStatsContext(rq_superman);
    rq.setOK(true);
    stats_store.logRequestStats(now_plus_800, rq);
  }

  auto stats_store_json = stats_store.toJson();
  BMCWEB_LOG_INFO << "stats_store_json: " << stats_store_json;

  // expected:
  // =========
  // {
  //   "config": {
  //     "enable": true
  //   },
  //   "statsMap": {
  //     "/batman/was/here": {
  //       "countError": 1,
  //       "countOK": 0,
  //       "latencyHistogram": [
  //         {
  //           "count": 1,
  //           "milliseconds": 400
  //         }
  //       ],
  //       "queryURLKey": "/batman/was/here"
  //     },
  //     "/superman/was/here": {
  //       "countError": 0,
  //       "countOK": 1,
  //       "latencyHistogram": [
  //         {
  //           "count": 1,
  //           "milliseconds": 700
  //         }
  //       ],
  //       "queryURLKey": "/superman/was/here"
  //     }
  //   }
  // }

  EXPECT_EQ(true, stats_store_json["config"]["enable"]);

  EXPECT_EQ(1, stats_store_json["statsMap"]["/batman/was/here"]["countError"]);
  EXPECT_EQ(0, stats_store_json["statsMap"]["/batman/was/here"]["countOK"]);
  EXPECT_EQ(1, stats_store_json["statsMap"]["/batman/was/here"]
                               ["latencyHistogram"][0]["count"]);
  EXPECT_EQ(500, stats_store_json["statsMap"]["/batman/was/here"]
                                 ["latencyHistogram"][0]["milliseconds"]);
  EXPECT_EQ("/batman/was/here",
            stats_store_json["statsMap"]["/batman/was/here"]["target"]);

  EXPECT_EQ(0,
            stats_store_json["statsMap"]["/superman/was/here"]["countError"]);
  EXPECT_EQ(1, stats_store_json["statsMap"]["/superman/was/here"]["countOK"]);
  EXPECT_EQ(1, stats_store_json["statsMap"]["/superman/was/here"]
                               ["latencyHistogram"][0]["count"]);
  EXPECT_EQ(800, stats_store_json["statsMap"]["/superman/was/here"]
                                 ["latencyHistogram"][0]["milliseconds"]);
  EXPECT_EQ("/superman/was/here",
            stats_store_json["statsMap"]["/superman/was/here"]["target"]);

  // clear the store should reset all the stats:
  stats_store.clear();
  EXPECT_EQ(0, stats_store.queryStats().size());
}

}  // namespace
}  // namespace managedStore
