class LearningObject
  include ActiveModel::Model
  attr_accessor :id, :id_dspace, :rid, :name, :description,
                :thumbnail, :created_at, :last_modified,
                :type, :bitstreams, :metadata, :likes, :views,
                :downloads, :subjects, :attributes

  validates_presence_of :name, :created_at, :type, :likes, :views, :downloads
  validates_numericality_of :likes, greater_than_or_equal_to: 0
  validates_numericality_of :views, greater_than_or_equal_to: 0
  validates_numericality_of :downloads, greater_than_or_equal_to: 0

  def initialize(params={})
    super(params.merge(defaults))
  end

  def subjects
    @subjects ||= learning_object_repository.get_subjects(self)
  end

  def attributes
    @attributes ||= learning_object_repository.get_attributes(self)
  end

  def categories
    get_metadata_value_of 'dc.subject.category'
  end

  def get_metadata_value_of key
    get_metadata_values_of(key).first
  end

  def get_metadata_values_of key
    values = []
    @metadata.each do |m|
      values << m["value"] if m["key"] == key
    end
    values
  end

  def get_bitstream_retrievelink_of name
    values = @bitstreams.select { |v| v["bundleName"] == name }
    unless values.empty?
      return Dspace::Config.rest_url + values.first["retrieveLink"]
    end
  end

  def get_bitstream_filename_of name
    values = @bitstreams.select { |v| v["bundleName"] == name }
    unless values.empty?
      return values.first["name"]
    end
  end

  def get_retrievelink
    get_bitstream_retrievelink_of "ORIGINAL"
  end

  def get_filename
    get_bitstream_filename_of "ORIGINAL"
  end

  private

  def defaults
    {
        likes: 0,
        views: 0,
        downloads: 0,
        created_at: DateTime.new
    }
  end

  def learning_object_repository
    Portalmec::Application.repository.for :learning_object
  end

end