/* KMKeyFile.h
 *
 * Copyright (C) 2023 OpenKylin, Inc
 */

#ifndef __KMKEYFILE_H__
#define __KMKEYFILE_H__

#include <map>
#include <string>
#include <vector>
#include <filesystem>
#include <memory>

#include "third-party/simpleini/SimpleIni.h"

namespace fs = std::filesystem;

/**
 * @brief ini 格式文件解析基类
 * 
 */

class KMKeyFile
{
public:
    KMKeyFile();
    virtual ~KMKeyFile();

    bool loadFile(const std::string& metafile);
    bool isLoaded() { return m_loaded; }

    // 通用get接口
    std::string getStringValue(const std::string& group, const std::string& key, const std::string& defaultValue = "");
    std::vector<std::string> getStringListValue(const std::string& group, const std::string& key);

    /**
     * @brief Get the String List Value With Q Marks object
     *      带双引号的
     * @param group 
     * @param key 
     * @return std::vector<std::string> 
     */
    std::vector<std::string> getStringListValueWithQMarks(const std::string& group, const std::string& key);
    bool getBoolValue(const std::string& group, const std::string& key, bool defaultValue = false);
    long getLongValue(const std::string& group, const std::string& key, long defaultValue = 0);
    double getDoubleValue(const std::string& group, const std::string& key, double defaultValue = 0.0);
    std::map<std::string, std::string> getGroupData(const std::string &group);
    std::vector<std::string> getAllGroups() const;

    // 通用set接口
    void setStringValue(const std::string& group, const std::string& key, const std::string& value);
    void setStringListValue(const std::string& group, const std::string& key, const std::vector<std::string>& vector);
    void setBoolValue(const std::string& group, const std::string& key, bool value);
    void setLongValue(const std::string& group, const std::string& key, long value);
    void setDoubleValue(const std::string& group, const std::string& key, double value);
    void deleteKey(const std::string& group, const std::string& key);
    void deleteGroup(const std::string& group);

    bool saveFile(const std::string& metafile);

    bool groupExists(const std::string& group);
    bool keyExists(const std::string& group, const std::string& key);

protected:
    std::shared_ptr<CSimpleIniCaseA> m_ini;
    std::string m_path;
    bool m_loaded = false;
};

#endif // !__KMKEYFILE_H__

