class Subjects::DataStatisticService < ApplicationService
  attr_reader :subject
  def initialize(subject)
    @subject = subject
    @shixuns = subject.shixuns
    @shixun_ids = @shixuns.pluck(:id)
  end

  # 学习总人数：
  # 文案解释：学习该课程的全部人数（学习总人数=课堂学习人数+自主学习人数）
  # 开发备注：只要点击该课程的任何一个实训（生成了tpi），都算一个学习人数；（去重，一个人数计算1次）
  def study_count
    @shixuns.joins(:myshixuns).pluck("myshixuns.user_id").uniq.size
  end

  # 课堂学习人数：
  # 文案解释：通过课堂学习该课程的人数
  # 开发备注：只要通过课堂进入，并点击了实训（生成了tpi），则算一个可以学习人数；（去重，一个人数计算1次）
  def course_study_count
    # 实训作业
    sw_user_ids = StudentWork.where.not(myshixun_id: 0).joins(homework_common: :homework_commons_shixun)
                      .where(homework_commons_shixuns: {shixun_id: @shixun_ids}).pluck("student_works.user_id")
    # 试卷的实训题
    esa_user_ids = ExerciseShixunAnswer.joins(exercise_shixun_challenge: :shixun)
                       .where(shixuns: {id: @shixun_ids}).pluck("exercise_shixun_answers.user_id")
    (sw_user_ids + esa_user_ids).uniq.size
  end

  # 自主学习人数：
  # 文案解释：通过自主学习该课程的人数
  # 开发备注：非课程进入，生成了实训的tpi（去重。一个人数计算1次
  def initiative_study
    study_count - course_study_count
  end

  # 通关总人数：
  # 文案解释：
  # 通关该课程所有实训的人数（去重。一个人数计算1次）
  def passed_count
    @shixuns.includes(:myshixuns).where(myshixuns: {status: 1}).pluck("myshixuns.user_id").uniq.size
  end

  # 使用课堂数：
  # 文案解释：使用该课程的课堂数量
  # 开发备注：课堂加入该课程的实训到自己课堂，则算一个使用课堂数。（去重，一个课堂计算1次）
  def course_used_count
    hc_course_ids =
        HomeworkCommon.joins(:homework_commons_shixun)
            .where(homework_type: %i[practice])
            .where(homework_commons_shixuns: {shixun_id: @shixun_ids}).pluck("homework_commons.course_id").uniq
    ex_course_ids =
        Exercise.joins(:exercise_questions)
            .where(exercise_questions: {question_type: 5, shixun_id: @shixun_ids}).pluck("exercises.course_id").uniq

    (hc_course_ids + ex_course_ids).uniq.size
  end

  # 使用单位数：
  # 文案解释：使用该课程的单位数量（包括自主学习者所在单位）
  # 开发备注：凡事该单位有使用该课程的实训（自主学习+课堂使用）都算；（去重，一个单位计算一次）
  def school_used_count
    school_ids.size
  end


  private
  def school_ids
    @shixuns.joins(myshixuns: :user_extension).pluck("user_extensions.school_id").uniq
  end


end
