// Copyright 2016 The Android Open Source Project
//
// 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 WEBSERVER_LIBWEBSERV_BINDER_SERVER_H_
#define WEBSERVER_LIBWEBSERV_BINDER_SERVER_H_

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

#include <brillo/message_loops/message_loop.h>
#include <base/bind.h>
#include <base/macros.h>
#include <base/memory/weak_ptr.h>

#include <binderwrapper/binder_wrapper.h>
#include <utils/StrongPointer.h>
#include <binder/IBinder.h>

#include "android/webservd/IProtocolHandler.h"
#include "android/webservd/IServer.h"
#include "libwebserv/server.h"

namespace libwebserv {

class ProtocolHandler;
class BinderProtocolHandler;
class BinderPHGroup;

class LIBWEBSERV_PRIVATE BinderServer : public Server {
 public:
  BinderServer(brillo::MessageLoop* message_loop,
               const base::Closure& on_server_online,
               const base::Closure& on_server_offline,
               android::BinderWrapper* binder_wrapper);
  ~BinderServer() override = default;

  ProtocolHandler* GetDefaultHttpHandler() override;
  ProtocolHandler* GetDefaultHttpsHandler() override;
  ProtocolHandler* GetProtocolHandler(const std::string& name) override;

  bool IsConnected() const override;

  void OnProtocolHandlerConnected(
      const base::Callback<void(ProtocolHandler*)>& callback) override;
  void OnProtocolHandlerDisconnected(
      const base::Callback<void(ProtocolHandler*)>& callback) override;

  base::TimeDelta GetDefaultRequestTimeout() const override;

 private:
  using RemoteServer = android::webservd::IServer;
  using RemoteProtocolHandler = android::webservd::IProtocolHandler;

  void TryConnecting();
  void ClearLocalState();
  bool BuildLocalState(const android::sp<android::IBinder>& server);

  // Used to poll for webservd availability and notify the user of changes
  brillo::MessageLoop* message_loop_;
  base::Closure on_server_online_;
  base::Closure on_server_offline_;
  base::Callback<void(ProtocolHandler*)> on_protocol_handler_connected_;
  base::Callback<void(ProtocolHandler*)> on_protocol_handler_disconnected_;
  android::BinderWrapper* binder_wrapper_;

  android::sp<RemoteServer> remote_server_;
  std::map<std::string, std::unique_ptr<BinderProtocolHandler>>
      local_protocol_handlers_;

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

}  // namespace libwebserv

#endif  // WEBSERVER_LIBWEBSERV_BINDER_SERVER_H_
