class Admins::SubjectQuery < ApplicationQuery
  include CustomSortable

  attr_reader :params

  sort_columns :created_at, default_by: :created_at, default_direction: :desc, default_table: 'subjects'

  def initialize(params)
    @params = params
  end

  def call
    subjects = Subject.all

    subjects = subjects.where(id: params[:id]) if params[:id].present?

    # 状态过滤
    status =
      case params[:status].to_s.strip
      when 'pending'   then 0
      when 'applying'  then 1
      when 'published' then 2
      end
    subjects = subjects.where(status: status) if status

    # 创建者单位
    if params[:school_id].present?
      subjects = subjects.joins(user: :user_extension).where(user_extensions: { school_id: params[:school_id] })
    end

    # 首页展示、金课
    %i[homepage_show excellent].each do |column|
      if params[column].present? && params[column].to_s == 'true'
        subjects = subjects.where(column => true)
      end
    end

    # 关键字
    keyword = params[:keyword].to_s.strip
    if keyword
      sql = 'CONCAT(lastname, firstname) LIKE :keyword OR subjects.name LIKE :keyword'
      subjects = subjects.joins(:user).where(sql, keyword: "%#{keyword}%")
    end

    custom_sort(subjects, params[:sort_by], params[:sort_direction])
  end
end