/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
//
// Created by Darin on 12/02/2018.
//

#ifndef WEEXV8_WEEXAPIHEADER_H
#define WEEXV8_WEEXAPIHEADER_H

#include <vector>
#include <set>
#include <map>
#include "WeexApiValue.h"

#ifdef OS_ANDROID
#include <jni.h>
#include "third_party/IPC/IPCResult.h"
#endif

namespace WeexCore {
    class WXCoreMargin;
    class WXCorePadding;
    class WXCoreBorderWidth;
    class WXCoreSize;
}  // namespace WeexCore
using namespace WeexCore;

class WeexJSResult{
public:
    std::unique_ptr<char[]> data;
    int length = 0;
    WeexJSResult() : data(nullptr), length(0) {}
    WeexJSResult(std::unique_ptr<char[]> d, int l) : data(std::move(d)), length(l) {}
};

typedef struct InitFrameworkParams {
    WeexByteArray *type;
    WeexByteArray *value;
} INIT_FRAMEWORK_PARAMS;

#ifdef OS_ANDROID

typedef void (*FuncSetJSVersion)(const char *jsVersion);

typedef void (*FuncReportException)(const char *pageId, const char *func, const char *exception_string);
typedef void (*FuncReportServerCrash)(const char *instance_id);
typedef void (*FuncReportNativeInitStatus)(const char *status_code, const char *error_msg);

typedef void (*FuncCallNative)(const char *pageId, const char *task, const char *callback);

typedef std::unique_ptr<ValueWithType> (*FuncCallNativeModule)(const char *pageId, const char *module, const char *method,
                                                           const char *arguments, int argumentsLen, const char *options, int optionsLen);

typedef void (*FuncCallNativeComponent)(const char *pageId, const char *ref,
                                        const char *method, const char *arguments, int argumentsLen, const char *options, int optionsLen);

typedef void (*FuncCallAddElement)(const char *pageId, const char *parentRef, const char *domStr, int domLen,
                                   const char *index_cstr);

typedef void (*FuncSetTimeout)(const char *callbackId, const char *time);

typedef void (*FuncCallNativeLog)(const char *str_array);

typedef void (*FuncCallCreateBody)(const char *pageId, const char *domStr, int domStrLen);

typedef int (*FuncCallUpdateFinish)(const char *pageId, const char *task,int taskLen, const char *callback, int callbackLen);

typedef void (*FuncCallCreateFinish)(const char *pageId);

typedef int (*FuncCallRefreshFinish)(const char *pageId, const char *task, const char *callback);

typedef void (*FuncCallUpdateAttrs)(const char *pageId, const char *ref, const char *data, int dataLen);

typedef void (*FuncCallUpdateStyle)(const char *pageId, const char *ref, const char *data, int dataLen);

typedef void (*FuncCallRemoveElement)(const char *pageId, const char *ref);

typedef void (*FuncCallMoveElement)(const char *pageId, const char *ref, const char *parentRef, int index);

typedef void (*FuncCallAddEvent)(const char *pageId, const char *ref, const char *event);

typedef void (*FuncCallRemoveEvent)(const char *pageId, const char *ref, const char *event);

typedef int (*FuncSetInterval)(const char *pageId, const char *callbackId, const char *_time);

typedef void (*FuncClearInterval)(const char *pageId, const char *callbackId);

typedef const char *(*FuncCallGCanvasLinkNative)(const char *pageId, int type, const char *args);

typedef const char *(*FuncT3dLinkNative)(int type, const char *args);

typedef void (*FuncCallHandlePostMessage)(const char *vimId, const char *data, int dataLength);

typedef void
(*FuncCallDIspatchMessage)(const char *clientId, const char *data, int dataLength, const char *callback, const char *vmId);

typedef std::unique_ptr<WeexJSResult> (*FuncCallDispatchMessageSync)(
    const char *clientId, const char *data, int dataLength, const char *vmId);

typedef void
(*FuncOnReceivedResult)(long callback_id, std::unique_ptr<WeexJSResult>& result);
typedef void
(*FuncUpdateComponentData)(const char* page_id, const char* cid, const char* json_data);


