// Copyright 2014 The Chromium 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 COMPONENTS_STORAGE_MONITOR_STORAGE_INFO_H_
#define COMPONENTS_STORAGE_MONITOR_STORAGE_INFO_H_

#include "base/files/file_path.h"
#include "base/strings/string16.h"

namespace storage_monitor {

class StorageInfo {
 public:
  enum Type {
    // A removable mass storage device with a DCIM directory.
    REMOVABLE_MASS_STORAGE_WITH_DCIM,
    // A removable mass storage device without a DCIM directory.
    REMOVABLE_MASS_STORAGE_NO_DCIM,
    // A fixed mass storage device.
    FIXED_MASS_STORAGE,
    // A MTP or PTP device.
    MTP_OR_PTP,
    // A Mac ImageCapture device.
    MAC_IMAGE_CAPTURE,
    // An iTunes library.
    ITUNES,
    // A Picasa database.
    PICASA,
    // An iPhoto library.
    IPHOTO,
  };

  StorageInfo();
  // Note: |device_id_in| should be constructed with MakeDeviceId.
  StorageInfo(const std::string& device_id_in,
              const base::FilePath::StringType& device_location,
              const base::string16& label,
              const base::string16& vendor,
              const base::string16& model,
              uint64 size_in_bytes);
  ~StorageInfo();

  // Returns a device id given properties of the device. A prefix dependent on
  // |type| is added so |unique_id| need only be unique within the given type.
  // Returns an empty string if an invalid type is passed in.
  static std::string MakeDeviceId(Type type, const std::string& unique_id);

  // Extracts the device |type| and |unique_id| from |device_id|. Returns false
  // if the device_id isn't properly formatted.
  static bool CrackDeviceId(const std::string& device_id,
                            Type* type, std::string* unique_id);

  // Looks inside |device_id| to determine if it is a media device
  // (type is REMOVABLE_MASS_STORAGE_WITH_DCIM or MTP_OR_PTP).
  static bool IsMediaDevice(const std::string& device_id);

  // Looks inside |device_id| to determine if it is a media device
  // (type isn't FIXED_MASS_STORAGE).
  static bool IsRemovableDevice(const std::string& device_id);

  // Looks inside |device_id| to determine if it is a mass storage device
  // (type isn't MTP_OR_PTP).
  static bool IsMassStorageDevice(const std::string& device_id);

  static bool IsITunesDevice(const std::string& device_id);

  static bool IsPicasaDevice(const std::string& device_id);

  static bool IsIPhotoDevice(const std::string& device_id);

  static bool IsMTPDevice(const std::string& device_id);

  // Get the display name for the removable device represented by this
  // StorageInfo. Include the size for removable devices if |with_size| is true.
  base::string16 GetDisplayName(bool with_size) const;

  // Same as GetDisplayName(), but may be overridden by |override_display_name|.
  base::string16 GetDisplayNameWithOverride(
      const base::string16& override_display_name, bool with_size) const;

  const std::string& device_id() const { return device_id_; }
  const base::FilePath::StringType& location() const { return location_; }
  const base::string16& storage_label() const { return storage_label_; }
  const base::string16& vendor_name() const { return vendor_name_; }
  const base::string16& model_name() const { return model_name_; }
  uint64 total_size_in_bytes() const { return total_size_in_bytes_; }

  void set_device_id(const std::string& device_id) { device_id_ = device_id; }
  void set_location(const base::FilePath::StringType& location) {
    location_ = location;
  }

 private:
  // Unique device id - persists between device attachments.
  // This is the string that should be used as the label for a particular
  // storage device when interacting with the API. Clients should treat
  // this as an opaque string.
  std::string device_id_;

  // Current attached removable storage device location.
  base::FilePath::StringType location_;

  // Label given to this storage device by the user.
  // May be empty if not found or the device is unlabeled.
  base::string16 storage_label_;

  // Vendor name for the removable device. (Human readable)
  // May be empty if not collected.
  base::string16 vendor_name_;

  // Model name for the removable device. (Human readable)
  // May be empty if not collected.
  base::string16 model_name_;

  // Size of the removable device in bytes.
  // Zero if not collected or unknown.
  uint64 total_size_in_bytes_;
};

}  // namespace storage_monitor

#endif  // COMPONENTS_STORAGE_MONITOR_STORAGE_INFO_H_
