#ifndef VERSIONMANAGER_H
#define VERSIONMANAGER_H

#include <QString>
#include <QJsonObject>

/**
 * @class VersionManager
 * @brief VersionManager 类用于管理版本信息，包括版本号、构建日期、提交信息等，并支持从文件加载和保存这些信息。
 * 
 * VersionManager 类提供了一系列方法来获取和设置版本信息，并支持从指定的文件路径加载和保存这些信息。它使用 QJsonObject 来存储版本信息，并提供了一些辅助方法来处理 JSON 数据的转换。
 * 
 * @note 使用该类时，请确保文件路径是有效的，并且文件格式符合预期。
 * 
 * @param filePath 文件路径，用于加载和保存版本信息。
 * 
 * @example
 * // 创建 VersionManager 对象并加载版本信息
 * VersionManager manager("path/to/version.json");
 * if (manager.load()) {
 *     qDebug() << "Version:" << manager.version();
 *     qDebug() << "Build Date:" << manager.buildDate();
 *     qDebug() << "Commit:" << manager.commit();
 *     qDebug() << "Description:" << manager.description();
 * }
 */
class VersionManager
{
public:
    /**
     * @brief 构造函数，初始化 VersionManager 对象。
     * 
     * @param filePath 文件路径，用于加载和保存版本信息。
     */
    VersionManager(const QString& filePath);

    /**
     * @brief 从文件加载版本信息。
     * 
     * @return 如果加载成功，返回 true；否则返回 false。
     */
    bool load();

    /**
     * @brief 将当前版本信息保存到文件。
     * 
     * @return 如果保存成功，返回 true；否则返回 false。
     */
    bool save();

    /**
     * @brief 重新加载版本信息。
     * 
     * @return 如果重新加载成功，返回 true；否则返回 false。
     */
    bool reload();

    /**
     * @brief 获取版本号。
     * 
     * @return 当前版本号。
     */
    QString version() const;

    /**
     * @brief 设置版本号。
     * 
     * @param newVersion 新的版本号。
     */
    void setVersion(const QString &newVersion);

    /**
     * @brief 获取构建日期。
     * 
     * @return 当前构建日期。
     */
    QString buildDate() const;

    /**
     * @brief 设置构建日期。
     * 
     * @param newBuildDate 新的构建日期。
     */
    void setBuildDate(const QString &newBuildDate);

    /**
     * @brief 获取提交信息。
     * 
     * @return 当前提交信息。
     */
    QString commit() const;

    /**
     * @brief 设置提交信息。
     * 
     * @param newCommit 新的提交信息。
     */
    void setCommit(const QString &newCommit);

    /**
     * @brief 获取版本描述。
     * 
     * @return 当前版本描述。
     */
    QString description() const;

    /**
     * @brief 设置版本描述。
     * 
     * @param newDescription 新的版本描述。
     */
    void setDescription(const QString &newDescription);

private:
    /**
     * @brief 将 QJsonObject 转换为 JSON 字符串。
     */
    void jsonObjectToJson();

    /**
     * @brief 将 JSON 字符串转换为 QJsonObject。
     */
    void jsonObjectFromJson();

private:
    QJsonObject m_object;    //!< 存储版本信息的 JSON 对象。
    QString m_filePath;      //!< 文件路径。
    QString m_version;       //!< 版本号。
    QString m_buildDate;     //!< 构建日期。
    QString m_commit;        //!< 提交信息。
    QString m_description;   //!< 版本描述。
};

#endif // VERSIONMANAGER_H
