// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef FLUTTER_LIB_JNI_JNI_CLASS_H_
#define FLUTTER_LIB_JNI_JNI_CLASS_H_

#include <jni.h>

#include "base/android/jni_android.h"
#include "flutter/lib/jni/jni_object.h"
#include "lib/tonic/dart_wrappable.h"

namespace blink {

// Wrapper that exposes a JNI jclass to Dart
class JniClass : public JniObject {
  DEFINE_WRAPPERTYPEINFO();
  friend class JniObject;
  FRIEND_MAKE_REF_COUNTED(JniClass);

 public:
  ~JniClass() override;

  static ftl::RefPtr<JniClass> FromName(const char* className);
  static ftl::RefPtr<JniClass> FromClassObject(const JniObject* clazz);

  jclass java_class() const { return static_cast<jclass>(object_.obj()); }

  intptr_t GetFieldId(const char* name, const char* sig);
  intptr_t GetStaticFieldId(const char* name, const char* sig);
  intptr_t GetMethodId(const char* name, const char* sig);
  intptr_t GetStaticMethodId(const char* name, const char* sig);

  ftl::RefPtr<JniObject> NewObject(jmethodID methodId,
                                   const std::vector<Dart_Handle>& args);

  bool IsAssignable(const JniClass* clazz);

  ftl::RefPtr<JniObject> GetStaticObjectField(jfieldID fieldId);
  bool GetStaticBooleanField(jfieldID fieldId);
  int64_t GetStaticByteField(jfieldID fieldId);
  int64_t GetStaticCharField(jfieldID fieldId);
  int64_t GetStaticShortField(jfieldID fieldId);
  int64_t GetStaticIntField(jfieldID fieldId);
  int64_t GetStaticLongField(jfieldID fieldId);
  double GetStaticFloatField(jfieldID fieldId);
  double GetStaticDoubleField(jfieldID fieldId);

  void SetStaticObjectField(jfieldID fieldId, const JniObject* value);
  void SetStaticBooleanField(jfieldID fieldId, bool value);
  void SetStaticByteField(jfieldID fieldId, int64_t value);
  void SetStaticCharField(jfieldID fieldId, int64_t value);
  void SetStaticShortField(jfieldID fieldId, int64_t value);
  void SetStaticIntField(jfieldID fieldId, int64_t value);
  void SetStaticLongField(jfieldID fieldId, int64_t value);
  void SetStaticFloatField(jfieldID fieldId, double value);
  void SetStaticDoubleField(jfieldID fieldId, double value);

  ftl::RefPtr<JniObject> CallStaticObjectMethod(
      jmethodID methodId,
      const std::vector<Dart_Handle>& args);
  bool CallStaticBooleanMethod(jmethodID methodId,
                               const std::vector<Dart_Handle>& args);
  int64_t CallStaticByteMethod(jmethodID methodId,
                               const std::vector<Dart_Handle>& args);
  int64_t CallStaticCharMethod(jmethodID methodId,
                               const std::vector<Dart_Handle>& args);
  int64_t CallStaticShortMethod(jmethodID methodId,
                                const std::vector<Dart_Handle>& args);
  int64_t CallStaticIntMethod(jmethodID methodId,
                              const std::vector<Dart_Handle>& args);
  int64_t CallStaticLongMethod(jmethodID methodId,
                               const std::vector<Dart_Handle>& args);
  double CallStaticFloatMethod(jmethodID methodId,
                               const std::vector<Dart_Handle>& args);
  double CallStaticDoubleMethod(jmethodID methodId,
                                const std::vector<Dart_Handle>& args);
  void CallStaticVoidMethod(jmethodID methodId,
                            const std::vector<Dart_Handle>& args);

 private:
  JniClass(JNIEnv* env, jclass clazz);
};

}  // namespace blink

#endif  // FLUTTER_LIB_JNI_JNI_CLASS_H_
