class ShixunSearchService < ApplicationService
  include ElasticsearchAble

  attr_reader :params

  def initialize(params)
    @params = params
  end

  def call
    # 全部实训/我的实训
    type = params[:type] || "all"
    # 状态:已发布/未发布
    status = params[:status] || "all"

    # 超级管理员用户显示所有未隐藏的实训、非管理员显示所有已发布的实训(对本单位公开且未隐藏未关闭)
    if type == "mine"
      @shixuns = User.current.shixuns.none_closed
    else
      if User.current.admin? || User.current.business?
        @shixuns = Shixun.none_closed.where(hidden: 0)
      else
        none_shixun_ids = ShixunSchool.where("school_id != #{User.current.school_id}").pluck(:shixun_id)

        @shixuns = Shixun.where.not(id: none_shixun_ids).none_closed.where(hidden: 0)
      end
    end

    unless status == "all"
      @shixuns = status == "published" ? @shixuns.where(status: 2) : @shixuns.where(status: [0, 1])
    end

    ## 筛选 难度
    if params[:diff].present? && params[:diff].to_i != 0
      @shixuns = @shixuns.where(trainee: params[:diff])
    end

    Shixun.search(keyword, search_options)
  end

  private

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

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