// Copyright 2019 The Fuchsia 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 SRC_SYS_ACTIVITY_ACTIVITY_APP_H_
#define SRC_SYS_ACTIVITY_ACTIVITY_APP_H_

#include <fuchsia/ui/activity/control/cpp/fidl.h>
#include <fuchsia/ui/activity/cpp/fidl.h>
#include <lib/zx/channel.h>
#include <zircon/assert.h>

#include <map>
#include <memory>

#include "src/lib/fxl/macros.h"
#include "src/sys/activity/activity_control_connection.h"
#include "src/sys/activity/activity_provider_connection.h"
#include "src/sys/activity/activity_tracker_connection.h"

namespace activity {

class ActivityApp {
 public:
  ActivityApp(std::unique_ptr<StateMachineDriver> state_machine_driver,
              async_dispatcher_t* dispatcher)
      : state_machine_driver_(std::move(state_machine_driver)), dispatcher_(dispatcher) {}

  // Registers a new Control client and stores a binding created from |request|.
  // The binding is automatically cleaned up when the client terminates, or when a channel
  // error occurs.
  void AddControlBinding(fidl::InterfaceRequest<fuchsia::ui::activity::control::Control> request);
  // Registers a new Tracker client and stores a binding created from |request|.
  // The binding is automatically cleaned up when the client terminates, or when a channel
  // error occurs.
  void AddTrackerBinding(fidl::InterfaceRequest<fuchsia::ui::activity::Tracker> request);
  // Registers a new Provider client and stores a binding created from |request|.
  // The binding is automatically cleaned up when the client terminates, or when a channel
  // error occurs.
  void AddProviderBinding(fidl::InterfaceRequest<fuchsia::ui::activity::Provider> request);

  // Returns a list of weak references to the bindings managed by this instance.
  // Exposed for testing.
  std::vector<const ActivityControlConnection*> control_bindings() const;
  std::vector<const ActivityTrackerConnection*> tracker_bindings() const;
  std::vector<const ActivityProviderConnection*> provider_bindings() const;

 private:
  std::unique_ptr<StateMachineDriver> state_machine_driver_;
  async_dispatcher_t* dispatcher_;

  std::map<zx::unowned_channel, std::unique_ptr<ActivityControlConnection>> control_bindings_;
  std::map<zx::unowned_channel, std::unique_ptr<ActivityTrackerConnection>> tracker_bindings_;
  std::map<zx::unowned_channel, std::unique_ptr<ActivityProviderConnection>> provider_bindings_;

  FXL_DISALLOW_COPY_ASSIGN_AND_MOVE(ActivityApp);
};

}  // namespace activity

#endif  // SRC_SYS_ACTIVITY_ACTIVITY_APP_H_
