class LearningObject
  include ActiveModel::Model
  include RepositoriesProxy

  attr_accessor :id, :id_dspace, :rid, :name, :author, :description,
                :published_at, :thumbnail, :created_at, :last_modified,
                :type, :grade_level, :bitstreams, :metadata, :likes, :views,
                :downloads, :subjects, :attributes, :score, :publisher

  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 collections
    collection_repository.find_by_learning_object self
  end

  def publisher
    @publisher ||= learning_object_repository.get_publisher(self)
  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

  ## social actions
  def like(user)
    learning_object_repository.like user, self
  end

  def liked?(user)
    learning_object_repository.liked? user, self
  end

  def dislike(user)
    learning_object_repository.dislike user, self
  end
  ## end social actions

  def get_metadata_value_of key
    get_metadata_values_of(key).first
  end

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

  #TODO: move for Bitstream model
  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

  #TODO: move for Bitstream model
  def get_bitstream_filename_of name
    values = @bitstreams.select { |v| v["bundleName"] == name }
    unless values.empty?
      return values.first["name"]
    end
  end

  #TODO: move for Bitstream model
  def get_retrievelink
    get_bitstream_retrievelink_of "ORIGINAL"
  end

  #TODO: move for Bitstream model
  def get_filename
    get_bitstream_filename_of "ORIGINAL"
  end

  def update_dynamic_fields
    self.likes = learning_object_repository.count_likes(self)
    self.views = learning_object_repository.count_views(self)
    self
  end

  private

  def defaults
    {
        likes: 0,
        views: 0,
        downloads: 0,
        score: 0
        # Setting this default value wont allow created_at to be set trough the constructor
        # created_at: DateTime.new
    }
  end

end