// Copyright 2018 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 SHILL_DEVICE_ID_H_
#define SHILL_DEVICE_ID_H_

#include <stdint.h>

#include <memory>
#include <ostream>
#include <string>

#include <base/files/file_path.h>
#include <base/optional.h>

namespace shill {

// DeviceId is meant to encapsulate a device type so we can implement a quirks
// layer on top of network controller devices if we need to.
class DeviceId {
 public:
  // Add more bus types here as they need to be supported.
  enum class BusType {
    kPci,
    kUsb,
  };

  // Location of the device (Currently only supported for PCI devices).
  enum class LocationType {
    kInternal,
    kExternal,
  };

  // Takes a device |syspath| as would be given by e.g. udev and tries to read
  // the bus type and device identifiers.
  static std::unique_ptr<DeviceId> CreateFromSysfs(
      const base::FilePath& syspath);

  // DeviceId matching all devices by a particular bus type.
  explicit constexpr DeviceId(BusType bus_type) : bus_type_(bus_type) {}
  // DeviceId matching all devices on a particular bus and location type.
  // Location type is currently only supported for PCI devices.
  explicit constexpr DeviceId(BusType bus_type, LocationType location_type)
      : bus_type_(bus_type), location_type_(location_type) {}
  // DeviceId matching all devices by a particular bus type and vendor id.
  constexpr DeviceId(BusType bus_type, uint16_t vendor_id)
      : bus_type_(bus_type), vendor_id_(vendor_id) {}
  // DeviceId matching device by a particular bus type, vendor id and
  // product id.
  constexpr DeviceId(BusType bus_type, uint16_t vendor_id, uint16_t product_id)
      : bus_type_(bus_type), vendor_id_(vendor_id), product_id_(product_id) {}

  // Returns true if |this| matches |pattern|.
  //
  // If |pattern| vendor id is *, then they don't have to match VID and PID
  // values.
  //
  // If |pattern| product id is *, then they don't have to match PID values.
  bool Match(const DeviceId& pattern) const;

  // This string should be unique for each value of DeviceId, so it can
  // be used to index maps, etc.
  // Format: [bus type]:[vendor id, or "*" if unspecified]:
  //         [product id, or "*" if unspecified]
  std::string AsString() const;

 private:
  BusType bus_type_;
  base::Optional<LocationType> location_type_;
  base::Optional<uint16_t> vendor_id_;
  base::Optional<uint16_t> product_id_;
};

}  // namespace shill

std::ostream& operator<<(std::ostream& stream,
                         const shill::DeviceId& device_id);

#endif  // SHILL_DEVICE_ID_H_
