#include "config.h"

#include "mockups.hpp"
#include "utils.hpp"

#include <chrono>
#include <filesystem>
#include <fstream>
#include <memory>
#include <optional>
#include <string>
#include <string_view>
#include <thread>

#include <gtest/gtest.h>

namespace boot_time_monitor
{
namespace
{

namespace fs = std::filesystem;

TEST(DoesUtilWorkTest, Works)
{
    Util u;
    auto curUpTime = u.getUpTimeInMs();
    auto curWallTime = u.getWallTimeInMs();
    std::this_thread::sleep_for(std::chrono::seconds(2));

    ASSERT_NE(curUpTime, std::nullopt);
    ASSERT_GT(curUpTime.value(), 0);

    EXPECT_GT(u.getUpTimeInMs().value_or(-1), curUpTime);
    EXPECT_GT(u.getWallTimeInMs(), curWallTime);
}

TEST(ValidNameTest, Valid)
{
    Util u;
    EXPECT_TRUE(u.isValidName("0129"));
    EXPECT_TRUE(u.isValidName("ABCZ"));
    EXPECT_TRUE(u.isValidName("abcz"));
    EXPECT_TRUE(u.isValidName("____"));
    EXPECT_TRUE(u.isValidName("A_a_1_"));
    EXPECT_FALSE(u.isValidName("A-_a_1_"));
    EXPECT_FALSE(u.isValidName("A_a*_1_"));
    EXPECT_FALSE(u.isValidName("A_a_1@_"));
    EXPECT_FALSE(u.isValidName("A#_a_1_"));
    EXPECT_FALSE(u.isValidName("A_a _1_"));
}

TEST(getPathTest, Works)
{
    Util u;
    EXPECT_EQ(u.getCPPath("host0", false),
              std::string(bootTimeDataDir) + "host0_checkpoints.csv");
    EXPECT_EQ(u.getCPPath("bmc", false),
              std::string(bootTimeDataDir) + "bmc_checkpoints.csv");
    EXPECT_EQ(u.getCPPath("_N_o_d_e_", false),
              std::string(bootTimeDataDir) + "_N_o_d_e__checkpoints.csv");

    EXPECT_EQ(u.getCPPath("host0", true),
              std::string(bootTimeDataDir) + "host0_checkpoints.csv.completed");
    EXPECT_EQ(u.getCPPath("bmc", true),
              std::string(bootTimeDataDir) + "bmc_checkpoints.csv.completed");
    EXPECT_EQ(u.getCPPath("_N_o_d_e_", true),
              std::string(bootTimeDataDir) +
                  "_N_o_d_e__checkpoints.csv.completed");

    EXPECT_EQ(u.getDurPath("host0", false),
              std::string(bootTimeDataDir) + "host0_durations.csv");
    EXPECT_EQ(u.getDurPath("bmc", false),
              std::string(bootTimeDataDir) + "bmc_durations.csv");
    EXPECT_EQ(u.getDurPath("_N_o_d_e_", false),
              std::string(bootTimeDataDir) + "_N_o_d_e__durations.csv");

    EXPECT_EQ(u.getDurPath("host0", true),
              std::string(bootTimeDataDir) + "host0_durations.csv.completed");
    EXPECT_EQ(u.getDurPath("bmc", true),
              std::string(bootTimeDataDir) + "bmc_durations.csv.completed");
    EXPECT_EQ(u.getDurPath("_N_o_d_e_", true),
              std::string(bootTimeDataDir) +
                  "_N_o_d_e__durations.csv.completed");
}

TEST(DoesFileUtilWork, CheckpointWorks)
{
    constexpr std::string_view cpName = "temp_cp";
    const std::string cpCompleted = std::string{cpName} + kCompletedSuffix;

    // Clean previous test result
    fs::remove(cpName);
    fs::remove(cpCompleted);

    FileUtil cpUtil(cpName);
    EXPECT_TRUE(cpUtil.isEmpty());
    cpUtil.addCheckpoint("checkpoint_10", 10, 20);
    cpUtil.addCheckpoint("checkpoint_30", 30, 50);
    EXPECT_FALSE(cpUtil.isEmpty());

    // Completed data should be empty
    EXPECT_TRUE(cpUtil.loadCheckpoints(true)->empty());
    auto vec = cpUtil.loadCheckpoints(false);
    EXPECT_EQ(vec->size(), 2);
    EXPECT_EQ((*vec)[0].name, "checkpoint_10");
    EXPECT_EQ((*vec)[0].wallTime, 10);
    EXPECT_EQ((*vec)[0].monoTime, 20);
    EXPECT_EQ((*vec)[1].name, "checkpoint_30");
    EXPECT_EQ((*vec)[1].wallTime, 30);
    EXPECT_EQ((*vec)[1].monoTime, 50);

    cpUtil.completeCurrent();
    // Current data should be empty
    EXPECT_TRUE(cpUtil.loadCheckpoints(false)->empty());
    EXPECT_TRUE(cpUtil.isEmpty());

    // Check completed data
    vec = cpUtil.loadCheckpoints(true);
    EXPECT_EQ(vec->size(), 2);
    EXPECT_EQ((*vec)[0].name, "checkpoint_10");
    EXPECT_EQ((*vec)[0].wallTime, 10);
    EXPECT_EQ((*vec)[0].monoTime, 20);
    EXPECT_EQ((*vec)[1].name, "checkpoint_30");
    EXPECT_EQ((*vec)[1].wallTime, 30);
    EXPECT_EQ((*vec)[1].monoTime, 50);

    // Check file content
    std::string input;
    std::ifstream ifs(cpCompleted);
    ASSERT_TRUE(ifs.good());
    ifs >> input;
    EXPECT_EQ(input, "checkpoint_10,10,20");
    ifs >> input;
    EXPECT_EQ(input, "checkpoint_30,30,50");
    EXPECT_FALSE(ifs >> input);
    ifs.close();
}

TEST(DoesFileUtilWork, DurationWorks)
{
    constexpr std::string_view durName = "temp_dur";
    const std::string durCompleted = std::string{durName} + kCompletedSuffix;

    // Clean previous test result
    fs::remove(durName);
    fs::remove(durCompleted);

    FileUtil durUtil(durName);
    EXPECT_TRUE(durUtil.isEmpty());
    durUtil.addDuration("duration_1000", 1000);
    durUtil.addDuration("duration_3000", 3000);
    EXPECT_FALSE(durUtil.isEmpty());

    // Completed data should be empty
    EXPECT_TRUE(durUtil.loadDurations(true)->empty());
    auto vec = durUtil.loadDurations(false);
    EXPECT_EQ(vec->size(), 2);
    EXPECT_EQ((*vec)[0].name, "duration_1000");
    EXPECT_EQ((*vec)[0].duration, 1000);
    EXPECT_EQ((*vec)[1].name, "duration_3000");
    EXPECT_EQ((*vec)[1].duration, 3000);

    durUtil.completeCurrent();
    // Current data should be empty
    EXPECT_TRUE(durUtil.loadDurations(false)->empty());
    EXPECT_TRUE(durUtil.isEmpty());

    // Check completed data
    vec = durUtil.loadDurations(true);
    EXPECT_EQ(vec->size(), 2);
    EXPECT_EQ((*vec)[0].name, "duration_1000");
    EXPECT_EQ((*vec)[0].duration, 1000);
    EXPECT_EQ((*vec)[1].name, "duration_3000");
    EXPECT_EQ((*vec)[1].duration, 3000);

    // Check file content
    std::string input;
    std::ifstream ifs(durCompleted);
    ASSERT_TRUE(ifs.good());
    ifs >> input;
    EXPECT_EQ(input, "duration_1000,1000");
    ifs >> input;
    EXPECT_EQ(input, "duration_3000,3000");
    EXPECT_FALSE(ifs >> input);
    ifs.close();
}

} // namespace
} // namespace boot_time_monitor
