#include "KMBuilderSourceDir.h"
#include "KMBuilderUtils.h"
#include "KMSourceProcess.h"

REGISTER_SOURCE_TYPE_DYNCREATE(dir, KMBuilderSourceDir)

class KMBuilderSourceDir::Private
{
public:
    std::string m_path;
    std::vector<std::string> m_skips;
};

/**
 * @brief : 需要子类实现自身的反序列化
 * @param : [in]，sourceNode，清单中的源节点
 */ 
void KMBuilderSourceDir::deserializeEx(YAML::Node& sourceNode)
{
    KMYAMLNodeHelper helper(sourceNode);

    // 本地目录的路径，其内容将被复制到源目录中。请注意，目录源当前不支持缓存，因此每次都会重新生成
    m_ptr->m_path = helper.getStringValue("path");
    // 目录中要忽略的源文件
    m_ptr->m_skips = helper.getStringListValue("skip");

    // 校验
    if (m_ptr->m_path.empty())
    {
        throw KMException("n manifest file, 'dir' type source must config 'path'");
    }
}

KMBuilderSourceDir::KMBuilderSourceDir()
    : KMBuilderSource()
    , m_ptr(std::make_shared<Private>())
{
    m_type = SRC_Dir;
}

KMBuilderSourceDir::~KMBuilderSourceDir()
{
}

bool KMBuilderSourceDir::ensureSource()
{
    return false;
}

std::pair<std::string, bool> KMBuilderSourceDir::processNode(std::string path)
{
    if (!m_ptr->m_path.empty())
    {
        std::string sourcePath = KMBuilderUtils::buildFilename(m_baseDir, m_ptr->m_path);
        auto filecopyResult = fileCopy(sourcePath, path, m_ptr->m_skips);
        return filecopyResult;
    }

    return std::make_pair("Dir source must config path", false);
}
