#include "helpers.hpp"
#include "utils/labeled_tuple.hpp"

#include <iostream>
#include <limits>

#include <gmock/gmock.h>

using namespace testing;

struct TestingLabelDouble
{
    static std::string str()
    {
        return "DoubleValue";
    }
};

struct TestingLabelString
{
    static std::string str()
    {
        return "StringValue";
    }
};

using LabeledTestingTuple =
    utils::LabeledTuple<std::tuple<double, std::string>, TestingLabelDouble,
                        TestingLabelString>;

class TestLabeledTupleDoubleSpecialization :
    public Test,
    public WithParamInterface<
        std::tuple<double, std::variant<double, std::string>>>
{
  public:
    const std::string string_value = "Some value";
};

TEST_P(TestLabeledTupleDoubleSpecialization,
       serializeAndDeserializeMakesSameTuple)
{
    auto [double_value, expected_serialized_value] = GetParam();
    LabeledTestingTuple initial(double_value, string_value);
    nlohmann::json serialized(initial);

    EXPECT_EQ(serialized["StringValue"], string_value);

    auto& actual_serialized_value = serialized["DoubleValue"];
    if (std::holds_alternative<std::string>(expected_serialized_value))
    {
        EXPECT_TRUE(actual_serialized_value.is_string());
        EXPECT_EQ(actual_serialized_value.get<std::string>(),
                  std::get<std::string>(expected_serialized_value));
    }
    else
    {
        EXPECT_TRUE(actual_serialized_value.is_number());
        EXPECT_EQ(actual_serialized_value.get<double>(),
                  std::get<double>(expected_serialized_value));
    }

    LabeledTestingTuple deserialized = serialized.get<LabeledTestingTuple>();
    EXPECT_EQ(initial, deserialized);
}

INSTANTIATE_TEST_SUITE_P(
    _, TestLabeledTupleDoubleSpecialization,
    Values(std::make_tuple(10.0, std::variant<double, std::string>(10.0)),
           std::make_tuple(std::numeric_limits<double>::infinity(),
                           std::variant<double, std::string>("inf")),
           std::make_tuple(-std::numeric_limits<double>::infinity(),
                           std::variant<double, std::string>("-inf")),
           std::make_tuple(std::numeric_limits<double>::quiet_NaN(),
                           std::variant<double, std::string>("NaN"))));

TEST(TestLabeledTupleDoubleSpecializationNegative,
     ThrowsWhenUnknownLiteralDuringDeserialization)
{
    nlohmann::json data = nlohmann::json{{"DoubleValue", "FooBar"},
                                         {"StringValue", "Some Text Val"}};

    EXPECT_THROW(data.get<LabeledTestingTuple>(), std::invalid_argument);
}
