// Copyright 2016 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 SERVICES_MEDIA_FRAMEWORK_METADATA_H_
#define SERVICES_MEDIA_FRAMEWORK_METADATA_H_

#include <memory>
#include <string>

#include "base/macros.h"
#include "services/media/framework/ptr.h"

namespace mojo {
namespace media {

class Metadata;

// TODO(dalesat): Get rid of typedefs like these.
typedef UniquePtr<Metadata> MetadataPtr;

// Container for content metadata.
// TODO(dalesat): Probably needs to be extensible. Consider using map-like.
class Metadata {
 public:
  // TODO(dalesat): Rename methods like this 'Create'.
  static MetadataPtr Create(
      uint64_t duration_ns,
      const std::string& title,
      const std::string& artist,
      const std::string& album,
      const std::string& publisher,
      const std::string& genre,
      const std::string& composer);

  ~Metadata();

  uint64_t duration_ns() const { return duration_ns_; }

  const std::string& title() const { return title_; }

  const std::string& artist() const { return artist_; }

  const std::string& album() const { return album_; }

  const std::string& publisher() const { return publisher_; }

  const std::string& genre() const { return genre_; }

  const std::string& composer() const { return composer_; }

  MetadataPtr Clone() const {
    return Create(
        duration_ns_,
        title_,
        artist_,
        album_,
        publisher_,
        genre_,
        composer_);
  }

 private:
  Metadata(
      uint64_t duration_ns,
      const std::string& title,
      const std::string& artist,
      const std::string& album,
      const std::string& publisher,
      const std::string& genre,
      const std::string& composer);

  uint64_t duration_ns_;
  std::string title_;
  std::string artist_;
  std::string album_;
  std::string publisher_;
  std::string genre_;
  std::string composer_;

  DISALLOW_COPY_AND_ASSIGN(Metadata);
};

}  // namespace media
}  // namespace mojo

#endif // SERVICES_MEDIA_FRAMEWORK_METADATA_H_