typedef struct FunctionsExposedByCore {
    FuncSetJSVersion funcSetJSVersion;
    FuncReportException funcReportException;
    FuncCallNative funcCallNative;
    FuncCallNativeModule funcCallNativeModule;
    FuncCallNativeComponent funcCallNativeComponent;
    FuncCallAddElement funcCallAddElement;
    FuncSetTimeout funcSetTimeout;
    FuncCallNativeLog funcCallNativeLog;
    FuncCallCreateBody funcCallCreateBody;
    FuncCallUpdateFinish funcCallUpdateFinish;
    FuncCallCreateFinish funcCallCreateFinish;
    FuncCallRefreshFinish funcCallRefreshFinish;
    FuncCallUpdateAttrs funcCallUpdateAttrs;
    FuncCallUpdateStyle funcCallUpdateStyle;
    FuncCallRemoveElement funcCallRemoveElement;
    FuncCallMoveElement funcCallMoveElement;
    FuncCallAddEvent funcCallAddEvent;
    FuncCallRemoveEvent funcCallRemoveEvent;
    FuncSetInterval funcSetInterval;
    FuncClearInterval funcClearInterval;
    FuncCallGCanvasLinkNative funcCallGCanvasLinkNative;
    FuncT3dLinkNative funcT3dLinkNative;
    FuncCallHandlePostMessage funcCallHandlePostMessage;
    FuncCallDIspatchMessage funcCallDIspatchMessage;
    FuncCallDispatchMessageSync funcCallDispatchMessageSync;
    FuncOnReceivedResult  funcOnReceivedResult;
    FuncUpdateComponentData funcUpdateComponentData;
} FunctionsExposedByCore;

typedef void (*FuncCallSetJSVersion)(const char* version);
typedef int (*CallNative)(const char *pageId, const char *task, const char *callback);
typedef int (*FuncCreateBody)(const char* page_id, const char *component_type, const char* ref,
                              std::map<std::string, std::string> *styles,
                              std::map<std::string, std::string> *attributes,
                              std::set<std::string> *events,
                              const WXCoreMargin &margins,
                              const WXCorePadding &paddings,
                              const WXCoreBorderWidth &borders);
typedef int (*FuncCreateFinish)(const char *pageId);
typedef int (*FuncAddElement)(const char* page_id, const char *component_type, const char* ref,
                              int &index, const char* parentRef,
                              std::map<std::string, std::string> *styles,
                              std::map<std::string, std::string> *attributes,
                              std::set<std::string> *events,
                              const WXCoreMargin &margins,
                              const WXCorePadding &paddings,
                              const WXCoreBorderWidth &borders,
                              bool willLayout);
typedef int (*FuncRemoveElement)(const char *pageId, const char *ref);
typedef int (*FuncMoveElement)(const char *pageId, const char *ref, const char *parentRef, int index);
typedef int (*FuncAddEvent)(const char *pageId, const char *ref, const char *event);
typedef int (*FuncRemoveEvent)(const char *pageId, const char *ref, const char *event);
typedef int (*FuncUpdateStyle)(const char* page_id, const char* ref,
                               std::vector<std::pair<std::string, std::string>> *style,
                               std::vector<std::pair<std::string, std::string>> *margin,
                               std::vector<std::pair<std::string, std::string>> *padding,
                               std::vector<std::pair<std::string, std::string>> *border);
typedef int (*FuncUpdateAttr)(const char* page_id, const char* ref,
                              std::vector<std::pair<std::string, std::string>> *attrs);
typedef int (*FuncLayout)(const char *page_id, const char *ref,
                          int top, int bottom, int left, int right,
                          int height, int width, int index);
typedef int (*FuncAppendTreeCreateFinish)(const char* page_id, const char* ref);
typedef int (*FuncHasTransitionPros)(const char* page_id, const char* ref,
                                     std::vector<std::pair<std::string, std::string>> *style);
