// Copyright 2014 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.

#include "base/bind.h"
#include "mojo/application/application_runner_chromium.h"
#include "mojo/public/c/system/main.h"
#include "mojo/public/cpp/application/application_delegate.h"
#include "mojo/public/cpp/application/application_impl.h"
#include "mojo/public/cpp/bindings/interface_ptr.h"
#include "mojo/public/cpp/system/message_pipe.h"
#include "services/http_server/public/http_server.mojom.h"
#include "services/http_server/public/http_server_factory.mojom.h"
#include "services/http_server/public/http_server_util.h"

namespace mojo {
namespace examples {

// This is an example of a self-contained HTTP handler. It uses the HTTP Server
// service to handle the HTTP protocol details, and just contains the logic for
// handling its registered urls.
class HttpHandler : public ApplicationDelegate,
                    public http_server::HttpHandler {
 public:
  HttpHandler() : binding_(this) {}
  ~HttpHandler() override {}

 private:
  // ApplicationDelegate:
  void Initialize(ApplicationImpl* app) override {
    http_server::HttpHandlerPtr http_handler_ptr;
    binding_.Bind(GetProxy(&http_handler_ptr));

    http_server::HttpServerFactoryPtr http_server_factory;
    app->ConnectToService("mojo:http_server", &http_server_factory);
    http_server_factory->CreateHttpServer(GetProxy(&http_server_).Pass(), 80);
    http_server_->SetHandler(
        "/test",
        http_handler_ptr.Pass(),
        base::Bind(&HttpHandler::AddHandlerCallback, base::Unretained(this)));
  }

  // http_server::HttpHandler:
  void HandleRequest(
      http_server::HttpRequestPtr request,
      const Callback<void(http_server::HttpResponsePtr)>& callback) override {
    callback.Run(http_server::CreateHttpResponse(200, "Hello World\n"));
  }

  void AddHandlerCallback(bool result) {
    CHECK(result);
  }

  Binding<http_server::HttpHandler> binding_;
  http_server::HttpServerPtr http_server_;

  DISALLOW_COPY_AND_ASSIGN(HttpHandler);
};

}  // namespace examples
}  // namespace mojo

MojoResult MojoMain(MojoHandle shell_handle) {
  mojo::ApplicationRunnerChromium runner(new mojo::examples::HttpHandler());
  return runner.Run(shell_handle);
}
