// Copyright 2015 The Chromium OS 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 LIBWEAVE_EXAMPLES_UBUNTU_EVENT_HTTP_SERVER_H_
#define LIBWEAVE_EXAMPLES_UBUNTU_EVENT_HTTP_SERVER_H_

#include <event2/http.h>
#include <evhttp.h>
#include <openssl/ssl.h>

#include <map>
#include <string>
#include <vector>

#include <base/memory/weak_ptr.h>
#include <weave/provider/http_server.h>

namespace weave {
namespace examples {

class EventTaskRunner;

// HTTP/HTTPS server implemented with libevent.
class HttpServerImpl : public provider::HttpServer {
 public:
  class RequestImpl;

  explicit HttpServerImpl(EventTaskRunner* task_runner);

  void AddOnStateChangedCallback(
      const OnStateChangedCallback& callback) override;
  void AddRequestHandler(const std::string& path_prefix,
                         const OnRequestCallback& callback) override;
  uint16_t GetHttpPort() const override;
  uint16_t GetHttpsPort() const override;
  const std::vector<uint8_t>& GetHttpsCertificateFingerprint() const override;

 private:
  void GenerateX509();
  static void ProcessRequestCallback(evhttp_request* req, void* arg);
  void ProcessRequest(evhttp_request* req);
  void ProcessReply(std::shared_ptr<RequestImpl> request,
                    int status_code,
                    const std::string& data,
                    const std::string& mime_type);
  void NotFound(evhttp_request* req);

  std::map<std::string, OnRequestCallback> handlers_;

  std::unique_ptr<EC_KEY, decltype(&EC_KEY_free)> ec_key_{nullptr,
                                                          &EC_KEY_free};

  std::unique_ptr<EVP_PKEY, decltype(&EVP_PKEY_free)> pkey_{nullptr,
                                                            &EVP_PKEY_free};

  std::unique_ptr<X509, decltype(&X509_free)> x509_{nullptr, &X509_free};

  std::unique_ptr<SSL_CTX, decltype(&SSL_CTX_free)> ctx_{nullptr,
                                                         &SSL_CTX_free};
  std::vector<uint8_t> cert_fingerprint_;
  EventTaskRunner* task_runner_{nullptr};
  std::unique_ptr<evhttp, decltype(&evhttp_free)> httpd_{nullptr, &evhttp_free};
  std::unique_ptr<evhttp, decltype(&evhttp_free)> httpsd_{nullptr,
                                                          &evhttp_free};

  base::WeakPtrFactory<HttpServerImpl> weak_ptr_factory_{this};
};

}  // namespace examples
}  // namespace weave

#endif  // LIBWEAVE_EXAMPLES_UBUNTU_EVENT_HTTP_SERVER_H_
