class StudentWorkController < ApplicationController
  layout "base_courses"
  include StudentWorkHelper
  require 'bigdecimal'
  before_filter :find_homework, :only => [:new, :index, :create]
  before_filter :find_work, :only => [:edit, :update, :show, :destroy, :add_score, :praise_student_work]
  before_filter :member_of_course, :only => [:index, :new, :create, :show, :add_score, :praise_student_work]
  before_filter :author_of_work, :only => [:edit, :update, :destroy]

  def index
    @order,@b_sort,@name = params[:order] || "final_score",params[:sort] || "desc",params[:name] || ""
    @is_teacher = User.current.allowed_to?(:as_teacher,@course)
    #老师 || 非匿评作业 || 匿评结束 显示所有的作品
    @show_all = @is_teacher || @homework.homework_type != 1 || @homework.homework_detail_manual.comment_status == 3
    if @show_all
      if @homework.homework_type == 1 || @is_teacher || User.current.admin?
        @stundet_works = search_homework_member @homework.student_works.order("#{@order} #{@b_sort}"),@name
      else
        my_work = @homework.student_works.where(:user_id => User.current.id)
        if my_work.empty?
          @stundet_works = []
        else
          @stundet_works = search_homework_member @homework.student_works.order("#{@order} #{@b_sort}"),@name
        end
      end
    else #学生
      if @homework.homework_detail_manual.comment_status == 1 #未开启匿评，只显示我的作品
        @stundet_works = @homework.student_works.where(:user_id => User.current.id)
      elsif @homework.homework_detail_manual.comment_status == 2 #匿评列表，显示匿评作品和我的作品
        @is_evaluation = true
        my_work = @homework.student_works.where(:user_id => User.current.id)
        @stundet_works = my_work + User.current.student_works_evaluation_distributions.map(&:student_work).select { |work| work.homework_common_id == @homework.id}
      end
    end
    @homework_commons = @course.homework_commons.order("created_at desc")
    @score = @b_sort == "desc" ? "asc" : "desc"
    respond_to do |format|
      format.html
      format.xls {
        send_data(homework_to_xls(@stundet_works), :type => "text/excel;charset=utf-8; header=present",
                  :filename => "#{@course.teacher.lastname.to_s + @course.teacher.firstname}_#{@course.name}_#{@course.time.to_s + @course.term}_#{@homework.name}#{l(:excel_homework_list)}.xls")
      }
    end
  end

  def new
    student_work = @homework.student_works.where("user_id = ?",User.current.id).first
    if student_work.nil?
      @stundet_work = StudentWork.new
      respond_to do |format|
        format.html
      end
    else
      render_403
    end
  end

  def create
    if params[:student_work]
      stundet_work = StudentWork.new
      stundet_work.name = params[:student_work][:name]
      stundet_work.description = params[:student_work][:description]
      stundet_work.project_id = params[:student_work][:project_id]
      stundet_work.homework_common_id = @homework.id
      stundet_work.user_id = User.current.id
      stundet_work.save_attachments(params[:attachments])
      render_attachment_warning_if_needed(stundet_work)
      if stundet_work.save
        respond_to do |format|
          format.html {
            flash[:notice] = l(:notice_successful_create)
            redirect_to student_work_index_url(:homework => @homework.id)
          }
        end
        return
      end
    end
    respond_to do |format|
      format.html {
        flash[:notice] = l(:notice_failed_create)
        redirect_to new_student_work_url(:homework => @homework.id)
      }
    end
  end

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

  def update
    if params[:student_work]
      @work.name = params[:student_work][:name]
      @work.description = params[:student_work][:description]
      @work.project_id = params[:student_work][:project]
      @work.save_attachments(params[:attachments])
      render_attachment_warning_if_needed(@work)
      if @work.save
        respond_to do |format|
          format.html {
            flash[:notice] = l(:notice_successful_edit)
            redirect_to student_work_index_url(:homework => @homework.id)
          }
        end
        return
      end
    end
    respond_to do |format|
      format.html{redirect_to edit_student_work_url(@work)}
    end
  end

  def show
    @score = student_work_score @work,User.current
    @is_teacher = User.current.allowed_to?(:as_teacher,@course)
    respond_to do |format|
      format.js
    end
  end

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

  #添加评分，已评分则为修改评分
  def add_score
    render_403 and return if User.current == @work.user #不可以匿评自己的作品
    @is_teacher = User.current.allowed_to?(:as_teacher,@course)
    #老师、教辅可以随时评分，学生只能在匿评作业的匿评阶段进行评分
    render_403 and return unless @is_teacher || (@homework.homework_type == 1 && @homework.homework_detail_manual.comment_status == 2)
    @score = student_work_score @work,User.current
    if @score
      @score.comment = params[:new_form][:user_message] if params[:new_form] && params[:new_form][:user_message] && params[:new_form][:user_message] != ""
      @score.score = params[:score] if params[:score]
      @is_new = false
    else
      @score = StudentWorksScore.new
      @score.score = params[:score] if params[:score]
      @score.comment = params[:new_form][:user_message] if params[:new_form] && params[:new_form][:user_message] && params[:new_form][:user_message] != ""
      @score.user_id = User.current.id
      @score.student_work_id = @work.id
      role = User.current.members.where("course_id = ?",@course.id).first.roles.first.name
      User.current.admin? ? @score.reviewer_role = 1 : @score.reviewer_role = get_role_by_name(role)
      @is_new = true
    end

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

    if @score.save
      case @score.reviewer_role
        when 1 #教师评分：最后一个教师评分为最终评分
          @work.teacher_score = @score.score
          @work.final_score = @score.score
        when 2 #教辅评分 教辅评分显示平均分
          @work.teaching_asistant_score = @work.student_works_scores.where(:reviewer_role => 2).average(:score).try(:round, 2).to_f
          if @work.teacher_score.nil?
            if @work.student_score.nil?
              @work.final_score = @work.teaching_asistant_score
            else
              final_ta_score = BigDecimal.new("#{@work.teaching_asistant_score}") * BigDecimal.new("#{@homework.homework_detail_manual.ta_proportion}")
              final_s_score = BigDecimal.new("#{@work.student_score}") * (BigDecimal.new('1.0')  - BigDecimal.new("#{@homework.homework_detail_manual.ta_proportion}"))
              final_score = final_ta_score + final_s_score
              @work.final_score = format("%.2f",final_score.to_f)
            end
          end
        when 3 #学生评分 学生评分显示平均分
          @work.student_score = @work.student_works_scores.where(:reviewer_role => 3).average(:score).try(:round, 2).to_f
          if @work.teacher_score.nil?
            if @work.teaching_asistant_score.nil?
              @work.final_score = @work.student_score
            else
              final_ta_score = BigDecimal.new("#{@work.teaching_asistant_score}") * BigDecimal.new("#{@homework.homework_detail_manual.ta_proportion}")
              final_s_score = BigDecimal.new("#{@work.student_score}") * (BigDecimal.new('1.0')  - BigDecimal.new("#{@homework.homework_detail_manual.ta_proportion}"))
              final_score = final_ta_score + final_s_score
              @work.final_score = format("%.2f",final_score.to_f)
            end
          end
      end

      if @work.save
        respond_to do |format|
          format.js
        end
      end
    end
  end

  #添加评分的回复
  def add_score_reply
    @score = StudentWorksScore.find params[:score_id]
    @jour = @score.journals_for_messages.new(:user_id => User.current.id,:notes =>params[:message], :reply_id => 0)
    if @jour.save
      @status = 1
    else
      @status = 2
    end
    respond_to do |format|
      format.js
    end
  end

  #删除评分的回复
  def destroy_score_reply
    @jour = JournalsForMessage.find params[:jour_id]
    if @jour.destroy
      respond_to do |format|
        format.js
      end
    end
  end

  #为作品点赞
  def praise_student_work
    pt = PraiseTread.new
    pt.user_id = User.current.id
    pt.praise_tread_object_id = @work.id
    pt.praise_tread_object_type = "StudentWork"
    pt.praise_or_tread = 1
    if pt.save
      respond_to do |format|
        format.js
      end
    else
      render_404
    end
  end

  private
  #获取作业
  def find_homework
    @homework = HomeworkCommon.find params[:homework]
    @course = @homework.course
  rescue
    render_404
  end
  #获取作品
  def find_work
    @work = StudentWork.find params[:id]
    @homework = @work.homework_common
    @course = @homework.course
  rescue
    render_404
  end

  #是不是当前课程的成员
  #当前课程成员才可以看到作品列表
  def member_of_course
    render_403 unless User.current.member_of_course? @course || User.current.admin?
  end

  #判断是不是当前作品的提交者
  #提交者 && (非匿评作业 || 未开启匿评) 可以编辑作品
  def author_of_work
    render_403 unless (User.current.id == @work.user_id || User.current.admin?) && (@homework.homework_type != 1 || @homework.homework_detail_manual.comment_status == 1 )
  end

  #根据条件过滤作业结果
  def search_homework_member homeworks,name
    name = name.downcase
    select_homework = homeworks.select{ |homework|
      homework.user[:login].to_s.downcase.include?(name) ||  homework.user.user_extensions[:student_id].to_s.downcase.include?(name) || (homework.user[:lastname].to_s.downcase + homework.user[:firstname].to_s.downcase).include?(name)
    }
    select_homework
  end

  def homework_to_xls items
    xls_report = StringIO.new
    book = Spreadsheet::Workbook.new
    sheet1 = book.create_worksheet :name => "homework"
    blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10
    sheet1.row(0).default_format = blue
    sheet1.row(0).concat([l(:excel_user_id),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_mail),l(:excel_homework_name),
                          l(:excel_t_score),l(:excel_ta_score),l(:excel_n_score),l(:excel_f_score),l(:excel_commit_time)])
    count_row = 1
    items.each do |homework|
      sheet1[count_row,0]=homework.user.id
      sheet1[count_row,1] = homework.user.lastname.to_s + homework.user.firstname.to_s
      sheet1[count_row,2] = homework.user.login
      sheet1[count_row,3] = homework.user.user_extensions.student_id
      sheet1[count_row,4] = homework.user.mail
      sheet1[count_row,5] = homework.name
      sheet1[count_row,6] = homework.teacher_score.nil? ? l(:label_without_score) : format("%.2f",homework.teacher_score)
      sheet1[count_row,7] = homework.teaching_asistant_score.nil? ? l(:label_without_score) : format("%.2f",homework.teaching_asistant_score)
      sheet1[count_row,8] = homework.student_score.nil? ? l(:label_without_score) : format("%.2f",homework.student_score)
      sheet1[count_row,9] = homework.final_score.nil? ? l(:label_without_score) : format("%.2f",homework.final_score)
      sheet1[count_row,10] = format_time(homework.created_at)
      count_row += 1
    end
    book.write xls_report
    xls_report.string
  end
end