class Admins::LaboratoriesController < Admins::BaseController
  def index
    default_sort('id', 'desc')

    laboratories = Admins::LaboratoryQuery.call(params)
    @laboratories = paginate laboratories.preload(:school, :laboratory_users)
  end

  def create
    Admins::CreateLaboratoryService.call(create_params)
    render_ok
  rescue Admins::CreateLaboratoryService::Error => ex
    render_error(ex.message)
  end

  def destroy
    current_laboratory.destroy!

    render_delete_success
  end

  def shixuns_for_select
    except_shixun_ids = current_laboratory.laboratory_shixuns.pluck(:shixun_id)

    shixuns = Shixun.where.not(id: except_shixun_ids)

    keyword = params[:keyword].to_s.strip
    if keyword.present?
      like_sql = 'shixuns.name LIKE :keyword OR CONCAT(users.lastname, users.firstname) LIKE :keyword '\
                 'OR mirror_repositories.name LIKE :keyword'
      shixuns = shixuns.joins(:user, :mirror_repositories).where(like_sql, keyword: "%#{keyword}%")
    end

    @count = shixuns.count
    @shixuns = paginate(shixuns.includes(:user))
  end

  def subjects_for_select
    except_subject_ids = current_laboratory.laboratory_subjects.pluck(:subject_id)

    subjects = Subject.where.not(id: except_subject_ids)

    keyword = params[:keyword].to_s.strip
    if keyword.present?
      like_sql = 'subjects.name LIKE :keyword OR CONCAT(users.lastname, users.firstname) LIKE :keyword'
      subjects = subjects.joins(:user).where(like_sql, keyword: "%#{keyword}%")
    end

    @count = subjects.count
    @subjects = paginate(subjects.includes(:user))
  end

  def synchronize_user
    school = current_laboratory.school
    users = User.joins(:user_extension).where(user_extensions: {school_id: school.id})
    users.update_all(laboratory_id: current_laboratory.id)
  end

  def update_sync_course
    current_laboratory.update!(sync_course: !current_laboratory.sync_course)
    @laboratory = current_laboratory
  end

  def update
    @laboratory = current_laboratory
    unless @laboratory.update_attributes!(setting_params)
      redirect_to admins_laboratories_path
      flash[:danger] = "更新失败"
    end
  end

  private

  def current_laboratory
    @_current_laboratory ||= Laboratory.find(params[:id])
  end

  def create_params
    params.permit(:school_id)
  end

  def setting_params
    params.permit(:sync_course, :sync_subject, :sync_shixun)
  end
end