#coding=utf-8

namespace :homework_evaluation do
  desc "start and end evaluation"
  def get_assigned_homeworks(student_works, n, index)
    student_works += student_works
    student_works[index + 1 .. index + n]
  end
  #自动开启匿评的任务
  task :start_evaluation => :environment do
    homework_detail_manuals = HomeworkDetailManual.where("evaluation_start = '#{Date.today}'")
    homework_detail_manuals.each do |homework_detail_manual|
      homework_common = homework_detail_manual.homework_common
      if homework_common.anonymous_comment == 0 && homework_detail_manual.comment_status == 1  #新建状态才可开启匿评
        student_works = homework_common.student_works
        if student_works && student_works.size >= 2
          if homework_common.homework_type == 3
            student_work_projects = homework_common.student_work_projects.where("student_work_id is not null")
            student_work_projects.each_with_index do |pro_work, pro_index|
              n = homework_detail_manual.evaluation_num
              n = n < student_works.size ? n : student_works.size - 1
              work_index = -1
              student_works.each_with_index do |stu_work, stu_index|
                if stu_work.id.to_i == pro_work.student_work_id.to_i
                  work_index = stu_index
                end
              end
              assigned_homeworks = get_assigned_homeworks(student_works, n, work_index)
              assigned_homeworks.each do |h|
                student_works_evaluation_distributions = StudentWorksEvaluationDistribution.new(user_id: pro_work.user_id, student_work_id: h.id)
                student_works_evaluation_distributions.save
              end
            end
          else
            student_works.each_with_index do |work, index|
              user = work.user
              n = homework_detail_manual.evaluation_num
              n = n < student_works.size ? n : student_works.size - 1
              assigned_homeworks = get_assigned_homeworks(student_works, n, index)
              assigned_homeworks.each do |h|
                student_works_evaluation_distributions = StudentWorksEvaluationDistribution.new(user_id: user.id, student_work_id: h.id)
                student_works_evaluation_distributions.save
              end
            end
          end
          homework_detail_manual.update_column('comment_status', 2)
          # 匿评开启消息邮件通知,# 所有人
          #send_message_anonymous_comment(homework_common, 2)
          course = homework_common.course
          course.members.each do |m|
            homework_common.course_messages << CourseMessage.new(:user_id => m.user_id, :course_id => course.id, :viewed => false, :status => 2)
          end
          # 邮件通知
          Mailer.send_mail_anonymous_comment_open(homework_common).deliver
        else
          #作业数小于2,启动失败, 只给老师发
          # status==4 发送失败
          # 匿评开启消息邮件通知,# 所有人
          course = homework_common.course
          course.members.each do |m|
            if m.user.allowed_to?(:as_teacher,course)
              homework_common.course_messages << CourseMessage.new(:user_id => m.user_id, :course_id => course.id, :viewed => false, :status => 4)
            end
          end
          # 邮件通知
          Mailer.send_mail_anonymous_comment_fail(homework_common).deliver
        end
      end
    end
  end

  #自动关闭匿评的任务
  task :end_evaluation => :environment do
    homework_detail_manuals = HomeworkDetailManual.where("evaluation_end = '#{Date.today}'")
    homework_detail_manuals.each do |homework_detail_manual|
      homework_common = homework_detail_manual.homework_common
      if homework_common.anonymous_comment == 0 && homework_detail_manual.comment_status == 2 #开启匿评状态才可关闭匿评
        #计算缺评扣分
        work_ids = "(" + homework_common.student_works.map(&:id).join(",") + ")"
        homework_common.student_works.each do |student_work|
          absence_penalty_count = student_work.user.student_works_evaluation_distributions.where("student_work_id IN #{work_ids}").count - student_work.user.student_works_scores.where("student_work_id IN #{work_ids}").count
          student_work.absence_penalty = absence_penalty_count > 0 ? absence_penalty_count * homework_detail_manual.absence_penalty : 0
          student_work.save
        end
        homework_detail_manual.update_column('comment_status', 3)
        # 匿评关闭消息通知 给所有人发
        course = homework_common.course
        course.members.each do |m|
          homework_common.course_messages << CourseMessage.new(:user_id => m.user_id, :course_id => course.id, :viewed => false, :status => 3)
        end
        # 邮件通知
        Mailer.send_mail_anonymous_comment_close(homework_common).deliver
      end
    end
  end
end