// Copyright 2015 The Fuchsia 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 LIB_TONIC_DART_CLASS_LIBRARY_H_
#define LIB_TONIC_DART_CLASS_LIBRARY_H_

#include <memory>
#include <string>
#include <unordered_map>

#include "third_party/dart/runtime/include/dart_api.h"
#include "tonic/dart_class_provider.h"

namespace tonic {
struct DartWrapperInfo;

class DartClassLibrary {
 public:
  explicit DartClassLibrary();
  ~DartClassLibrary();

  void add_provider(const std::string& library_name,
                    std::unique_ptr<DartClassProvider> provider) {
    providers_.insert(std::make_pair(library_name, std::move(provider)));
  }

  Dart_PersistentHandle GetClass(const DartWrapperInfo& info);
  Dart_PersistentHandle GetClass(const std::string& library_name,
                                 const std::string& interface_name);

 private:
  Dart_PersistentHandle GetAndCacheClass(const char* library_name,
                                         const char* interface_name,
                                         Dart_PersistentHandle* cache_slot);

  // TODO(abarth): Move this class somewhere more general.
  // We should also use a more reasonable hash function, such as described in
  // http://www.boost.org/doc/libs/1_35_0/doc/html/boost/hash_combine_id241013.html
  struct PairHasher {
    template <typename T, typename U>
    std::size_t operator()(const std::pair<T, U>& pair) const {
      return std::hash<T>()(pair.first) + 37 * std::hash<U>()(pair.second);
    }
  };

  std::unordered_map<std::string, std::unique_ptr<DartClassProvider>>
      providers_;
  std::unordered_map<const DartWrapperInfo*, Dart_PersistentHandle> info_cache_;
  std::unordered_map<std::pair<std::string, std::string>,
                     Dart_PersistentHandle,
                     PairHasher>
      name_cache_;

  TONIC_DISALLOW_COPY_AND_ASSIGN(DartClassLibrary);
};

}  // namespace tonic

#endif  // LIB_TONIC_DART_CLASS_LIBRARY_H_
