#include "logging.hpp"
#include "request_stats.hpp"

#include <memory>
#include <thread>

#include <gmock/gmock.h>
#include <gtest/gtest.h>

namespace managedStore
{
namespace
{

using testing::_;
using testing::DoAll;
using testing::InvokeArgument;
using testing::Return;

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

    BMCWEB_LOG_INFO << "ping: statsStore: " << statsStore.toJson();
    EXPECT_EQ(true, statsStoreConfig.enable);

    const auto nowPlus500 =
        managedStore::clockNow() + std::chrono::milliseconds(500);
    const auto nowPlus800 =
        managedStore::clockNow() + std::chrono::milliseconds(800);

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

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

    auto statsStoreJson = statsStore.toJson();
    BMCWEB_LOG_INFO << "statsStoreJson: " << statsStoreJson;

    // 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, statsStoreJson["config"]["enable"]);

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

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

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

} // namespace
} // namespace managedStore
