// Copyright 2017 The Cobalt Authors. All Rights Reserved.
//
// Licensed 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 COBALT_SCRIPT_V8C_WRAPPER_FACTORY_H_
#define COBALT_SCRIPT_V8C_WRAPPER_FACTORY_H_

#include <memory>

#include "base/callback.h"
#include "base/containers/hash_tables.h"
#include "cobalt/script/wrappable.h"
#include "v8/include/v8.h"

namespace cobalt {
namespace script {
namespace v8c {

class V8cGlobalEnvironment;
class WrapperPrivate;

// Holds a mapping between Wrappable types and base::Callbacks that create new
// Wrapper objects corresponding to the Wrappable type.
class WrapperFactory : public Wrappable::CachedWrapperAccessor {
 public:
  // Callback to create a new v8::Object that is a wrapper for the Wrappable.
  typedef base::Callback<v8::Local<v8::Object>(v8::Isolate*,
                                               const scoped_refptr<Wrappable>&)>
      CreateWrapperFunction;

  // Callback to get v8::FunctionTemplate of an interface.
  typedef base::Callback<v8::Local<v8::FunctionTemplate>(v8::Isolate*)>
      GetFunctionTemplate;

  explicit WrapperFactory(v8::Isolate* isolate) : isolate_(isolate) {}

  void RegisterWrappableType(base::TypeId wrappable_type,
                             const CreateWrapperFunction& create_function,
                             const GetFunctionTemplate& class_function);

  v8::Local<v8::Object> GetWrapper(const scoped_refptr<Wrappable>& wrappable);

  // Added temporarily for debugging purpose, will be removed soon.
  bool HasWrapper(Wrappable* wrappable);
  // Attempt to get the |WrapperPrivate| associated with |wrappable|.  Returns
  // |nullptr| if no |WrapperPrivate| was found.
  WrapperPrivate* MaybeGetWrapperPrivate(Wrappable* wrappable);

  bool DoesObjectImplementInterface(v8::Local<v8::Object> object,
                                    base::TypeId id) const;

 private:
  struct WrappableTypeFunctions {
    CreateWrapperFunction create_wrapper;
    GetFunctionTemplate get_function_template;
    WrappableTypeFunctions(const CreateWrapperFunction& create_wrapper,
                           const GetFunctionTemplate& get_function_template)
        : create_wrapper(create_wrapper),
          get_function_template(get_function_template) {}
  };

  std::unique_ptr<Wrappable::WeakWrapperHandle> CreateWrapper(
      const scoped_refptr<Wrappable>& wrappable) const;

  typedef base::hash_map<base::TypeId, WrappableTypeFunctions>
      WrappableTypeFunctionsHashMap;

  v8::Isolate* isolate_;
  WrappableTypeFunctionsHashMap wrappable_type_functions_;
};

}  // namespace v8c
}  // namespace script
}  // namespace cobalt

#endif  // COBALT_SCRIPT_V8C_WRAPPER_FACTORY_H_
