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

#include <sdbusplus/exception.hpp>

#include <gmock/gmock.h>

using namespace testing;
using namespace std::literals::string_literals;

class ScenarioBase : public Test
{
  public:
    std::string_view defaultName = "defName";
    size_t maxSize = 32;
    std::vector<std::string> conflicts;
};

class ScenarioNameProvided : public ScenarioBase
{
  public:
    auto generateId(std::string_view id, std::string_view name) const
    {
        return utils::generateId(id, name, defaultName, conflicts, maxSize);
    }
};

class TestGenerateIdNameProvided : public ScenarioNameProvided
{};

TEST_F(TestGenerateIdNameProvided, usesIdWhenProvided)
{
    const std::string name = "name";

    EXPECT_THAT(this->generateId("id0", name), Eq(std::pair{"id0"s, name}));
    EXPECT_THAT(this->generateId("/id1", name), Eq(std::pair{"id1"s, name}));
    EXPECT_THAT(this->generateId("prefix/id2", name),
                Eq(std::pair{"prefix/id2"s, name}));
}

TEST_F(TestGenerateIdNameProvided, usedDefaultWhenNothingProvided)
{
    this->defaultName = "def";

    EXPECT_THAT(this->generateId("", ""), Eq(std::pair{"def"s, "def"s}));
    EXPECT_THAT(this->generateId("/", ""), Eq(std::pair{"def"s, "def"s}));
    EXPECT_THAT(this->generateId("abc/", ""),
                Eq(std::pair{"abc/def"s, "def"s}));
}

class ScenarioNameNotProvided : public ScenarioBase
{
  public:
    auto generateId(std::string_view id, std::string_view name) const
    {
        return utils::generateId(id, "", name, conflicts, maxSize);
    }
};

class TestGenerateIdNameNotProvided : public ScenarioNameNotProvided
{};

TEST_F(TestGenerateIdNameNotProvided, usesIdAsNameWhenProvided)
{
    EXPECT_THAT(this->generateId("id0", defaultName),
                Eq(std::pair{"id0"s, "id0"s}));
    EXPECT_THAT(this->generateId("/id1", defaultName),
                Eq(std::pair{"id1"s, "id1"s}));
    EXPECT_THAT(this->generateId("prefix/id2", defaultName),
                Eq(std::pair{"prefix/id2"s, "id2"s}));
}

template <class Scenario>
class TestGenerateId : public Scenario
{};

using TestScenarios =
    ::testing::Types<ScenarioNameProvided, ScenarioNameNotProvided>;
TYPED_TEST_SUITE(TestGenerateId, TestScenarios);

TEST_F(TestGenerateIdNameNotProvided, leadingSlashDoesntCountToLengthLimit)
{
    this->maxSize = 2;

    EXPECT_THAT(this->generateId("12", "default").first, Eq("12"));
    EXPECT_THAT(this->generateId("/23", "default").first, Eq("23"));
    EXPECT_THROW(this->generateId("123", "trigger"),
                 sdbusplus::exception::SdBusError);
}

TYPED_TEST(TestGenerateId, throwsWhenProvidedIdIsTooLong)
{
    this->maxSize = 4;

    EXPECT_THROW(this->generateId("12345", "name"),
                 sdbusplus::exception::SdBusError);
    EXPECT_THROW(this->generateId("12/45", "name"),
                 sdbusplus::exception::SdBusError);
    EXPECT_THROW(this->generateId("123/", "trigger"),
                 sdbusplus::exception::SdBusError);
}

TYPED_TEST(TestGenerateId, throwsWhenThereAreNoFreeIds)
{
    this->maxSize = 1;
    this->conflicts = {"n", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};

    EXPECT_THROW(this->generateId("", "n"), sdbusplus::exception::SdBusError);
}

TYPED_TEST(TestGenerateId, throwsWhenIdContainsMoreThanOneSlash)
{
    EXPECT_THROW(this->generateId("/12/", "name"),
                 sdbusplus::exception::SdBusError);
    EXPECT_THROW(this->generateId("12//", "name"),
                 sdbusplus::exception::SdBusError);
    EXPECT_THROW(this->generateId("12//123", "name"),
                 sdbusplus::exception::SdBusError);
    EXPECT_THROW(this->generateId("12/12/123", "name"),
                 sdbusplus::exception::SdBusError);
}

TYPED_TEST(TestGenerateId, usesNamePartOfNameWhenIdNotProvidedAndNameIsTooLong)
{
    this->maxSize = 4;

    this->conflicts = {};
    EXPECT_THAT(this->generateId("", "trigger"),
                Eq(std::pair{"trig"s, "trigger"s}));
    EXPECT_THAT(this->generateId("a/", "trigger"),
                Eq(std::pair{"a/tr"s, "trigger"s}));

    this->conflicts = {"trig"};
    EXPECT_THAT(this->generateId("", "trigger"),
                Eq(std::pair{"tri0"s, "trigger"s}));

    this->conflicts = {"trig", "tri0"};
    EXPECT_THAT(this->generateId("", "trigger"),
                Eq(std::pair{"tri1"s, "trigger"s}));
}

TYPED_TEST(TestGenerateId, throwsWhenProvidedIdIsTaken)
{
    this->conflicts = {"id", "prefix/id"};

    EXPECT_THROW(this->generateId("id", "name"),
                 sdbusplus::exception::SdBusError);
    EXPECT_THROW(this->generateId("/id", "name"),
                 sdbusplus::exception::SdBusError);
    EXPECT_THROW(this->generateId("prefix/id", "name"),
                 sdbusplus::exception::SdBusError);
}

TYPED_TEST(TestGenerateId, usesNameWhenIdNotProvided)
{
    EXPECT_THAT(this->generateId("", "name"), Eq(std::pair{"name"s, "name"s}));
    EXPECT_THAT(this->generateId("/", "name"), Eq(std::pair{"name"s, "name"s}));
    EXPECT_THAT(this->generateId("abc/", "name"),
                Eq(std::pair{"abc/name"s, "name"s}));
    EXPECT_THAT(this->generateId("123/", "name"),
                Eq(std::pair{"123/name"s, "name"s}));
}

TYPED_TEST(TestGenerateId, usesNameWithoutInvalidCharactersWhenIdNotProvided)
{
    EXPECT_THAT(this->generateId("", "n#a$/m@e"),
                Eq(std::pair{"name"s, "n#a$/m@e"s}));
    EXPECT_THAT(this->generateId("", "n!^aŹ/me"),
                Eq(std::pair{"name"s, "n!^aŹ/me"s}));
    EXPECT_THAT(this->generateId("p/", "n!^aŹ/m*(e"),
                Eq(std::pair{"p/name"s, "n!^aŹ/m*(e"s}));
}
