#include "mocks/sensor_mock.hpp"
#include "printers.hpp"
#include "sensor_cache.hpp"
#include "utils/sensor_id_eq.hpp"

#include <initializer_list>

#include <gmock/gmock.h>

using namespace testing;

class TestSensorCache : public Test
{
  public:
    SensorCache sut;
};

struct IdParam
{
    IdParam() = default;
    IdParam(std::string_view service, std::string_view path) :
        service(service), path(path)
    {}

    std::string service;
    std::string path;
};

class TestSensorCacheP :
    public TestSensorCache,
    public WithParamInterface<std::vector<IdParam>>
{
  public:
    void SetUp() override
    {
        auto vec = GetParam();
        ASSERT_THAT(vec, SizeIs(param.size()));
        std::copy(vec.begin(), vec.end(), param.begin());
    }

    template <size_t index>
    const IdParam& id() const
    {
        static_assert(index < std::tuple_size_v<decltype(param)>);
        return param[index];
    }

  private:
    std::array<IdParam, 2> param;
};

INSTANTIATE_TEST_SUITE_P(
    UniqueIds, TestSensorCacheP,
    Values(std::vector<IdParam>({IdParam("service1", "path1"),
                                 IdParam("service1", "path2")}),
           std::vector<IdParam>({IdParam("service1", "path1"),
                                 IdParam("service2", "path1")}),
           std::vector<IdParam>({IdParam("service1", "path1"),
                                 IdParam("service2", "path2")})));

TEST_P(TestSensorCacheP, shouldReturnDifferentSensorWhenIdsAreDifferent)
{
    auto sensor1 =
        sut.makeSensor<NiceMock<SensorMock>>(id<0>().service, id<0>().path);
    auto sensor2 =
        sut.makeSensor<NiceMock<SensorMock>>(id<1>().service, id<1>().path);

    ASSERT_THAT(sensor1.get(), Not(Eq(sensor2.get())));
    ASSERT_THAT(sensor1->mockId, Not(Eq(sensor2->mockId)));
}

TEST_F(TestSensorCache, shouldReturnSameSensorWhenSensorWithSameIdStillExists)
{
    auto sensor1 =
        sut.makeSensor<NiceMock<SensorMock>>("sensor-service", "sensor-path");
    auto sensor2 =
        sut.makeSensor<NiceMock<SensorMock>>("sensor-service", "sensor-path");

    ASSERT_THAT(sensor1.get(), Eq(sensor2.get()));
    ASSERT_THAT(sensor1->mockId, Eq(sensor2->mockId));
}

TEST_F(TestSensorCache, shouldReturnDifferentSensorWhenPreviousSensorExpired)
{
    auto mockId1 =
        sut.makeSensor<NiceMock<SensorMock>>("sensor-service", "sensor-path")
            ->mockId;
    auto mockId2 =
        sut.makeSensor<NiceMock<SensorMock>>("sensor-service", "sensor-path")
            ->mockId;

    ASSERT_THAT(mockId2, Not(Eq(mockId1)));
}

TEST_F(TestSensorCache, shouldCreateSensorWithCorrespondingId)
{
    auto id =
        sut.makeSensor<NiceMock<SensorMock>>("sensor-service", "sensor-path")
            ->id();

    auto expected = SensorMock::makeId("sensor-service", "sensor-path");

    ASSERT_THAT(id, sensorIdEq(expected));
}
