// Copyright 2017 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 MIDIS_CLIENT_H_
#define MIDIS_CLIENT_H_

#include <memory>
#include <vector>

#include <base/files/scoped_file.h>
#include <base/memory/weak_ptr.h>
#include <brillo/message_loops/message_loop.h>
#include <mojo/public/cpp/bindings/pending_receiver.h>
#include <mojo/public/cpp/bindings/pending_remote.h>
#include <mojo/public/cpp/bindings/receiver.h>
#include <mojo/public/cpp/bindings/remote.h>

#include "midis/device.h"
#include "midis/device_tracker.h"
#include "mojo/midis.mojom.h"

namespace midis {

class Client : public DeviceTracker::Observer, public arc::mojom::MidisServer {
 public:
  using ClientDeletionCallback = base::OnceCallback<void(uint32_t)>;
  Client(DeviceTracker* device_tracker,
         uint32_t client_id,
         ClientDeletionCallback del_cb,
         mojo::PendingReceiver<arc::mojom::MidisServer> receiver,
         mojo::PendingRemote<arc::mojom::MidisClient> client);
  Client(const Client&) = delete;
  Client& operator=(const Client&) = delete;

  ~Client() override;

  void NotifyDeviceAddedOrRemoved(const Device& dev, bool added);

 private:
  // This function is a DeviceTracker::Observer override.
  void OnDeviceAddedOrRemoved(const Device& dev, bool added) override;

  void TriggerClientDeletion();

  // arc::mojom:MidisServer overrides
  void ListDevices(ListDevicesCallback callback) override;
  void RequestPortDeprecated(arc::mojom::MidisRequestPtr request,
                             RequestPortDeprecatedCallback callback) override;
  void RequestPort(arc::mojom::MidisRequestPtr request,
                   RequestPortCallback callback) override;
  void CloseDevice(arc::mojom::MidisRequestPtr request) override;

  // Function which returns a scoped handle when a port is requested,
  // and an empty handle on error. This can be used by both
  // RequestPort and RequestPortDeprecated.
  mojo::ScopedHandle CreateRequestPortFD(uint32_t card,
                                         uint32_t device,
                                         uint32_t subdevice);

  // The DeviceTracker can be guaranteed to exist for the lifetime of the
  // service. As such, it is safe to maintain this pointer as a means to make
  // updates and derive information regarding devices.
  DeviceTracker* device_tracker_;
  uint32_t client_id_;
  ClientDeletionCallback del_cb_;

  // Handle to the Mojo client interface. This is used to send necessary
  // information to the clients when required.
  mojo::Remote<arc::mojom::MidisClient> client_;
  mojo::Receiver<arc::mojom::MidisServer> receiver_;

  base::WeakPtrFactory<Client> weak_factory_;
};

}  // namespace midis

#endif  // MIDIS_CLIENT_H_
