/**
 * 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.
 */

#ifndef WEEX_PROJECT_PLATFORM_SIDE_INSIMPLE_H
#define WEEX_PROJECT_PLATFORM_SIDE_INSIMPLE_H

#include "android/wrap/wx_bridge.h"
#include "base/common.h"
#include "core/bridge/platform_bridge.h"

namespace WeexCore {
class WMLBridge;
class AndroidSide : public PlatformBridge::PlatformSide {
 public:
  AndroidSide();
  virtual ~AndroidSide();
  WXCoreSize InvokeMeasureFunction(const char* page_id, long render_ptr,
                                   float width, int width_measure_mode,
                                   float height,
                                   int height_measure_mode) override;
  void InvokeLayoutBefore(const char* page_id, long render_ptr) override;
  void InvokeLayoutPlatform(const char* page_id, long render_ptr) override;
  void InvokeLayoutAfter(const char* page_id, long render_ptr, float width,
                         float height) override;
  void TriggerVSync(const char* page_id) override;
  void SetJSVersion(const char* version) override;
  void ReportException(const char* page_id, const char* func,
                       const char* exception_string) override;
  void ReportServerCrash(const char* instance_id) override;
  void ReportNativeInitStatus(const char* status_code,
                              const char* error_msg) override;
  int CallNative(const char* page_id, const char* task,
                 const char* callback) override;
  std::unique_ptr<ValueWithType> CallNativeModule(
      const char* page_ld, const char* module, const char* method,
      const char* arguments, int arguments_length, const char* options,
      int options_length) override;
  void CallNativeComponent(const char* page_id, const char* ref,
                           const char* method, const char* arguments,
                           int arguments_length, const char* options,
                           int options_length) override;
  void SetPageDirty(const char* page_id, bool dirty) override ;
  void SetTimeout(const char* callback_id, const char* time) override;
  void NativeLog(const char* str_array) override;
  int UpdateFinish(const char* page_id, const char* task, int taskLen,
                   const char* callback, int callbackLen) override;
  int RefreshFinish(const char* page_id, const char* task,
                    const char* callback) override;
  int AddEvent(const char* page_id, const char* ref,
               const char* event) override;
  int RemoveEvent(const char* page_id, const char* ref,
                  const char* event) override;
  int CreateBody(const char* pageId, const char* componentType, 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) override;

  int AddElement(const char* pageId, const char* componentType, 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) override;
  int AddChildToRichtext(const char *pageId, const char *nodeType, const char *ref, const char *parentRef,
                         const char *richtextRef, std::map<std::string, std::string> *styles,
                         std::map<std::string, std::string> *attributes) override;
  int RemoveChildFromRichtext(const char *pageId, const char *ref, const char *parent_ref,
                              const char *richtext_ref) override;
  int UpdateRichtextStyle(const char *pageId, const char *ref,
                          std::vector<std::pair<std::string, std::string>> *style, const char *parent_ref,
                          const char *richtext_ref) override;
  int UpdateRichtextChildAttr(const char *pageId, const char *ref,
                              std::vector<std::pair<std::string, std::string>> *attrs,
                              const char *parent_ref, const char *richtext_ref) override;
  int Layout(const char* page_id, const char* ref, float top, float bottom,
             float left, float right, float height, float width, bool isRTL,
             int index) override;

  int UpdateStyle(
      const char* pageId, 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) override;
  int UpdateAttr(
      const char* pageId, const char* ref,
      std::vector<std::pair<std::string, std::string>>* attrs) override;

  int CreateFinish(const char* pageId) override;

  int RenderSuccess(const char* pageId) override;

  int RemoveElement(const char* pageId, const char* ref) override;

  int MoveElement(const char* pageId, const char* ref, const char* parentRef,
                  int index) override;

  int AppendTreeCreateFinish(const char* pageId, const char* ref) override;

  int HasTransitionPros(
      const char* pageId, const char* ref,
      std::vector<std::pair<std::string, std::string>>* style) override;
  void PostMessage(const char* vm_id, const char* data, int dataLength) override;
  void DispatchMessage(const char* client_id,
                       const char* data, int dataLength, const char* callback, const char* vm_id) override;
  std::unique_ptr<WeexJSResult> DispatchMessageSync(const char* client_id,
                                                    const char* data,
                                                    int dataLength,
                                                    const char* vm_id) override;
  void OnReceivedResult(long callback_id, std::unique_ptr<WeexJSResult>& result) override;

  jobject getMeasureFunc(const char* pageId, jlong renderObjectPtr);

 private:
  WMLBridge* wml_bridge_;
  WXBridge* wx_bridge_;
  DISALLOW_COPY_AND_ASSIGN(AndroidSide);
};
}  // namespace WeexCore

#endif  // WEEX_PROJECT_PLATFORM_SIDE_INSIMPLE_H
