package com.utcloud.cookengine;

import com.utcloud.cookengine.entity.CookTaskInfo;

import java.util.HashMap;
import java.util.List;

/**
 * Created by lixingchen on 2019/12/25.
 */

public final class CookEngine {
    // Used to load the 'native-lib' library on application startup.
    static {
        //System.loadLibrary("CookEngine");
        System.loadLibrary("CookEngineJni");
    }

    CookEngine(CookCallBack callbackParam)
    {
        this.callback = callbackParam;
    }
    CookCallBack getCallback(){
        return this.callback;
    }

    /**
     * 预加载菜谱，获取扩展区数据
     * @param binData 菜谱bin文件
     * @return 返回xml数据，成功返回对应的字节流数组，失败返回null
     */
    public native byte[] prepareGetExternData(byte[] binData);

    /**
     * 预加载菜谱，获取任务步骤信息
     * @param binData 菜谱bin文件
     * @return 返回任务信息，成功返回对应的字节流数组，失败返回null
     */
    public native byte[] prepareGetTaskInfo(byte[] binData);

    /**
     * 创建菜谱实例对象
     * @param binData 菜谱bin文件
     * @param cfgParams 配置动态参数（参数格式为：key1=value1;key2=value2），可以为空
     * @return 成功返回实例id，失败返回0
     */
    public native long createInstance(byte[] binData, String cfgParams);

    /**
     * 销毁菜谱实例对象
     * @param iInstanceId 菜谱实例id
     * @return 成功返回true，失败返回false
     */
    public native boolean destroyInstance(long iInstanceId);

    /**
     * 获取扩展区数据
     * @param iInstanceId 菜谱实例id
     * @return 返回xml数据，成功返回对应的字节流数组，失败返回null
     */
    public native byte[] getExternData(long iInstanceId);

    /**
     * 发送事件
     * @param iInstanceId 菜谱实例id
     * @param trueProductId 产品id
     * @param productFieldName 产品字段名称
     * @param val 值
     * @return true表示成功，false表示失败
     * @note 该接口需在StartTask之后调用才会有用
     */
    public native boolean postEvent(long iInstanceId, long trueProductId, String productFieldName,
                                           Object val);

    /**
     * 开始任务，并进行真实产品实例id和虚拟产品产品实例id的绑定
     * @param iInstanceid 菜谱实例id
     * @param taskId 任务id
     * @param trueProductMap 任务需绑定的真实产品信息，包括《产品实例id， 产品名称》；比如《10501， “ecooker_3.5kw”》
     * @return true表示开启任务成功，false表示开启任务失败
     */
    public native boolean startTask(long iInstanceid, String taskId, HashMap<Long, String> trueProductMap);

    /**
     * 暂停任务
     * @param iInstanceid 菜谱实例id
     * @param taskId 任务id
     * @return 成功返回true，失败返回false
     */
    public native boolean pauseTask(long iInstanceid, String taskId);

    /**
     * 恢复任务
     * @param iInstanceid 菜谱实例id
     * @param taskId 任务id
     * @return 成功返回true，失败返回false
     */
    public native boolean resumeTask(long iInstanceid, String taskId);

    /**
     * 终止任务
     * @param iInstanceid 菜谱实例id
     * @param taskId 任务id
     * @return 成功返回true，失败返回false
     */
    public native boolean terminateTask(long iInstanceid, String taskId);


    /**
     * 跳过当前步，提前结束当前步的计时等待
     * @param iInstanceid 菜谱实例id
     * @param taskId 任务id
     * @return 成功返回true，失败返回false
     */
    public native boolean  skipCurrentStep(long iInstanceid, String taskId);



    /**
     * 获取任务信息
     * @param iInstanceid 菜谱实例id
     * @return 返回任务信息，成功返回对应的字节流数组，失败返回null
     */
    public native byte[] getTaskInfo(long iInstanceid);



    private CookCallBack callback;
}
