class SubjectSearchService < ApplicationService
  include ElasticsearchAble

  attr_reader :params, :laboratory

  def initialize(params, laboratory)
    @params = params
    @laboratory = laboratory
  end

  def call
    # 全部实训/我的实训
    type = params[:type] || "all"

    @subjects = laboratory.subjects

    if type == "mine"
      @subjects = @subjects.where(id: User.current.subjects).visible.unhidden
    else
      if User.current.admin? || User.current.business?
        @subjects = @subjects.unhidden
      else
        @subjects = @subjects.publiced.unhidden.or(@subjects.where(id: User.current.subjects))
      end
    end
    Subject.search(keyword, search_options)
  end

  private

  def search_options
    model_options = {
      includes: [ user: { user_extension: :school } ]
    }
    model_options.merge!(where: { id: @subjects.pluck(:id) })
    model_options.merge!(order: {sort_type => sort_str})
    model_options.merge!(default_options)
    model_options
  end

  def sort_str
    params[:order] || "desc"
  end

  def sort_type
    params[:sort] || "myshixuns_count"
  end
end