typedef WXCoreSize (*InvokeMeasureFunction)(const char* page_id, long render_ptr, float width, int width_measure_mode, float height, int height_measure_mode);
typedef void (*InvokeLayoutBefore)(const char* page_id, long render_ptr);
typedef void (*InvokeLayoutAfter)(const char* page_id, long render_ptr, float width, float height);
typedef struct PlatformExposeFunctions {
    FuncCallSetJSVersion set_js_version;
    FuncReportException report_exception;
    FuncReportServerCrash report_server_crash;
    FuncReportNativeInitStatus report_native_Init_status;
    CallNative call_native;
    FuncCallNativeModule call_native_module;
    FuncCallNativeComponent call_native_component;
    FuncAddElement add_element;
    FuncSetTimeout set_timeout;
    FuncCallNativeLog native_log;
    FuncCreateBody create_body;
    FuncCallUpdateFinish update_finish;
    FuncCreateFinish create_finish;
    FuncCreateFinish render_success;
    FuncCallRefreshFinish refresh_finish;
    FuncUpdateAttr update_attrs;
    FuncUpdateStyle update_style;
    FuncRemoveElement remove_element;
    FuncMoveElement move_element;
    FuncAddEvent add_event;
    FuncRemoveEvent remove_event;
    FuncCallHandlePostMessage post_message;
    FuncCallDIspatchMessage dispatch_message;
    FuncLayout layout;
    FuncAppendTreeCreateFinish append_tree_create_finish;
    FuncHasTransitionPros has_transition_pros;
    InvokeMeasureFunction invoke_measure_function;
    InvokeLayoutBefore invoke_layout_before;
    InvokeLayoutAfter invoke_layout_after;
} PlatformExposeFunctions;


typedef int (*FuncInitFramework)(const char *script, std::vector<INIT_FRAMEWORK_PARAMS *> &params);


typedef int (*FuncInitAppFramework)(const char *instanceId, const char *appFramework,
                                    std::vector<INIT_FRAMEWORK_PARAMS *> &params);

typedef int (*FuncCreateAppContext)(const char *instanceId, const char *jsBundle);

typedef std::unique_ptr<WeexJSResult> (*FuncExeJSOnAppWithResult)(const char *instanceId, const char *jsBundle);

typedef int (*FuncCallJSOnAppContext)(const char *instanceId, const char *func, std::vector<VALUE_WITH_TYPE *> &params);

typedef int (*FuncDestroyAppContext)(const char *instanceId);

typedef int (*FuncExeJsService)(const char *source);

typedef int (*FuncExeCTimeCallback)(const char *source);

typedef int (*FuncExeJS)(const char *instanceId, const char *nameSpace, const char *func,
                         std::vector<VALUE_WITH_TYPE *> &params);

typedef std::unique_ptr<WeexJSResult>(*FuncExeJSWithResult)(const char *instanceId, const char *nameSpace, const char *func,
                                           std::vector<VALUE_WITH_TYPE *> &params);

typedef void(*FuncExeJSWithResultId)(const char *instanceId, const char *nameSpace, const char *func,
                                           std::vector<VALUE_WITH_TYPE *> &params, long callback_id);

typedef int (*FuncCreateInstance)(const char *instanceId, const char *func, const char *script, const char *opts,
                                  const char *initData, const char *extendsApi, std::vector<INIT_FRAMEWORK_PARAMS*>& params);

typedef std::unique_ptr<WeexJSResult> (*FuncExeJSOnInstance)(const char *instanceId, const char *script);

typedef int (*FuncDestroyInstance)(const char *instanceId);

typedef int (*FuncUpdateGlobalConfig)(const char *config);

typedef struct FunctionsExposedByJS {
    FuncInitFramework funcInitFramework;
    FuncInitAppFramework funcInitAppFramework;
    FuncCreateAppContext funcCreateAppContext;
    FuncExeJSOnAppWithResult funcExeJSOnAppWithResult;
    FuncCallJSOnAppContext funcCallJSOnAppContext;
    FuncDestroyAppContext funcDestroyAppContext;
    FuncExeJsService funcExeJsService;
    FuncExeCTimeCallback funcExeCTimeCallback;
    FuncExeJS funcExeJS;
    FuncExeJSWithResult funcExeJSWithResult;
    FuncExeJSWithResultId funcExeJSWithResultId;
    FuncCreateInstance funcCreateInstance;
    FuncExeJSOnInstance funcExeJSOnInstance;
    FuncDestroyInstance funcDestroyInstance;
    FuncUpdateGlobalConfig funcUpdateGlobalConfig;
} FunctionsExposedByJS;


typedef void (*SetDefaultHeightAndWidthIntoRootDomCallback)(const std::string &instance_id,
                                                    float default_width,
                                                    float default_height,
                                                    bool is_width_wrap_content,
                                                    bool is_height_wrap_content);
