module Searchable::Subject
  extend ActiveSupport::Concern

  included do
    searchkick language: 'chinese', callbacks: :async

    scope :search_import, -> { includes(:users, :stages, user: { user_extension: :school }) }
  end

  def searchable_title
    name
  end

  def should_index?
    !hidden? && status == 2 # published
  end

  def search_data
    {
      name: name,
      status: status,
      hidden: hidden,
      description: Util.extract_content(description)[0..Searchable::MAXIMUM_LENGTH],
      shixuns_count: shixuns_count,
      myshixuns_count: member_count,
    }.merge!(searchable_user_data)
      .merge!(searchable_stages_data)
  end

  def searchable_user_data
    {
      author_name: user.real_name,
      author_school_name: user.school_name,
      member_user_names: users.map(&:real_name).join(' ')
    }
  end

  def searchable_stages_data
    subject_stages = stages.map { |stage| "#{stage.name} #{Util.extract_content(stage.description)}"[0..Searchable::MAXIMUM_LENGTH] }

    { subject_stages: subject_stages.join('<br/>') }
  end

  def to_searchable_json
    {
      id: id,
      author_name: user.real_name,
      author_school_name: user.school_name,
      visits_count: visits,
      stage_count: stages_count,
      stage_shixuns_count: stage_shixuns_count,
      shixuns_count: shixuns_count,
      myshixuns_count: member_count
    }
  end

  module ClassMethods
    def searchable_includes
      { user: { user_extension: :school } }
    end
  end
end