// 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 WEBSERVER_WEBSERVD_SERVER_H_
#define WEBSERVER_WEBSERVD_SERVER_H_

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

#include <base/macros.h>
#include <base/memory/weak_ptr.h>
#include <brillo/dbus/dbus_object.h>
#include <brillo/dbus/exported_object_manager.h>
#include <brillo/secure_blob.h>

#include "dbus_bindings/org.chromium.WebServer.Server.h"
#include "webservd/encryptor.h"
#include "webservd/firewall_interface.h"
#include "webservd/server_interface.h"
#include "webservd/temp_file_manager.h"

namespace webservd {

class DBusProtocolHandler;
class DBusServerRequest;

// Top-level D-Bus object to interface with the server as a whole.
class Server final : public org::chromium::WebServer::ServerInterface,
                     public ServerInterface {
 public:
  Server(brillo::dbus_utils::ExportedObjectManager* object_manager,
         const Config& config,
         std::unique_ptr<FirewallInterface> firewall);
  // Need to off-line the destructor to allow |protocol_handler_map_| to contain
  // a forward-declared pointer to DBusProtocolHandler.
  ~Server();

  void RegisterAsync(
      const brillo::dbus_utils::AsyncEventSequencer::CompletionAction& cb);

  // Overrides from org::chromium::WebServer::ServerInterface.
  std::string Ping() override;

  // Overrides from webservd::ServerInterface.
  void ProtocolHandlerStarted(ProtocolHandler* handler) override;
  void ProtocolHandlerStopped(ProtocolHandler* handler) override;
  const Config& GetConfig() const override { return config_; }
  TempFileManager* GetTempFileManager() override { return &temp_file_manager_; }

  scoped_refptr<dbus::Bus> GetBus() { return dbus_object_->GetBus(); }

  // Allows injection of a non-default |encryptor| (used for testing). The
  // caller retains ownership of the pointer.
  void SetEncryptor(Encryptor* encryptor) { encryptor_ = encryptor; }

 private:
  void CreateProtocolHandler(Config::ProtocolHandler* handler_config);
  void InitTlsData();
  void OnFirewallServiceOnline();
  base::FilePath GetUploadDirectory() const;

  org::chromium::WebServer::ServerAdaptor dbus_adaptor_{this};
  std::unique_ptr<brillo::dbus_utils::DBusObject> dbus_object_;
  std::unique_ptr<Encryptor> default_encryptor_;
  Encryptor* encryptor_;

  Config config_;
  int last_protocol_handler_index_{0};
  brillo::Blob TLS_certificate_;
  brillo::Blob TLS_certificate_fingerprint_;
  brillo::SecureBlob TLS_private_key_;

  std::map<ProtocolHandler*, std::unique_ptr<DBusProtocolHandler>>
      protocol_handler_map_;
  // |protocol_handlers_| is currently used to maintain the lifetime of
  // ProtocolHandler object instances. When (if) we start to add/remove
  // protocol handlers dynamically at run-time, it will be used to locate
  // existing handlers so they can be removed.
  std::vector<std::unique_ptr<ProtocolHandler>> protocol_handlers_;

  // The firewall service handler.
  const std::unique_ptr<FirewallInterface> firewall_;

  FileDeleter file_deleter_;
  TempFileManager temp_file_manager_{GetUploadDirectory(), &file_deleter_};

  base::WeakPtrFactory<Server> weak_ptr_factory_{this};
  DISALLOW_COPY_AND_ASSIGN(Server);
};

}  // namespace webservd

#endif  // WEBSERVER_WEBSERVD_SERVER_H_
