// 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/util/safe_clone.h"

namespace mojo {
namespace media {

class Metadata;

// Container for content metadata.
// TODO(dalesat): Probably needs to be extensible. Consider using map-like.
class Metadata {
 public:
  static std::unique_ptr<Metadata> 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_; }

  std::unique_ptr<Metadata> 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_
