#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
    Rails.logger.info("log--------------------------------start_evaluation start")
    puts "--------------------------------start_evaluation start"
    homework_detail_manuals = HomeworkDetailManual.includes(homework_common: :course).where("evaluation_start <= '#{Time.now}' and
                            (homework_detail_manuals.comment_status < 3)")
    homework_detail_manuals.each do |homework_detail_manual|
      homework_common = homework_detail_manual.homework_common
      if homework_common.anonymous_comment
        if homework_common.homework_group_settings.where("end_time is null or end_time > '#{Time.now}'").count == 0
          if homework_common.homework_type == "group"
            student_works = homework_common.student_works.where("work_status != 0").group(:group_id)
          else
            student_works = homework_common.student_works.has_committed
          end

          if student_works.present? && student_works.length >= 2
            HomeworkEvaluationCommentAssginJob.perform_later(homework_common.id)

            homework_detail_manual.update_column('comment_status', 3)
          else
            #作业数小于2,启动失败, 只给老师和助教发
            extra = "作品数量低于两个,无法开启匿评"
          end
        else
          extra = "存在尚未截止的分班,无法开启匿评"
        end
        HomeworkEvaluationStartNotifyJob.perform_later(homework_common.id, extra)
        if extra.present?
          homework_detail_manual.update_attributes(:evaluation_start => nil, :evaluation_end => nil, :absence_penalty => 0,
                                                   :evaluation_num => 0, :appeal_time => nil, :appeal_penalty => 0)
          homework_common.update_attributes(:anonymous_comment => 0, :anonymous_appeal => 0)
        end
      end
    end

    Rails.logger.info("log--------------------------------start_evaluation end")
    puts "--------------------------------start_evaluation end"
  end

  #自动关闭匿评的任务
  task :end_evaluation => :environment do
    homework_detail_manuals = HomeworkDetailManual.includes(:homework_common).where("evaluation_end <= '#{Time.now}' and homework_detail_manuals.comment_status = 3")
    homework_detail_manuals.each do |homework_detail_manual|
      homework_common = homework_detail_manual.homework_common
      if homework_common.anonymous_comment #开启匿评状态才可关闭匿评
        if homework_common.anonymous_appeal
          homework_detail_manual.update_column('comment_status', 4)
          # 申诉开启发送消息
          HomeworkAnonymousAppealStartNotifyJob.perform_later(homework_common.id)
        else
          homework_detail_manual.update_column('comment_status', 5)
          # 没有申诉阶段则直接计算缺评扣分 否则申诉结束时才计算
          HomeworkAbsencePenaltyCalculationJob.perform_later(homework_common.id)
        end
      end
    end
  end

  #自动关闭申诉的任务
  task :end_appeal => :environment do
    homework_detail_manuals = HomeworkDetailManual.where("appeal_time <= '#{Time.now}' and homework_detail_manuals.comment_status = 4")
    homework_detail_manuals.update_all(:comment_status => 5)
    homework_detail_manuals.each do |homework_detail_manual|
      HomeworkAbsencePenaltyCalculationJob.perform_later(homework_detail_manual.homework_common_id)
    end
  end
end