module Watchable
  extend ActiveSupport::Concern

  included do
    has_many :watchers, as: :watchable, dependent: :destroy
    has_many :watcher_users, through: :watchers, source: :user, validate: false

    scope :watched_by, -> (user_id) { includes(:watchers).where(watchers: { user_id: user_id }) }
    scope :following, -> (user_id) { watched_by(user_id) }
  end

  def watched?(watchable)
    watchable.watchers.exists?(user: self)
  end

  def watch!(watchable)
    watchable.watchers.create!(user: self, created_at: Time.current)
  end

  def unwatch!(watchable)
    obj = watchable.watchers.find_by(user: self)
    obj.destroy! if obj.present?
  end

  # 我正在关注的、我追随的
  def following
    User.following(self.id)
  end

  def following_count
    following.size
  end

  # 关注我的、我的粉丝、我的追随者
  def followers
    watcher_users
  end

  def followers_count
    followers.size
  end

  module ClassMethods
  end
end
