#ifndef __BUILDER_INFO_H__
#define __BUILDER_INFO_H__

#include <string>
#include <array>
#include <vector>
#include <sstream>
#include <cstdlib>
#include <fstream>
#include <iostream>
#include <algorithm>
#include <memory>

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>

#include "common/KMVariantDict.h"

namespace pt = boost::property_tree;

class KMBuilderInfo
{
public:
    KMBuilderInfo();
    ~KMBuilderInfo();
    
    bool writeInfo();

private:
    // 初始化函数
    void initialize();

    /**
     * @brief : 解析.appdata.xml/.metadata.xml文件
     * @return: true - 成功；false - 失败
     * @note  : 解析结果保存在m_treeXml中
     */
    bool parseAppdataXml();

    /**
     * @brief : 从files/share/appdata或files/share/metadata目录获取如*.appdata.xml文件
     * @param : [in] path, 查找路径
     * @return: std::string, *.appdata.xml的完整文件名
     */
    std::string getAppdataXmlFile(const std::string& path);

    /**
     * @brief : 生成repo仓库对应的md5sum
     * @return: md5sum
     * @note  : 1、先将repo目录打包成tar文件
     *          2、再对tar文件生成md5sum
     */
    bool generateRepoMd5sum();

    /**
     * @brief : 解析ostree仓库中的summary的内容
     */
    bool parseRepoSummary();

    /**
     * @brief : 将数据写入TOML文件：.okinfo
     */
    bool writeKMinfoFile();

    /**
     * @brief : 封装成.ok包
     * @note  : ok包中包含：*.tar和.okinfo
     */
    void convertToOkPackage();

    /**
     * @brief : 将架构转换为包格式中的架构
     * @return: std::string 
     * @note  : 如：x86_64>amd64
     */
    std::string convertArch();

    // 设置字符串值的接口
    void setArchValue(const std::string &value);
    void setBranchValue(const std::string &value);
    void setDependsValue(const std::string &value);
    void setMaintainerValue(const std::string &value);
    void setPriorityValue(const std::string &value);
    void setFileValue(const std::string &value);
    void setCertOuValue(const std::string &value);
    void setCertOValue(const std::string &value);
    void setCertCnValue(const std::string &value);
    void setReliabilityValue(const std::string &value);
    void setnormalValue(const std::string &value);

private:
    //存储Generic的字符串
    std::string m_appDir;
    std::string m_runDir;
    std::string m_repoDir;

    std::string m_tmpPath;

    std::string m_appId;
    pt::ptree m_treeXml;

    std::string m_arch;
    std::string m_branch;
    std::string m_depends;
    std::string m_description;
    std::string m_md5;
    std::string m_homepage;
    std::string m_maintainer;
    std::string m_priority;
    std::string m_source;
    std::string m_version;
    std::string m_file;

    std::vector<std::string> m_type;
    std::vector<std::string> m_name;
    std::vector<std::string> m_path;
    std::vector<std::string> m_size;

    std::string m_certOu;
    std::string m_certO;
    std::string m_certCn;
    std::string m_reliability;
    std::string m_normal;
};

#endif // __BUILDER_INFO_H__
