#ifndef __KMRUNNER_H__
#define __KMRUNNER_H__

#include "app/KMSubCommand.h"

/**
 * @brief 开明包运行功能封装
 */
class KMRunner final : public KMSubCommand
{
    DECLARE_DYNCREATE(KMRunner);

public:
    KMRunner();
    virtual ~KMRunner() = default;

    /**
     * @brief 开明子命令运行
     * @param argc 参数个数
     * @param argv 参数列表
     * @return 0 成功 非0 失败
     */
    int despose(int argc, char **argv) override;

    /**
     * @brief 开始运行
     * @return true 成功 false 失败
     */
    bool start();

private:
    /**
     * @brief 解析命令行参数
     * @param argc 参数个数
     * @param argv 参数列表
     * @return true 成功 false 失败
     */
    bool parseArgs(int argc, char **argv);

    /**
     * @brief 是否在root权限下运行
     * @return true 成功 false 失败
     */
    bool runningUnderSudo();

    /**
     * @brief 获取app,base,runtime目录
     * @return true 成功 false 失败
     */
    bool getLayersDirs();

    /**
     * @brief 创建appdate子目录
     * @return true 成功 false 失败
     */
    bool ensureAppDataDir();

    /**
     * @brief 挂载app,base,runtime目录
     * @return true 成功 false 失败
     */
    bool mountLayers();

    /**
     * @brief 挂载dev设备
     * @return true 成功 false 失败
     */
    bool mountDev();

    /**
     * @brief 挂载socket
     * @return true 成功 false 失败
     */
    bool mountSocket();

    /**
     * @brief 挂载数据配置路径
     * @return true 成功 false 失败
     */
    bool mountData();

    /**
     * @brief 挂载share,包含字体,icon等
     * @return true 成功 false 失败
     */
    bool mountShare();

    /**
     * @brief 挂载基础路径
     * @return true 成功 false 失败
     */
    bool mountBase();

    /**
     * @brief 生成ld.so.cache
     * @return true 成功 false 失败
     */
    bool genLdsocache();

    /**
     * @brief 设置process
     * @return true 成功 false 失败
     */
    bool setProcessCmd();

protected:
    /**
     * @brief 挂载etc目录
     * @return true 成功 false 失败
     */
    bool mountEtc();

    /**
     * @brief 挂载pulseaudio配置
     * @return true 成功 false 失败
     */
    bool mountPulseaudio();

    /**
     * @brief 挂载dbus配置
     * @return true 成功 false 失败
     */
    bool mountDbus();

    /**
     * @brief : 挂载x11
     * @return true 成功 false 失败
     */
    bool mountX11();

    /**
     * @brief 挂载wayland
     * @return true 成功 false 失败
     */
    bool mountWayland();

    /**
     * @brief 挂载journal配置
     */
    void mountJournal();

    /**
     * @brief 挂载GSSProxy配置
     */
    void mountGssproxy();

    /**
     * @brief 挂载resolved配置
     */
    void mountResolved();

    /**
     * @brief 组装运行命令
     * @return true 成功 false 失败
     */
    bool assembleCommand();

    /**
     * @brief 组装运行环境变量
     * @return true 成功 false 失败
     */
    bool assembleProcEnv();

    /**
     * @brief 生成upperdir的n层目录,默认3层
     * @param path 目录路径
     * @param depth 目录深度
     * @return true 成功 false 失败
     */
    bool generateUpperLayers(const std::string &path, int depth = 3);

    /**
     * @brief 挂载dconf目录
     * @return true 成功 false 失败
     */
    bool mountDconf();

    /**
     *@brief 解析dbus地址
     *@return string 路径
     */
    std::string pathFromAddress(const std::string &address);

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

#endif // KMRUNNER_H
