#ifndef __KMCONTAINER_H__
#define __KMCONTAINER_H__

#include "KMConfigData.h"

#include <memory>

class KMContainer
{
public:
    KMContainer();
    ~KMContainer();

public:
    /**
     * @brief 设置appID,必须设置用于生成运行目录
     * @param id appID
     */
    void setAppID(const std::string &id);

    /**
     * @brief 设置base目录,必须设置用于修订挂载点信息
     * @param baseDir 目录
     */
    void setBaseDir(const std::string &baseDir);

    /**
     * @brief 获取appID
     * @return appID
     */
    std::string getAppID();

    /**
     * @brief 设置oci版本
     * @param version 版本号
     */
    void setOciVersion(const std::string &version);

    /**
     * @brief 获取版本
     * @return string 版本号
    */
    std::string getOciVersion();

    /**
     * @brief 设置主机名
     * @param hostName 主机名
     */
    void setHostName(const std::string &hostName);

    /**
     * @brief 获取容器主机名
     * @return string 主机名
     */

    std::string setHostName();
    /**
     * @brief 设置域名
     * @param domainName 域名
     */

    void setDomainName(const std::string &domainName);

    /**
     * @brief 获取域名
     * @return string 域名
     */
    std::string getDomainName();

    /**
     * @brief 设置根目录
     * @param root 根目录
     * @param readonly 是否只读系统
     */
    void setRoot(const std::string &root, bool readonly);

    /**
     * @brief 获取根结构数据
     * @param Root 数据
     */
    Root getRoot();

    /**
     * @brief 添加注释；包含任意传递给容器的元数据
     * @param key 键
     * @param value 值
     */
    void addAnnotation(const std::string &key, const std::string &value);

    /**
     * @brief 删除注释
     * @param key 键
     */
    void delAnnotation(const std::string &key);

    /**
     * @brief 获取注释；包含任意传递给容器的元数据
     * @return 注释
     */
    std::map<std::string, std::string> getAnnotations();

    /**
     * @brief 设置进程配置,设置所有配置项
     * @param process 进程配置
     */
    void setProcess(const Process &process);

    /**
     * @brief 获取进程配置
     * @return 进程配置
     */
    Process getProcess();

    /**
     * @brief 设置进程启动参数
     * @param args 启动参数
     */
    void setProcessArgs(const std::vector<std::string> &args);

    /**
     * @brief 添加进程环境变量
     * @param env 环境变量
     */
    void addProcessEnv(const std::vector<std::string> &env);

    /**
     * @brief 获取进程启动参数
     * @return args 启动参数
     */
    std::vector<std::string> getProcessArgs();

    /**
     * @brief 设置进程环境变量
     * @param env 环境变量
     */
    void setProcessEnv(const std::vector<std::string> &env);

    /**
     * @brief 获取进程启动环境变量
     * @return env 环境变量
     */
    std::vector<std::string> getProcessEnv();

    /**
     * @brief 设置工作目录
     * @param cwd 工作目录
     */ 
    void setCwd(const std::string &cwd);

    /**
     * @brief 设置hooks挂载
     * @param hooks hooks挂载
     */
    void setHooks(const Hooks &hooks);

    /**
     * @brief 获取Hooks挂载数据
     * @return hooks 挂载数据
     */
    Hooks getHooks();

    /**
     * @brief 设置prestart钩子
     * @param perstart prestart结构
     */
    void setPrestart(const std::vector<Hook> &prestart);

    /**
     * @brief 添加createRuntime钩子
     * @param createRuntime createRuntime结构
     */
    void setCreateRuntime(const std::vector<Hook> &createRuntime);

    /**
     * @brief 设置createContainer钩子
     * @param createContainer createContainer结构
     */
    void setCreateContainer(const std::vector<Hook> &createContainer);

    /**
     * @brief 添加startContainer钩子
     * @param startContainer startContainer结构
     */
    void setStartContainer(const std::vector<Hook> &startContainer);

    /**
     * @brief 设置poststart钩子
     * @param postStart postStart结构
     */
    void setPoststart(const std::vector<Hook> &postStart);

    /**
     * @brief 添加poststop钩子
     * @param postStop postStop结构
     */
    void setPostStop(const std::vector<Hook> &postStop);

    /**
     * @brief 设置linux平台配置;不设置则使用默认值
     * @param linuxConfig linux配置
     */
    void setLinux(const Linux &linuxConfig);

    /**
     * @brief 获取linux平台配置
     * @return Linux 平台信息
     */
    Linux getLinux();

    /**
     * @brief 设置挂载点
     * @param mounts 挂载点
     */
    void setMounts(const std::vector<Mount> &mounts);

    /**
     * @brief 添加挂载点
     * @param mount 挂载点
     */
    void addMount(const Mount &mount);

    /**
     * @brief 获取Mounts
     * @return mounts 挂载数据
     */
    std::vector<Mount> getMounts();

    /**
     * @brief 运行容器
     * @return 运行成功返回true，否则返回false
     */
    bool run();

public:
    /**
     * @brief 初始化模板
     */
    void initTemplate();

    /**
     * @brief 初始化环境变量
     */
    void initBaseEnv();

    /**
     * @brief 设置进程默认参数
     */
    void initProcessDefault();

    /**
     * @brief 生成配置文件
     * @param dir bundle目录
     * @return true 成功，false 失败
     */
    bool genConfig(const std::string &dir);

    /**
     * @brief 生成运行参数
     * @return true 成功，false 失败
    */
    bool genRunDir(std::string &dir, std::string &uuid);

    /**
     * @brief 清空容器运行目录
     * @param dir 运行目录
     * @return true 成功 false 失败
     */
    bool clearRunDir(const std::string &dir);

    /**
     * @brief 修正挂载信息
     * @return true 成功 false 失败
     */
    bool amendMountInfo();

    /**
     * @brief 获取需要生成的tmpfs目录
     * @param dir 目录
     * @param tmpfsDir tmpfs目录
     * @return true 成功 false 失败
     */
    bool getTmpfsDir(const std::string dir, std::string &tmpfsDir);

private:
    class Private;
    std::unique_ptr<Private> d_ptr;
};

#endif // __KMCONTAINER_H__