#ifndef PROCESSTHREAD_H
#define PROCESSTHREAD_H

#include <QThread>
#include <QMap>

#include "global.h"

class ProcessThread : public QThread
{
    Q_OBJECT
public:
    ProcessThread(QObject* parent = nullptr);

    void setParam(ConfigParam p);

signals:
    /**
    * @brief 提示信号
    *  将提示信息打印出来
    * @param [in]txt 打印的信息
    * @param [in]index 信息分类
    *  1表示默认提示信息，2表示警告信息，3表示致命信息
    * @param [in]addTime是否打印时间
    **/
    void tip(const QString& txt, int index = 0, bool addTime = false);

protected:
    void run();

private:
    /**
    * @brief 拷贝文件
    * @param srcPath 源文件文件路径
    * @param dstPath 目的文件路径
    * @param coverFileIfExist 文件存在是否覆盖
    **/
    bool copyFile(QString srcPath, QString dstPath, bool coverFileIfExist);

    /**
    * @brief 拷贝目录
    * @param srcPath 源文件目录
    * @param dstPath 目的文件目录
    * @param coverFileIfExist 文件存在是否覆盖
    **/
    bool copyDirectory(const QString& srcPath, const QString& dstPath, bool coverFileIfExist);

    /**
    * @brief 处理材质文件
    * @param inputObj输入的obj模型文件路径
    * @param inputMtl输入的材质文件名
    * @param outputMtl输出的材质文件名
    **/
    void processMaterialFile(const QString& inputObj, const QString& inputMtl, const QString& outputMtl);

    void traverseFolder(const QDir& folder, const QString& suffix = "-1");

private:
    ConfigParam mConfigParam;

    // obj模型索引，并不完整
    // -1 目前不支持
    // 0 # 注释
    // 1 mtllib 材质文件
    // 2 o 模型名称
    // 3 v 顶点坐标
    // 4 vt uv贴图
    // 5 vn 法向量
    // 6 usemtl 材质文件中定义的材质
    // 7 s off表示关闭光滑组（Smoothing group）
    // 8 f 表示由顶点、uv纹理坐标、法向量索引确定的表面，如5/2/1表示v开头的第5个顶点、对应vt贴图的第2个坐标、对应vn开头的第1个法向量；
    QMap<int, QString> mObjElementMap;

    // mtl材质文件索引，并不完整
    // -1 目前不支持
    // 0 # 注释
    // 1 newmtl Material定义材质Material，接下来的内容都是该材质的属性。
    // 2 Ns表示高光色的权重。
    // 3 Ka表示环境光，三个数字分别对应R、G、B值。
    // 4 Kd表示漫反射光，三个数字分别对应R、G、B值。
    // 5 Ks表示高光，三个数字分别对应R、G、B值。
    // 6 Ke表示发射光，三个数字分别对应R、G、B值。
    // 7 Ni表示光学密度。
    // 8 d表示透明度，0是完全透明，1是完全不透明。
    // 9 illum 2表示指定的光照模型（参考：Phong光照模型），illum后面的数字范围为0~10，具体
    // 10 map_Kd 表示纹理图片
    QMap<int, QString> mMtlElementMap;

    int mVindex;    // 顶点数量
    int mVTindex;   // 贴图数量
    int mVNindex;   // 法向量数量
};

#endif // PROCESSTHREAD_H