typedef void (*OnInstanceCloseCallback)(const std::string &instance_id);
typedef void (*SetStyleWidthCallback)(const std::string &instance_id, const std::string& render_ref, float width);
typedef void (*SetStyleHeightCallback)(const std::string &instance_id, const std::string& render_ref, float height);
typedef void (*SetMarginCallback)(const std::string &instance_id, const std::string& render_ref, int edge, float value);
typedef void (*SetPaddingCallback)(const std::string &instance_id, const std::string& render_ref, int edge, float value);
typedef void (*SetPositionCallback)(const std::string &instance_id, const std::string& render_ref, int edge, float value);
typedef void (*MarkDirtyCallback)(const std::string &instance_id, const std::string& render_ref);
typedef void (*SetViewPortWidthCallback)(const std::string &instance_id, float width);
typedef void (*ForceLayoutCallback)(const std::string &instance_id);
typedef bool (*NotifyLayoutCallback)(const std::string &instance_id);
typedef std::vector<int64_t> (*GetFirstScreenRenderTimeCallback)(const std::string &instance_id);
typedef std::vector<int64_t> (*GetRenderFinishTimeCallback)(const std::string &instance_id);
typedef void (*SetRenderContainerWrapContentCallback)(const std::string &instance_id, bool wrap);
typedef void (*BindMeasurementToRenderObjectCallback)(long ptr);
typedef void (*RegisterCoreEnvCallback)(const std::string& key, const std::string& value);

typedef long (*GetRenderObjectCallback)(const std::string &instance_id, const std::string& render_ref);
typedef void (*UpdateRenderObjectStyleCallback)(long render_ptr, const std::string& key, const std::string& value);
typedef void (*UpdateRenderObjectAttrCallback)(long render_ptr, const std::string& key, const std::string& value);
typedef long (*CopyRenderObjectCallback)(long render_ptr);
typedef void (*SetMeasureFunctionAdapter)();
typedef void (*SetPlatform)(const std::string& platformName);
typedef void (*SetDeviceWidthAndHeight)(float width, float height);
typedef void (*AddOption)(const std::string& key, const std::string& value);
typedef struct CoreSideFunctionsOfPlatformBridge {
    SetDefaultHeightAndWidthIntoRootDomCallback set_default_height_and_width_into_root_dom;
    OnInstanceCloseCallback on_instance_close;
    SetStyleWidthCallback set_style_width;
    SetStyleHeightCallback set_style_height;
    SetMarginCallback set_margin;
    SetPaddingCallback set_padding;
    SetPositionCallback set_position;
    MarkDirtyCallback mark_dirty;
    SetViewPortWidthCallback set_view_port_width;
    ForceLayoutCallback force_layout;
    NotifyLayoutCallback notify_layout;
    GetFirstScreenRenderTimeCallback get_first_screen_render_time;
    GetRenderFinishTimeCallback get_render_finish_time;
    SetRenderContainerWrapContentCallback set_render_container_wrap_content;
    BindMeasurementToRenderObjectCallback bind_measurement_to_render_object;
    RegisterCoreEnvCallback register_core_env;
    GetRenderObjectCallback get_render_object;
    UpdateRenderObjectStyleCallback update_render_object_style;
    UpdateRenderObjectAttrCallback update_render_object_attr;
    CopyRenderObjectCallback copy_render_object;
    SetMeasureFunctionAdapter set_measure_function_adapter;
    SetPlatform set_platform;
    SetDeviceWidthAndHeight set_device_width_and_height;
    AddOption add_option;

    FuncInitFramework init_framework;
    FuncInitAppFramework init_app_framework;
    FuncCreateAppContext create_app_context;
    FuncExeJSOnAppWithResult exec_js__on_app_with_result;
    FuncCallJSOnAppContext call_js_on_app_context;
    FuncDestroyAppContext destroy_app_context;
    FuncExeJsService exec_js_service;
    FuncExeCTimeCallback exec_time_callback;
    FuncExeJS exec_js;
    FuncExeJSWithResult exec_js_with_result;
    FuncCreateInstance create_instance;
    FuncExeJSOnInstance exec_js_on_instance;
    FuncDestroyInstance destroy_instance;
    FuncUpdateGlobalConfig update_global_config;
} CoreSideFunctionsOfPlatformBridge;
#endif

#endif //WEEXV8_WEEXAPIHEADER_H
