// 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_DEVICE_H_
#define MIDIS_DEVICE_H_

#include <map>

#include <memory>
#include <string>
#include <utility>
#include <vector>

#include <base/files/file_path.h>
#include <base/files/scoped_file.h>
#include <base/memory/weak_ptr.h>
#include <brillo/message_loops/message_loop.h>
#include <gtest/gtest_prod.h>

namespace midis {

class FileHandler;

class SubDeviceClientFdHolder;

// Class which holds information related to a MIDI device.
// We use the name variable (derived from the ioctl) as a basis
// to arrive at an identifier.
class Device {
 public:
  Device(const std::string& name, uint32_t card, uint32_t device,
         uint32_t num_subdevices, uint32_t flags);
  ~Device();

  static std::unique_ptr<Device> Create(const std::string& name, uint32_t card,
                                        uint32_t device,
                                        uint32_t num_subdevices,
                                        uint32_t flags);
  const std::string& GetName() const { return name_; }
  uint32_t GetCard() const { return card_; }
  uint32_t GetDeviceNum() const { return device_; }
  uint32_t GetNumSubdevices() const { return num_subdevices_; }
  uint32_t GetFlags() const { return flags_; }

  // Adds a client which wishes to read data on a particular subdevice
  // This function should return one end of a pipe file descriptor
  // This will be sent back to the client, and it can listen on that for events.
  //
  // A device can be bidirectional, and so we should also have a watch on the
  // pipe FD so that we can read MIDI events and send them to the MIDI
  // H/W.
  //
  // TODO(pmalani): How do you arbitrate MIDI data from multiple clients. The
  // best approach would be to just allow access to one client for the output.
  // Returns:
  //   A valid base::ScopedFD on success.
  //   An empty base::ScopedFD otherwise.
  base::ScopedFD AddClientToReadSubdevice(uint32_t client_id,
                                          uint32_t subdevice_id);

  // This function is called when a Client is removed from the service for
  // orderly or unorderly reasons (like disconnection). The client is removed
  // from all subdevices.
  void RemoveClientFromDevice(uint32_t client_id);

 private:
  friend class DeviceTest;
  friend class UdevHandlerTest;
  FRIEND_TEST(DeviceTest, TestHandleDeviceRead);
  FRIEND_TEST(UdevHandlerTest, CreateDevicePositive);
  // This function instantiates a FileHandler for each subdevice. If all the
  // FileHandlers can get initialized successfully, each of them is added to the
  // handlers_ map.
  bool StartMonitoring();
  // Deletes all the FileHandlers created during StartMontoring().
  void StopMonitoring();
  // Helper function to set the base directory to be used for creating and
  // looking for dev node paths. Helpful for testing (where we don't have real
  // h/w, and dev nodes have to be faked).
  static void SetBaseDirForTesting(const base::FilePath& dir) {
    Device::basedir_ = dir;
  }
  // Callback function which is invoked by the FileHandler object when data is
  // received for a particular subdevice.
  void HandleReceiveData(const char* buffer, uint32_t subdevice,
                         size_t buf_len) const;

  // Callback function which is invoked by SubDeviceClientFdHolder object when
  // data is received from client to be sent to a particular subdevice.
  void WriteClientDataToDevice(uint32_t subdevice_id, const uint8_t* buffer,
                               size_t buf_len);

  std::string name_;
  uint32_t card_;
  uint32_t device_;
  uint32_t num_subdevices_;
  uint32_t flags_;
  // This data structure maps subdevice id's to corresponding file handler
  // objects.
  std::map<uint32_t, std::unique_ptr<FileHandler>> handlers_;
  // This data-structure performs the following map:
  //
  // subdevice ---> (client_1, pipefd_1), (client_2, pipefd_2), ...., (client_n,
  // pipefd_n).
  std::map<uint32_t, std::vector<std::unique_ptr<SubDeviceClientFdHolder>>>
      client_fds_;
  static base::FilePath basedir_;
  base::WeakPtrFactory<Device> weak_factory_;

  DISALLOW_COPY_AND_ASSIGN(Device);
};

}  // namespace midis

#endif  // MIDIS_DEVICE_H_
