# encoding: utf-8
module ExerciseHelper

  def un_commit_num exercise
    course = exercise.course
    member = course.members.where(:user_id => User.current.id).first
    exercise_users = exercise.exercise_users
    student_count = course.student.count
    if member.present? && member.teacher_course_groups.count > 0
      group_students = course.members.where(:course_group_id => member.teacher_course_groups.pluck(:course_group_id)).map(&:user_id)
      student_count = group_students.size
      exercise_users = exercise_users.where(:user_id => group_students)
    end
    student_count - exercise_users.where(:commit_status => 1, :user_id => course.student.map(&:student_id)).count
  end

  def has_commit_num exercise
    course = exercise.course
    member = course.members.where(:user_id => User.current.id).first
    exercise_users = exercise.exercise_users
    if member.present? && member.teacher_course_groups.count > 0
      group_students = course.members.where(:course_group_id => member.teacher_course_groups.pluck(:course_group_id)).map(&:user_id)
      exercise_users = exercise_users.where(:user_id => group_students)
    end
    exercise_users.where(:commit_status => 1, :user_id => course.student.map(&:student_id)).count
  end

  def un_comment_num exercise
    course = exercise.course
    member = course.members.where(:user_id => User.current.id).first
    exercise_users = exercise.exercise_users
    if member.present? && member.teacher_course_groups.count > 0
      group_students = course.members.where(:course_group_id => member.teacher_course_groups.pluck(:course_group_id)).map(&:user_id)
      exercise_users = exercise_users.where(:user_id => group_students)
    end
    exercise_users.where(:commit_status => 1, :subjective_score => -1).count
  end

  def has_comment_num exercise
    course = exercise.course
    member = course.members.where(:user_id => User.current.id).first
    exercise_users = exercise.exercise_users
    if member.present? && member.teacher_course_groups.count > 0
      group_students = course.members.where(:course_group_id => member.teacher_course_groups.pluck(:course_group_id)).map(&:user_id)
      exercise_users = exercise_users.where(:user_id => group_students)
    end
    exercise_users.where("commit_status = 1 and subjective_score != -1").count
  end

  def answer_is_correct eq, user
    is_correct = false
    case eq.question_type
      when 1
        answer = get_user_answer(eq, user)
        standard_answer = get_user_standard_answer(eq, user)
        is_correct = !answer.empty? && !standard_answer.empty? && answer.first.exercise_choice.choice_position == standard_answer.first.exercise_choice_id
      when 2
        standard_answer = get_user_standard_answer(eq, user)
        is_correct = !standard_answer.empty? && get_mulscore(eq, user).to_i == standard_answer.first.exercise_choice_id
      when 3
        answer = get_user_answer(eq, user)
        standard_answer = get_user_standard_answer(eq, user)
        is_correct = !answer.empty? && !standard_answer.empty? && standard_answer.collect{|answer| answer.strip}.include?(answer.first.answer_text.strip.downcase)
      when 5
        is_correct = eq.exercise_shixun_answers.where(:status => 1, :user_id => user.id).count == eq.shixun.challenges.count
    end
    is_correct
  end

  def question_correct_rate eq, user_ids
    count = 0
    rate = 0
    user_ids_str = user_ids.length == 0 ? "(-1)" : "("+user_ids.join(",")+")"
    user_ids.each do |user_id|
      user = User.where(:id => user_id).first
      case eq.question_type
        when 1, 2, 3
          if user && answer_is_correct(eq, user)
            count += 1
          end
          rate = user_ids.length == 0 ? 0 : count.to_f / user_ids.length
        when 4
          rate = user_ids.length * eq.question_score > 0 ? eq.exercise_answers.where("user_id in #{user_ids_str} and score <> -1").collect(&:score).sum.to_f / (user_ids.length * eq.question_score) : 0
        when 5
          rate = user_ids.length * eq.question_score > 0 ? eq.exercise_shixun_answers.where("user_id in #{user_ids_str}").collect(&:score).sum.to_f / (user_ids.length * eq.question_score) : 0
      end
    end
    rate = format("%.1f", rate*100)
  end

  #多选的时候查询去重
  def total_answer id, user_ids
    user_ids = user_ids.blank? ? "(-1)" : "(" + user_ids.join(",") + ")"
    total = ExerciseAnswer.find_by_sql("SELECT distinct(user_id) FROM `exercise_answers` where exercise_question_id = #{id} and user_id in #{user_ids}").count
  end

  def shixun_question_score eq, user
    score = 0
    if eq.question_type == 5
      eq.exercise_shixun_answers.where(:user_id => user.id).each do |answer|
        score += answer.score
      end
    end
    score
  end

  # 单选
  def sigle_selection_standard_answer(params)
    size = params.ord - 96
    if size > 0 # 小写字母答案
      answer = params.ord - 96
    else
      answer = params.ord - 64
    end
  end

  # 多选
  def multiselect_standard_answer(params)
    size = params.ord - 96
    answer = []
    if size > 0 # 小写字母答案
      for i in 0..(params.length-1)
        answer << (params[i].ord - 96).to_s
      end
    else
      for i in 0..(params.length-1)
        answer << (params[i].ord - 64)
      end
    end
    answer = answer.sort
    answer.join("")
  end

  #
  def fill_standart_answer(params, standart_answer)
    params.each do |param|
      standart_answer.answer_text = param.value
      standart_answer.save
    end
  end

  # 获取多选的得分
  def get_mulscore(question, user)
    ecs = ExerciseAnswer.where("user_id =? and exercise_question_id =?", user.id, question.id)
    arr = []
    ecs.each do |ec|
      arr << ec.exercise_choice.choice_position
    end
    #arr = arr.sort
    str = arr.sort.join("")
    return str
  end

  # 判断用户是否已经提交了问卷
  # status 为0的时候是用户点击试卷。为1表示用户已经提交
  def has_commit_exercise?(exercise_id, user_id)
    pu = ExerciseUser.where("exercise_id=? and user_id=? and status=?",exercise_id, user_id, true)
    if pu.empty?
      false
    else
      true
    end
  end

  def can_edit_exercise exercise, exercise_user
    exercise_end = exercise.end_time.nil? ? false : exercise.end_time > Time.now
    if exercise.time == -1
      can_edit_excercise = exercise_end && exercise_user.commit_status == 0
    else
      left_time = (Time.now.to_i - exercise_user.start_at.to_i) < exercise.time.to_i * 60
      can_edit_excercise = !exercise_user.status && left_time && exercise_end
    end
    can_edit_excercise
  end

  # 判断学生是否点击过问卷,点击则为他保存一个记录,记录start_at
  def has_click_exercise?(exercise_id, user_id)
    pu = ExerciseUser.where("exercise_id=? and user_id=? and status=?",exercise_id, user_id, false)
    if pu.empty?
      false
    else
      true
    end
  end

  def convert_to_char(str)
    result = ""
    length = str.length
    unless str.nil?
      if length === 1
        result += (str.to_i + 64).chr
        return result
      elsif length > 1
        for i in 0...length
          result += (str[i].to_i + 64).chr
        end
        return result
      end
    end
    return result
  end

  def convert_to_chi_num num
    result = ""
    case num.to_i
      when 1
        result = '一'
      when 2
        result = '二'
      when 3
        result = '三'
      when 4
        result = '四'
      when 5
        result = '五'
      when 6
        result = '六'
      when 7
        result = '七'
      when 8
        result = '八'
      when 9
        result = '九'
    end
    return result
  end

  def get_current_score exercise
    total_score = 0
    mc_score = 0
    mcq_score = 0
    single_score = 0
    multi_score = 0
    shixun_score = 0
    unless exercise.nil?
      exercise.exercise_questions.each do |exercise_question|
        unless exercise_question.question_score.nil?
          total_score += exercise_question.question_score
          case exercise_question.question_type
            when 1
              mc_score += exercise_question.question_score
            when 2
              mcq_score += exercise_question.question_score
            when 3
              single_score += exercise_question.question_score
            when 4
              multi_score += exercise_question.question_score
            when 5
              shixun_score += exercise_question.question_score
          end
        end
      end
      return total_score, mc_score, mcq_score, single_score, multi_score, shixun_score
    end
    return total_score, mc_score, mcq_score, single_score, multi_score, shixun_score
  end

  def answer_be_selected?(answer,user)
    # pv = answer.exercise_answers.where("#{ExerciseAnswer.table_name}.user_id = #{user.id} ")
    pv = answer.exercise_answers.select{|e| e.user_id == user.id}
    if !pv.nil? && pv.size > 0
      true
    else
      false
    end
  end

  #获取未完成的题目
  def get_uncomplete_question exercise,user
    # all_questions = exercise.exercise_questions.includes(:exercise_answers).where("question_type != 5")
    uncomplete_question = []
    exercise.exercise_questions.includes(:exercise_answers).where("question_type != 5").each do |question|
      # answers = get_user_answer(question, user)
      answers = question.exercise_answers.select{|e| e.user_id == user.id}
      if answers.empty?
        uncomplete_question << question
      end
    end
    uncomplete_question
  end

  # 获取未通关的实训
  def get_uncomplete_shixun exercise,user
    all_questions = exercise.exercise_questions.where("question_type = 5")
    uncomplete_shixun = []
    all_questions.each do |question|
      myshixun = Myshixun.where(:shixun_id => question.shixun_id, :user_id => user.id).first
      unless myshixun && myshixun.is_complete?
        uncomplete_shixun << question
      end
    end
    uncomplete_shixun
  end

  # 题目已答或未答
  def question_answer_or_not question, user
    if question.question_type == 5
      # is_answer = question.exercise_shixun_answers.where(:user_id => user.id, :status => 1).count > 0
      is_answer = question.exercise_shixun_answers.select{|e| e.user_id == user.id && e.status == 1}.count > 0
    else
      # is_answer = user.exercise_answer.where(:exercise_question_id => question.id).count > 0
      is_answer = question.exercise_answers.select{|e| e.user_id == user.id}.count > 0
    end
    is_answer
  end

  def question_commit_status question, user
    status = ""
    case question.question_type
      when 3, 4
        get_anwser_vote_text(question.id,user.id) == "" ? status = "未答"  : status = ""
      when 1, 2
        get_user_answer(question,user).empty? ? status = "未答"  : status = ""
      when 5
        question.exercise_shixun_answers.where(:user_id => user.id).empty? ? status = "未答"  : status = ""
    end
    status
  end

  # 获取文本题答案
  def get_anwser_vote_text(question_id,user_id)
    pv = ExerciseAnswer.find_by_exercise_question_id_and_user_id(question_id,user_id)
    if pv.nil?
      ''
    else
      pv.answer_text
    end
  end

  def new_get_anwser_vote_text question, user
    pv = question.exercise_answers.select{|exercise_answer| exercise_answer.user_id == user.id}
    if pv.blank?
      ''
    else
      pv.first.try(:answer_text)
    end
  end

  # 获取当前学生回答问题的答案
  def get_user_answer(question,user)
    user_answer = question.exercise_answers.where("#{ExerciseAnswer.table_name}.user_id = #{user.id}")
    # user_answer = question.exercise_answers.select{|e| e.user_id == user.id}
    user_answer
  end

  # 获取问题的标准答案
  def get_user_standard_answer(question,user)
    if question.question_type == 3
      standard_answer =[]
      question.exercise_standard_answers.each do |answer|
        standard_answer << answer.answer_text.downcase
      end
    else
      standard_answer = question.exercise_standard_answers
    end
    standard_answer
  end

  # 问题随机的下拉列表
  def question_random_select
    type = []
    option1 = []
    option1 << "题目不随机打乱"
    option1 << 0
    type << option1
    option2 = []
    option2 << "题目随机打乱"
    option2 << 1
    type << option2
  end

  # 选项随机的下拉列表
  def choice_random_select
    type = []
    option1 = []
    option1 << "选项不随机打乱"
    option1 << 0
    type << option1
    option2 = []
    option2 << "选项随机打乱"
    option2 << 1
    type << option2
  end

  #允许学生查看结果的下拉列表
  def show_result_select
    type = []
    option1 = []
    option1 << "允许学生查看测验结果"
    option1 << 1
    type << option1
    option2 = []
    option2 << "不允许学生查看测验结果"
    option2 << 0
    type << option2
  end

end