class Flag < ActiveRecord::Base
  belongs_to :user
  belongs_to :flaggable, polymorphic: true, counter_cache: true, touch: true

  scope(:by_user_and_flaggable, lambda do |user, flaggable|
    where(user_id: user.id,
          flaggable_type: flaggable.class.to_s,
          flaggable_id: flaggable.id)
  end)

  scope :for_comments, ->(comments) { where(flaggable_type: 'Comment', flaggable_id: comments) }

  def self.flag(user, flaggable)
    return false if flagged?(user, flaggable)
    create(user: user, flaggable: flaggable)
  end

  def self.unflag(user, flaggable)
    flags = by_user_and_flaggable(user, flaggable)
    return false if flags.empty?
    flags.destroy_all
  end

  def self.flagged?(user, flaggable)
    return false unless user
    !! by_user_and_flaggable(user, flaggable).try(:first)
  end

end
