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