//
// Created by Ht on 2021/5/15.
//

#ifndef INC_0_LIBDEVCPP_JADATATEMPLATE_H
#define INC_0_LIBDEVCPP_JADATATEMPLATE_H

#include <mutex>
#include <utility>
#include <qlibc/qlibc.h>
#include <qlibc/QDataMemoryPool.h>
#include "JAUtil.h"

/**
 * 模板的处理模式如下：
    "templates": {
        "msgTemplate": {    //模板名称
          "@": {            //消息模板
            "command": "${cmd}",
            "addr": "${addr}",
            "data": {
              "param": "${paras}"
            }
          },
          ">>": [           //模板脚本，在消息模板变量执行完毕后，剩余的处理脚本。输入为param，输出对象为 templ
            "print nothing to do with ${param} by object ${templ}."
          ]
        }
      }
    ::脚本的作用，是通过对 param导入数据、对template进行操作的方式，用逻辑修改模板处理后的数据
 */

namespace ja {

    class JE_API JADataTemplateFiller : public qlibc::QData {
    protected:
        JARHandler ja_handler_;
        const qlibc::QRData org_data_ = nullptr;
    public:
        bool hasScript() {
            return ja_handler_ != nullptr;
        }

        JARHandler getScriptBody() {
            return ja_handler_;
        }

        explicit JADataTemplateFiller(qlibc::QRData data, JARHandler  hdlr):
                qlibc::QData(*data), ja_handler_(std::move(hdlr)), org_data_(std::move(data)) {
        }

        void resetFromOriginalData() {
            setInitValue(org_data_->asValueConst());    //模板数据重置
        }
    };

    using JARDataTemplateFiller = std::shared_ptr<JADataTemplateFiller>;

    class JE_API JADataTemplate {
    protected:
        qlibc::QSharedObjectMemoryPool<ja::JADataTemplateFiller, 1>
                *filler_pool_ = nullptr;
        qlibc::QRData src_data_;
        JARHandler   handler_ = nullptr;
    public:

        explicit JADataTemplate(const qlibc::QData &data, JAInstance& inst);

        ~JADataTemplate() {
            delete( filler_pool_);
        }

        JARDataTemplateFiller getBlankFiller();

        void releaseFiller(JARDataTemplateFiller& filler);

    };

    using JARDataTemplate = std::shared_ptr<JADataTemplate>;
}

#endif //INC_0_LIBDEVCPP_JADATATEMPLATE_H
