#include "helpers.hpp"
#include "persistent_json_storage.hpp"

#include <fstream>

#include "gmock/gmock.h"
#include "gtest/gtest.h"

using namespace testing;

class TestPersistentJsonStorage : public Test
{
  public:
    using FilePath = interfaces::JsonStorage::FilePath;
    using DirectoryPath = interfaces::JsonStorage::DirectoryPath;

    static void SetUpTestSuite()
    {
        ASSERT_FALSE(std::filesystem::exists(directory));
    }

    void TearDown() override
    {
        if (std::filesystem::exists(directory))
        {
            std::filesystem::remove_all(directory);
        }
    }

    const FilePath fileName = FilePath("report/1/file.txt");

    static const DirectoryPath directory;
    PersistentJsonStorage sut{directory};
};

const interfaces::JsonStorage::DirectoryPath
    TestPersistentJsonStorage::directory =
        interfaces::JsonStorage::DirectoryPath(
            std::filesystem::temp_directory_path() / "telemetry-tests");

TEST_F(TestPersistentJsonStorage, storesJsonData)
{
    nlohmann::json data = nlohmann::json::object();
    data["name"] = "kevin";
    data["lastname"] = "mc calister";

    sut.store(fileName, data);

    ASSERT_THAT(sut.load(fileName), Eq(data));
}

TEST_F(TestPersistentJsonStorage, emptyListWhenNoReportsCreated)
{
    EXPECT_THAT(sut.list(), SizeIs(0u));
}

TEST_F(TestPersistentJsonStorage, listSavedReports)
{
    sut.store(FilePath("report/domain-1/name-1/conf-1.json"),
              nlohmann::json("data-1a"));
    sut.store(FilePath("report/domain-1/name-2/conf-1.json"),
              nlohmann::json("data-2a"));
    sut.store(FilePath("report/domain-1/name-2/conf-2.json"),
              nlohmann::json("data-2b"));
    sut.store(FilePath("report/domain-2/name-1/conf-1.json"),
              nlohmann::json("data-3a"));

    EXPECT_THAT(
        sut.list(),
        UnorderedElementsAre(FilePath("report/domain-1/name-1/conf-1.json"),
                             FilePath("report/domain-1/name-2/conf-1.json"),
                             FilePath("report/domain-1/name-2/conf-2.json"),
                             FilePath("report/domain-2/name-1/conf-1.json")));
}

TEST_F(TestPersistentJsonStorage, listSavedReportsWithoutRemovedOnes)
{
    sut.store(FilePath("report/domain-1/name-1/conf-1.json"),
              nlohmann::json("data-1a"));
    sut.store(FilePath("report/domain-1/name-2/conf-1.json"),
              nlohmann::json("data-2a"));
    sut.store(FilePath("report/domain-1/name-2/conf-2.json"),
              nlohmann::json("data-2b"));
    sut.store(FilePath("report/domain-2/name-1/conf-1.json"),
              nlohmann::json("data-3a"));
    sut.remove(FilePath("report/domain-1/name-1/conf-1.json"));
    sut.remove(FilePath("report/domain-1/name-2/conf-2.json"));

    EXPECT_THAT(
        sut.list(),
        UnorderedElementsAre(FilePath("report/domain-1/name-2/conf-1.json"),
                             FilePath("report/domain-2/name-1/conf-1.json")));
}

TEST_F(TestPersistentJsonStorage, removesStoredJson)
{
    nlohmann::json data = nlohmann::json::object();
    data["name"] = "kevin";
    data["lastname"] = "mc calister";

    sut.store(fileName, data);

    ASSERT_THAT(sut.remove(fileName), Eq(true));
    ASSERT_THAT(sut.load(fileName), Eq(std::nullopt));
}

TEST_F(TestPersistentJsonStorage, returnsFalseWhenDeletingNonExistingFile)
{
    ASSERT_THAT(sut.remove(fileName), Eq(false));
}

TEST_F(TestPersistentJsonStorage, returnsNulloptWhenFileDoesntExist)
{
    ASSERT_THAT(sut.load(fileName), Eq(std::nullopt));
}

class TestPersistentJsonStorageWithSymlink : public TestPersistentJsonStorage
{
  public:
    TestPersistentJsonStorageWithSymlink()
    {
        std::ofstream file(dummyReportPath);
        file << "{}";
        file.close();

        std::filesystem::create_directories(std::filesystem::path(directory) /
                                            "report");
        std::filesystem::create_symlink(dummyReportPath,
                                        std::filesystem::path(directory) /
                                            "report/symlink.json");
    }

    static void SetUpTestSuite()
    {
        TestPersistentJsonStorage::SetUpTestSuite();
        ASSERT_FALSE(std::filesystem::exists(dummyReportPath));
    }

    void TearDown() override
    {
        TestPersistentJsonStorage::TearDown();
        if (std::filesystem::exists(dummyReportPath))
        {
            std::filesystem::remove(dummyReportPath);
        }
    }

    static const std::filesystem::path dummyReportPath;
};

const std::filesystem::path
    TestPersistentJsonStorageWithSymlink::dummyReportPath =
        std::filesystem::temp_directory_path() / "report";

TEST_F(TestPersistentJsonStorageWithSymlink, symlinksAreNotListed)
{
    ASSERT_THAT(sut.list(), UnorderedElementsAre());
}

TEST_F(TestPersistentJsonStorageWithSymlink, throwsWhenStoreTargetIsSymlink)
{
    ASSERT_THROW(
        sut.store(FilePath("report/symlink.json"), nlohmann::json("data")),
        std::runtime_error);

    ASSERT_THAT(sut.list(), UnorderedElementsAre());
}

TEST_F(TestPersistentJsonStorageWithSymlink, returnsNulloptWhenFileIsSymlink)
{
    ASSERT_THAT(sut.load(FilePath("report/symlink.json")), Eq(std::nullopt));
}

TEST_F(TestPersistentJsonStorageWithSymlink,
       returnsFalseWhenTryingToDeleteSymlink)
{
    EXPECT_THAT(sut.remove(FilePath("report/symlink.json")), Eq(false));
    EXPECT_TRUE(std::filesystem::exists(std::filesystem::path(directory) /
                                        "report/symlink.json"));
    EXPECT_TRUE(std::filesystem::exists(dummyReportPath));
}
