#include "settings.h"
#include <fstream>
#include <nlohmann/json.hpp>
#include <string>
#include "../utils/utils.h"

#if __GNUC__ <= 8 && __clang_major__ < 17
#       include <experimental/filesystem>
    using namespace std::experimental;
    using namespace std::experimental::filesystem;
#else
#       include <filesystem>
    using namespace std::filesystem;
#endif

Settings::Settings(std::string path) {
    this->settings_file_path = path;

    if (!exists(path)) {
        std::ofstream output(path);

        nlohmann::json settings = R"({
            "ofds_modules_dir":".local/share/checks_parser/modules/ofd",
            "stores_modules_dir":".local/share/checks_parser/modules/stores",
            "ofds_modules_url":"https://foxarmy.org/checks-parser/modules/ofd/",
            "stores_modules_url":"https://foxarmy.org/checks-parser/modules/stores/",
            "print_header": true,
            "print_total": true,
            "output_order": {
                "goods_name": {
                    "position":1,
                    "name":"Goods name"
                },
                "goods_price_per_unit": {
                    "position":2,
                    "name":"Goods price per unit"
                },
                "goods_quantity": {
                    "position":3,
                    "name":"Goods quantity"
                },
                "goods_net_weight": {
                    "position":4,
                    "name":"Goods net weight"
                },
                "goods_total": {
                    "position":5,
                    "name":"Goods total"
                }
            }
        })"_json;

        output << settings.dump(4);
        output.flush();
        output.close();
        this->settings = settings;
    } else {
        std::ifstream input(path);

        nlohmann::json settings = nlohmann::json::parse(input);
        this->settings = settings;
    }

    create_directories(get_path_relative_to_home(this->settings["ofds_modules_dir"]));
    create_directories(get_path_relative_to_home(this->settings["stores_modules_dir"]));
}

void Settings::write_setting(std::string setting, std::string value) {
    std::ofstream output(this->settings_file_path, std::fstream::trunc);

    this->settings[setting] = value;

    output << this->settings.dump(4);
}
std::string Settings::get_setting(std::string setting) {
    return this->settings[setting];
}

void Settings::set_settings_file_path(std::string path) {
    this->settings_file_path = path;
}

std::string Settings::get_settings_file_path() {
    return this->settings_file_path;
}

nlohmann::json& Settings::get_all_settings() { return this->settings; }

void Settings::alter_setting(std::string setting, std::string value) {
    this->settings[setting] = value;
}

void Settings::flush() {
    std::ofstream output(this->settings_file_path, std::fstream::trunc);

    output << this->settings.dump(4);
}