class HomeworkCommonController < ApplicationController
  layout "base_courses"
  before_filter :find_course, :only => [:index,:new,:create]
  before_filter :find_homework, :only => [:edit,:update,:alert_anonymous_comment,:start_anonymous_comment,:stop_anonymous_comment,:destroy]
  before_filter :teacher_of_course, :only => [:new, :create, :edit, :update, :destroy, :start_anonymous_comment, :stop_anonymous_comment, :alert_anonymous_comment]

  def index
    homeworks = @course.homework_commons.order("created_at desc")
    @is_teacher = User.current.logged? && (User.current.admin? || User.current.allowed_to?(:as_teacher,@course))
    @is_student = User.current.logged? && (User.current.admin? || (User.current.member_of_course?(@course) && !@is_teacher))
    @homeworks = paginateHelper homeworks,20
    respond_to do |format|
      format.html
    end
  end

  def new
    @homework = HomeworkCommon.new
    @homework.safe_attributes = params[:homework_common]
    @homework.late_penalty = 0
    @homework.end_time = (Time.now  + 3600 * 24).strftime('%Y-%m-%d')
    @homework.publish_time = Time.now.strftime('%Y-%m-%d')

    #匿评作业相关属性
    @homework_detail_manual = HomeworkDetailManual.new
    @homework_detail_manual.ta_proportion = 0.6
    @homework_detail_manual.absence_penalty = 0
    @homework_detail_manual.evaluation_num = 3
    @homework_detail_manual.evaluation_start = Time.now.strftime('%Y-%m-%d')
    @homework_detail_manual.evaluation_end = (Time.now  + 3600 * 24).strftime('%Y-%m-%d')
    @homework.homework_detail_manual = @homework_detail_manual
    respond_to do |format|
      format.html
    end
  end

  def create
    if params[:homework_common]
      homework = HomeworkCommon.new
      homework.name = params[:homework_common][:name]
      homework.description = params[:homework_common][:description]
      homework.end_time = params[:homework_common][:end_time]
      homework.publish_time = params[:homework_common][:publish_time]
      homework.homework_type = params[:homework_common][:homework_type]
      homework.late_penalty = params[:late_penalty]
      homework.user_id = User.current.id
      homework.course_id = @course.id

      homework.save_attachments(params[:attachments])
      render_attachment_warning_if_needed(homework)

      #匿评作业相关属性
      homework_detail_manual = HomeworkDetailManual.new
      homework_detail_manual.ta_proportion = params[:ta_proportion] || 0.6
      homework_detail_manual.comment_status = 1
      homework_detail_manual.evaluation_start = params[:evaluation_start]
      homework_detail_manual.evaluation_end = params[:evaluation_end]
      homework_detail_manual.evaluation_num = params[:evaluation_num]
      homework_detail_manual.absence_penalty = params[:absence_penalty]
      homework.homework_detail_manual = homework_detail_manual

      if homework.save
        respond_to do |format|
          format.html {
            flash[:notice] = l(:notice_successful_create)
            redirect_to homework_common_index_path(:course => @course.id)
          }
        end
        return
      end
    end

    respond_to do |format|
      format.html {
        flash[:notice] = l(:notice_failed_create)
        redirect_to new_homework_common_path(:course => @course.id)
      }
    end
  end

  def edit
    respond_to do |format|
      format.html
    end
  end

  def update
    @homework.name = params[:homework_common][:name]
    @homework.description = params[:homework_common][:description]
    @homework.end_time = params[:homework_common][:end_time]
    @homework.publish_time = params[:homework_common][:publish_time]
    @homework.homework_type = params[:homework_common][:homework_type]
    @homework.late_penalty = params[:late_penalty]
    @homework.user_id = User.current.id
    @homework.course_id = @course.id

    #匿评作业相关属性
    @homework_detail_manual.ta_proportion = params[:ta_proportion] || 0.6
    @homework_detail_manual.evaluation_start = params[:evaluation_start]
    @homework_detail_manual.evaluation_end = params[:evaluation_end]
    @homework_detail_manual.evaluation_num = params[:evaluation_num]
    @homework_detail_manual.absence_penalty = params[:absence_penalty]

    @homework.save_attachments(params[:attachments])
    render_attachment_warning_if_needed(@homework)

    if @homework.save && @homework_detail_manual.save
      respond_to do |format|
        format.html {
          flash[:notice] = l(:notice_successful_edit)
          redirect_to homework_common_index_path(:course => @course.id)
        }
      end
      return
    else
      respond_to do |format|
        format.html {
          flash[:notice] = l(:notice_failed_edit)
          redirect_to edit_homework_common_path(@homework)
        }
      end
    end
  end

  def destroy
    if @homework.destroy
      respond_to do |format|
        format.html {redirect_to homework_common_index_path(:course => @course.id)}
      end
    end
  end

  #开启匿评
  #statue 1:启动成功，2：启动失败，作业总数大于等于2份时才能启动匿评，3:已开启匿评，请务重复开启,4:没有开启匿评的权限
  def start_anonymous_comment
    @statue =4 and return unless User.current.admin? || User.current.allowed_to?(:as_teacher,@course)
    if @homework_detail_manual.comment_status == 1
      student_works = @homework.student_works
      if student_works && student_works.size >=2
        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
        @homework_detail_manual.update_column('comment_status', 2)
        @statue = 1
      else
        @statue = 2
      end
    else
      @statue = 3
    end
  end

  #关闭匿评
  def stop_anonymous_comment
    @homework_detail_manual.update_column('comment_status', 3)
    respond_to do |format|
      format.js
    end
  end

  #提示
  def alert_anonymous_comment
    @cur_size = 0
    @totle_size = 0
    if @homework_detail_manual.comment_status == 1
      @totle_size = @course.student.count
      @cur_size = @homework.student_works.size
    elsif @homework_detail_manual.comment_status == 2
      @homework.student_works.map { |work| @totle_size += work.student_works_evaluation_distributions.count}
      @cur_size = 0
      @homework.student_works.map { |work| @cur_size += work.student_works_scores.where(:reviewer_role => 3).count}
    end
    @percent = format("%.2f",(@cur_size.to_f / ( @totle_size == 0 ? 1 : @totle_size)) * 100)
    respond_to do |format|
      format.js
    end
  end

  private
  #获取课程
  def find_course
    @course = Course.find params[:course]
  rescue
    render_404
  end
  #获取作业
  def find_homework
    @homework = HomeworkCommon.find params[:id]
    @homework_detail_manual = @homework.homework_detail_manual
    @course = @homework.course
  rescue
    render_404
  end
  #是不是课程的老师
  def teacher_of_course
    render_403 unless User.current.allowed_to?(:as_teacher,@course) || User.current.admin?
  end

  def get_assigned_homeworks(student_works, n, index)
    student_works += student_works
    student_works[index + 1 .. index + n]
  end
end