#include <stdplus/print.hpp>
#include <util/mctp_setup.hpp>

#include <unordered_set>

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

using ::testing::HasSubstr;

TEST(GetActiveMctpPortsFound, TestMctpSetup)
{
    std::string commandLineOutput =
        "dev mctpserial0 index 11 address 0x(no-addr) net 4 mtu 68 up\n"
        "dev mctpserial1 index 11 address 0x(no-addr) net 7 mtu 68 up\n";
    std::optional<std::unordered_set<std::string>> ports =
        getActiveMctpPorts(commandLineOutput);
    ASSERT_THAT(ports.has_value(), true);
    ASSERT_THAT(ports.value().size(), 2);
    for (const std::string& port : ports.value())
    {
        ASSERT_THAT(port, HasSubstr("mctpserial"));
    }
}

TEST(GetActiveMctpPortsNotFound, TestMctpSetup)
{
    std::string commandLineOutput =
        "dev lo index 1 address 0x00:00:00:00:00:00 net 1 mtu 65536 up\n"
        "dev mctpi2c6 index 5 address 0x10 net 1 mtu 254 up\n";
    std::optional<std::unordered_set<std::string>> ports =
        getActiveMctpPorts(commandLineOutput);
    ASSERT_THAT(ports.has_value(), false);
}

TEST(ExtractNewNameWithNoPreMctpPort, TestMctpSetup)
{
    std::string preSetupOutput =
        "dev lo index 1 address 0x00:00:00:00:00:00 net 1 mtu 65536 up\n"
        "dev mctpi2c6 index 5 address 0x10 net 1 mtu 254 up\n";

    std::string postSetupOutput =
        "dev lo index 1 address 0x00:00:00:00:00:00 net 1 mtu 65536 up\n"
        "dev mctpi2c6 index 5 address 0x10 net 1 mtu 254 up\n"
        "dev mctpserial0 index 11 address 0x(no-addr) net 4 mtu 68 up\n";

    std::optional<std::string> newPort =
        extractNewName(preSetupOutput, postSetupOutput);

    ASSERT_THAT(newPort.has_value(), true);
    ASSERT_THAT(newPort.value(), "mctpserial0");
}

TEST(ExtractNewNameWithPreMctpPortPresent, TestMctpSetup)
{
    std::string preSetupOutput =
        "dev lo index 1 address 0x00:00:00:00:00:00 net 1 mtu 65536 up\n"
        "dev mctpi2c6 index 5 address 0x10 net 1 mtu 254 up\n"
        "dev mctpserial0 index 11 address 0x(no-addr) net 7 mtu 68 up\n";

    // Irrespective of the order- new port should be found
    std::string postSetupOutput =
        "dev lo index 1 address 0x00:00:00:00:00:00 net 1 mtu 65536 up\n"
        "dev mctpi2c6 index 5 address 0x10 net 1 mtu 254 up\n"
        "dev mctpserial1 index 11 address 0x(no-addr) net 4 mtu 68 up\n"
        "dev mctpserial0 index 11 address 0x(no-addr) net 7 mtu 68 up\n";

    std::optional<std::string> newPort =
        extractNewName(preSetupOutput, postSetupOutput);

    ASSERT_THAT(newPort.has_value(), true);
    ASSERT_THAT(newPort.value(), "mctpserial1");
}

TEST(ExtractNewNameNotFound, TestMctpSetup)
{
    std::string preSetupOutput =
        "dev lo index 1 address 0x00:00:00:00:00:00 net 1 mtu 65536 up\n"
        "dev mctpi2c6 index 5 address 0x10 net 1 mtu 254 up\n";

    std::optional<std::string> newPort =
        extractNewName(preSetupOutput, preSetupOutput);

    ASSERT_THAT(newPort.has_value(), false);
}

TEST(ExtractNewNameEmpty, TestMctpSetup)
{
    std::optional<std::string> newPort = extractNewName("", "");
    ASSERT_THAT(newPort.has_value(), false);
}

TEST(CreateNetIdSuccess, TestMctpSetup)
{
    std::string udevId = "1_1_4_1";
    int netId = createNetIdFromUdevId(udevId);
    // net id should be sum of the digits in udev id
    ASSERT_EQ(netId, 7);
}
