/*
 * Copyright 2016 Google Inc. 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_H5VCC_DIAL_DIAL_SERVER_H_
#define COBALT_H5VCC_DIAL_DIAL_SERVER_H_

#if defined(DIAL_SERVER)

#include <map>
#include <string>

#include "base/memory/weak_ptr.h"
#include "base/message_loop_proxy.h"
#include "base/threading/thread_checker.h"
#include "cobalt/h5vcc/dial/dial_http_request.h"
#include "cobalt/h5vcc/dial/dial_http_response.h"
#include "cobalt/script/callback_function.h"
#include "cobalt/script/environment_settings.h"
#include "cobalt/script/script_object.h"
#include "cobalt/script/wrappable.h"
#include "net/dial/dial_service.h"

namespace cobalt {
namespace h5vcc {
namespace dial {

// Template boilerplate for wrapping a script callback safely.
template <typename T>
class ScriptCallbackWrapper
    : public base::RefCountedThreadSafe<ScriptCallbackWrapper<T> > {
 public:
  typedef script::ScriptObject<T> ScriptObject;
  ScriptCallbackWrapper(script::Wrappable* wrappable, const ScriptObject& func)
      : callback(wrappable, func) {}
  typename ScriptObject::Reference callback;
};

class DialServer : public script::Wrappable,
                   public base::SupportsWeakPtr<DialServer> {
 public:
  enum Method {
    kDelete,
    kGet,
    kPost,
    kMethodCount,
  };

  typedef script::CallbackFunction<bool(const scoped_refptr<DialHttpRequest>&,
                                        const scoped_refptr<DialHttpResponse>&)>
      DialHttpRequestCallback;
  typedef ScriptCallbackWrapper<DialHttpRequestCallback>
      DialHttpRequestCallbackWrapper;

  DialServer(script::EnvironmentSettings* environment_settings,
             const std::string& service_name);

  // Register a Javascript callback for various DIAL methods.
  bool OnDelete(const std::string& path,
                const DialHttpRequestCallbackWrapper::ScriptObject& handler);
  bool OnGet(const std::string& path,
             const DialHttpRequestCallbackWrapper::ScriptObject& handler);
  bool OnPost(const std::string& path,
              const DialHttpRequestCallbackWrapper::ScriptObject& handler);
  const std::string& service_name() const;

  scoped_ptr<net::HttpServerResponseInfo> RunCallback(
      const std::string& path, const net::HttpServerRequestInfo& request);

  DEFINE_WRAPPABLE_TYPE(DialServer);

 private:
  class ServiceHandler;

  ~DialServer();
  bool AddHandler(Method method, const std::string& path,
                  const DialHttpRequestCallbackWrapper::ScriptObject& handler);

  typedef std::map<std::string, scoped_refptr<DialHttpRequestCallbackWrapper> >
      CallbackMap;
  base::ThreadChecker thread_checker_;
  CallbackMap callback_map_[kMethodCount];

  scoped_refptr<net::DialServiceProxy> dial_service_proxy_;
  scoped_refptr<ServiceHandler> service_handler_;

  DISALLOW_COPY_AND_ASSIGN(DialServer);
};

}  // namespace dial
}  // namespace h5vcc
}  // namespace cobalt
#endif  // defined(DIAL_SERVER)

#endif  // COBALT_H5VCC_DIAL_DIAL_SERVER_H_
