/* -------------------------------------------------------------------------
 *  This file is part of the MindStudio project.
 * Copyright (c) 2025 Huawei Technologies Co.,Ltd.
 *
 * MindStudio is licensed under Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *
 *          http://license.coscl.org.cn/MulanPSL2
 *
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 * ------------------------------------------------------------------------- */


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

#include "data_save.h"

using namespace Utility;

TEST(DataSave, save_expect_success_with_overwrite)
{
    DataSave dataSave;
    std::string saveFilePath = "./test.csv";
    bool appendMode = false;
    std::vector<std::vector<std::string>> saveData = {{"1", "2"}};
    std::vector<std::vector<std::string>> saveData2 = {{"3", "4"}};
    dataSave.Save(saveFilePath, saveData, appendMode);

    std::ifstream inputFile(saveFilePath);
    std::string singleLine;
    getline(inputFile, singleLine);
    ASSERT_EQ(singleLine, "1,2,");
    inputFile.close();

    dataSave.Save(saveFilePath, saveData2, appendMode);
    inputFile.open(saveFilePath);
    getline(inputFile, singleLine);
    ASSERT_EQ(singleLine, "3,4,");
    inputFile.close();

    std::remove(saveFilePath.c_str());
}

TEST(DataSave, save_expect_success_with_append)
{
    DataSave dataSave;
    std::string saveFilePath = "./test.csv";
    bool appendMode = true;
    std::vector<std::vector<std::string>> saveData = {{"1", "2"}};
    std::vector<std::vector<std::string>> saveData2 = {{"3", "4"}};
    dataSave.Save(saveFilePath, saveData, appendMode);
    dataSave.Save(saveFilePath, saveData2, appendMode);


    std::ifstream inputFile(saveFilePath);
    std::string singleLine;
    getline(inputFile, singleLine);
    ASSERT_EQ(singleLine, "1,2,");
    getline(inputFile, singleLine);
    ASSERT_EQ(singleLine, "3,4,");
    inputFile.close();

    std::remove(saveFilePath.c_str());
}

TEST(DataSave, csv_save_expect_success)
{
    DataSave dataSave;
    CsvFileStruct testDataStruct;
    testDataStruct.fileName = "./test.csv";
    testDataStruct.headers = {"a", "b", "c"};
    testDataStruct.data.push_back({"1", "2", "3"});
    testDataStruct.data.push_back({"3", "4", "10"});
    testDataStruct.headerIndex["a"] = 0;
    testDataStruct.headerIndex["b"] = 1;
    testDataStruct.headerIndex["c"] = 2;
    testDataStruct.valid = true;
    ASSERT_TRUE(dataSave.CsvSave(testDataStruct));

    std::ifstream inputFile(testDataStruct.fileName);
    std::string singleLine;
    getline(inputFile, singleLine);
    ASSERT_EQ(singleLine, "a,b,c,");
    getline(inputFile, singleLine);
    ASSERT_EQ(singleLine, "1,2,3,");
    getline(inputFile, singleLine);
    ASSERT_EQ(singleLine, "3,4,10,");
    inputFile.close();

    std::remove(testDataStruct.fileName.c_str());
}

TEST(DataSave, csv_save_expect_failed)
{
    DataSave dataSave;
    CsvFileStruct testDataStruct;
    testDataStruct.fileName = "./test.csv";
    testDataStruct.headers = {"a", "b", "c"};
    testDataStruct.data.push_back({"1", "2", "3"});
    testDataStruct.data.push_back({"3", "4", "10"});
    testDataStruct.headerIndex["a"] = 0;
    testDataStruct.headerIndex["b"] = 1;
    testDataStruct.headerIndex["c"] = 2;
    testDataStruct.valid = true;
    MOCKER(&chmod)
        .stubs()
        .will(returnValue(-1));
    ASSERT_FALSE(dataSave.CsvSave(testDataStruct));
}