/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.
 */
#include <filesystem>
#include <fstream>
#include <mutex>
#include <string>
#include <vector>

#include <sys/stat.h>

#include <gtest/gtest.h>
#include <mockcpp/mockcpp.hpp>

#include "server/data_receiver.h"

TEST(DataReceiverTest, SaveTest)
{
    size_t bufferSize = 3;
    int flushIntervalSec = 5;
    std::string outputPath = "/xxx";
    if (std::filesystem::exists(outputPath)) {
        std::filesystem::remove(outputPath);
    }
    std::shared_ptr<MutexContext> ctx2 = std::make_shared<MutexContext>();

    DataReceiver receiver(ctx2, bufferSize, flushIntervalSec, outputPath);
    std::string a = "abcd";
    receiver.save(a);
    bool containsAbcd = std::find(receiver.jsonBuffer.begin(), receiver.jsonBuffer.end(), "abcd") !=
                        receiver.jsonBuffer.end();
    EXPECT_TRUE(containsAbcd);
    receiver.jsonBuffer.clear();
}

TEST(DataReceiverTest, WriteToDisk)
{
    std::string output_path = "test_output.json";
    std::ofstream create_file(output_path);
    auto mutexContext = std::make_shared<MutexContext>();
    DataReceiver receiver(mutexContext, 2, 1, output_path);

    receiver.jsonBuffer = {"data1", "data2"};

    receiver.writeToDisk();

    std::ifstream file(output_path);
    if (!file.is_open()) {
        std::cerr << "无法打开文件!" << std::endl;
    }

    std::string line;
    std::vector<std::string> lines;
    while (std::getline(file, line)) {
        lines.push_back(line);
    }

    EXPECT_EQ(lines.size(), 2);
    std::filesystem::file_status status = std::filesystem::status(output_path);
    EXPECT_TRUE(std::filesystem::is_regular_file(status));
    EXPECT_TRUE((status.permissions() & std::filesystem::perms::owner_read) != std::filesystem::perms::none);
    EXPECT_TRUE((status.permissions() & std::filesystem::perms::owner_write) != std::filesystem::perms::none);

    std::filesystem::remove(output_path);
}

TEST(DataReceiverTest, WriteToDisk_CreateSingleParentDir)
{
    auto mutexContext = std::make_shared<MutexContext>();
    DataReceiver receiver(mutexContext, 2, 1, "test_output.json");

    std::filesystem::path outputPath("test_output.json");
    std::filesystem::remove_all(outputPath.parent_path());

    receiver.jsonBuffer = {"data1", "data2"};

    receiver.writeToDisk();

    std::ifstream file("test_output.json");
    std::string line;
    std::vector<std::string> lines;
    while (std::getline(file, line)) {
        lines.push_back(line);
    }
    EXPECT_EQ(lines.size(), 2);

    std::filesystem::file_status status = std::filesystem::status(outputPath.parent_path());
    EXPECT_TRUE((status.permissions() & std::filesystem::perms::owner_read) != std::filesystem::perms::none);
    EXPECT_TRUE((status.permissions() & std::filesystem::perms::owner_write) != std::filesystem::perms::none);

    std::filesystem::remove(outputPath);
    std::filesystem::remove_all(outputPath.parent_path());
}