#coding=utf-8
class CoursesService
  include ApplicationHelper
  include CoursesHelper
  include HomeworkAttachHelper
  include ApiHelper
  include ActionView::Helpers::DateHelper

  #参数school_id为0或不传时返回所有课程，否则返回对应学校的课程
  #参数per_page_count分页功能，每页显示的课程数
  #参数page分页功能，当前页码
  def course_list params,current_user
    @school_id = params[:school_id]
    per_page_option = params[:per_page_count] || 10
    page_no = params[:page] || 1
    if @school_id == "0" || @school_id.nil?
      @courses_all = Course.active.visible.
        joins("LEFT JOIN #{CourseStatus.table_name} ON #{Course.table_name}.id = #{CourseStatus.table_name}.course_id")
    else
      @courses_all = Course.active.visible.
        joins("LEFT JOIN #{CourseStatus.table_name} ON #{Course.table_name}.id = #{CourseStatus.table_name}.course_id").
        where("#{Course.table_name}.school_id = ?", @school_id)
    end
    @course_count = @courses_all.count
    @course_pages = Redmine::Pagination::Paginator.new @course_count, per_page_option,page_no
    @courses = @courses_all.order("created_at desc")
    @courses = @courses.offset(@course_pages.offset).limit(@course_pages.per_page)
    course_list = []
    @courses.each do |course|
      course_list << {:course => course,:img_url => url_to_avatar(course),:current_user_is_member => current_user.member_of_course?(course),:current_user_is_teacher => is_course_teacher(current_user,course)}
    end
    course_list
  end

  #搜索课程
  def search_course params,current_user
    courses_all = Course.all_course
    name = params[:name]
    if name.blank?
      raise 'sumbit empty'
    end
    @courses = courses_all.visible(current_user)
    if params[:name].present?
      @courses_all = @courses.like(params[:name]).order("created_at desc")
    else
      @courses_all =  @courses.order("created_at desc");
    end
    @courses_all
    course_list = []
    @courses_all.each do |course|
      course_list << {:course => course,:img_url => url_to_avatar(course),:current_user_is_member => current_user.member_of_course?(course),:current_user_is_teacher => is_course_teacher(current_user,course)}
    end
    course_list
  end

  #获取头像
  def get_img obj
    url_to_avatar(obj)
  end

  #课程老师或课程学生列表
  def course_teacher_or_student_list params,course,current_user
    if course.is_a?(Course)
      c = course
    else
      c = Course.find(course)
    end
    if current_user.nil? || !(current_user.admin? || c.is_public == 1 || (c.is_public == 0 && current_user.member_of_course?(c)))
      raise '403'
    end
    @teachers= searchTeacherAndAssistant(c)
    #@canShowCode = isCourseTeacher(User.current.id,course) && params[:role] != '1'
    case params[:role]
      when '1'
        #@subPage_title = l :label_teacher_list
        @members = searchTeacherAndAssistant(c)
      when '2'
        #@subPage_title = l :label_student_list
        @members = searchStudent(c)
      else
        #@subPage_title = ''
        @members = c.member_principals.includes(:roles, :principal).all.sort
    end
    users = []
    @members.each do |m|
      img_url = url_to_avatar(m.user)
      gender = m.user.user_extensions.gender.nil? ? 0 : m.user.user_extensions.gender
      work_unit = get_user_work_unit m.user
      location = get_user_location m.user
      users << {:id => m.user.id, :img_url => img_url, :nickname => m.user.login, :gender => gender, :work_unit => work_unit, :mail => m.user.mail, :location => location, :brief_introduction => m.user.user_extensions.brief_introduction,:realname=>m.user.realname}
    end
    users
  end

  #获取用户的工作单位
  def get_user_work_unit user
    work_unit = ""
    if user.user_extensions.identity == 0 || user.user_extensions.identity == 1
      work_unit = user.user_extensions.school.name unless  user.user_extensions.school.nil?
    elsif  user.user_extensions.identity == 3
      work_unit = user.user_extensions.occupation
    elsif user.user_extensions.identity == 2
      work_unit = user.firstname
    end
    work_unit
  end

  #获取用户地区
  def get_user_location user
    location = ""
    location << (user.user_extensions.location || '')
    location << (user.user_extensions.location_city || '')
    location
  end

  #课程通知列表
  def course_news_list params,current_user
    if params[:course_id] && @course==nil
      @course = Course.find(params[:course_id])
    end
    if current_user.nil? || !(current_user.admin? || @course.is_public == 1 || (@course.is_public == 0 && current_user.member_of_course?(@course)))
      raise '403'
    end
    scope = @course ? @course.news.order("news.created_on desc").course_visible(current_user) : News.order("news.created_on desc").course_visible(current_user)
    news = []
    scope.each do |n|
      news << {:id => n.id,:title => n.title,:author_name => n.author.name,:author_id => n.author.id, :author=>n.author, :description => n.description,:created_on => format_time(n.created_on),:comments_count => n.comments_count}
    end
    news
  end

  #查看新闻权限验证
  def show_course_news_authorize(current_user)
    unless current_user.allowed_to?({:controller => 'news', :action => 'show'}, false)
      raise '403'
    end
  end

  #显示课程通知(包括评论) 需验证权限
  def show_course_news params,current_user
    @news = News.find(params[:id])
    @course = @news.course
    if @course
      if current_user.nil? || !(current_user.admin? || @course.is_public == 1 || (@course.is_public == 0 && current_user.member_of_course?(@course)))
        raise '403'
      end
    end
    @comments = @news.comments
    @comments.reverse! if current_user.wants_comments_in_reverse_order?
    {:news => @news,:comments => @comments}

    #comments = []
    #@comments.each do |comment|
    #  comments << {:author_id => comment.author_id,:author_name => comment.author.name,:commont_content => comment.comments,:time => format_time(comment.created_on)}
    #end
    #{:title => @news.title,:author_name => @news.author.name,:author_id => @news.author.id, :description => @news.description,:created_on => format_time(@news.created_on),
    # :comments_count => @news.comments_count,:comments => comments}
  end



  #显示课程
  def show_course(params,current_user)
    course = Course.find(params[:id])
    if course.school
      work_unit = course.school.name
    else
      work_unit = get_user_work_unit course.teacher
    end
    unless (course.is_public == 1 ||  current_user.member_of_course?(course) || current_user.admin?)
      raise '403'
    end
    {:course => course,:work_unit => work_unit, :img_url => url_to_avatar(course),:current_user_is_member => current_user.member_of_course?(course),:current_user_is_teacher => is_course_teacher(current_user,course),:course_student_num => course ? course.student.count.to_s : 0}
  end

  #创建课程
  #current_user当前用户对象（不是id）
  # params[:course][:name]:课程名称
  #params[:course][:password]:密码
  #params[:course][:description]:描述
  #params[:course][:is_public]:是否公开1公开，0私有
  #params[:course][:open_student]:是否公开学生列表1公开，0不公开，不公开时非课程成员无法看到学生列表
  #params[:course][:course_type]:暂时默认给1值。
  #params[:term]：学期（秋季学期或春季学期）
  #params[:time]: 年份（例：2014）
  #params[:setup_time]：暂不传（貌似已经没用了）
  #params[:endup_time]: 暂不传（貌似已经没用了）
  #params[:class_period]:学时总数
  def create_course(params,current_user)
    if current_user.user_extensions.identity
      @course = Course.new
      @course.extra = 'course' + DateTime.parse(Time.now.to_s).strftime('%Y-%m-%d_%H-%M-%S').to_s
      @course.send(:safe_attributes=, params[:course], current_user)
      #@course.safe_attributes(current_user,params[:course])
      @course.tea_id = current_user.id
      @course.term = params[:term]
      @course.time = params[:time]
      #@course.school_id = params[:occupation]
      @course.school_id = current_user.user_extensions.school_id
      @course.setup_time = params[:setup_time]
      @course.endup_time = params[:endup_time]
      @course.class_period = params[:class_period].to_i
      params[:course][:is_public] ? @course.is_public = 1 : @course.is_public = 0
      params[:course][:open_student] ? @course.open_student = 1 : @course.open_student = 0
    else

    end

    @issue_custom_fields = IssueCustomField.sorted.all
    @trackers = Tracker.sorted.all

    if @course && @course.save
      #unless User.current.admin?
      r = Role.givable.find_by_id(Setting.new_project_user_role_id.to_i) || Role.givable.first
      m = Member.new(:user => current_user, :roles => [r])
      m.project_id = -1
      course = CourseInfos.new(:user_id => current_user.id, :course_id => @course.id)
      #user_grades = UserGrade.create(:user_id => User.current.id, :course_id => @course.id)
      if params[:course][:is_public] == '1'
        course_status = CourseStatus.create(:course_id => @course.id, :watchers_count => 0, :changesets_count => 0, :grade => 0, :course_type => @course_tag)
      end
      @course.members << m
      @course.course_infos << course
    end
    {:course => @course,:img_url => url_to_avatar(@course),:current_user_is_member => current_user.member_of_course?(@course),:current_user_is_teacher => is_course_teacher(current_user,@course)}
  end

  #验证编辑课程的权限
  #当前
  def edit_course_authorize(current_user,course)
    unless current_user.allowed_to?({:controller => 'courses', :action => 'update'}, course)
      raise '403'
    end
  end

  #编辑课程  需验证权限
  # params[:course][:name]:课程名称
  #params[:course][:password]:密码
  #params[:course][:description]:描述
  #params[:course][:is_public]:是否公开1公开，0私有
  #params[:course][:open_student]:是否公开学生列表1公开，0不公开，不公开时非课程成员无法看到学生列表
  #params[:course][:course_type]:暂时默认给1值。
  #params[:term]：学期（秋季学期或春季学期）
  #params[:time]: 年份（例：2014）
  #params[:class_period]:学时总数
  def edit_course(params,course,current_user)
    course.send(:safe_attributes=, params[:course], current_user)
    #course.safe_attributes = params[:course]
    course.time = params[:time]
    course.term = params[:term]
    course.class_period = params[:class_period].to_i
    params[:course][:is_public] ? course.is_public = 1 : course.is_public = 0
    params[:course][:open_student] ? course.open_student = 1 : course.open_student = 0
    if course.save
      if params[:course][:is_public] == '0'
        course_status = CourseStatus.find_by_course_id(course.id)
        course_status.destroy if course_status
      elsif params[:course][:is_public] == '1'
        course_status = CourseStatus.find_by_course_id(course.id)
        course_status.destroy if course_status
        course_status = CourseStatus.create(:course_id => course.id,  :grade => 0)
      end
    end
    {:course => course,:img_url => url_to_avatar(course),:current_user_is_member => current_user.member_of_course?(course),:current_user_is_teacher => is_course_teacher(current_user,course)}
  end

  #退出课程
  #object_id: 课程id
  #user：当前用户
  #@state == 0 退出成功
  #@state == 1 不在课程中
  #@state == 2 您还未登录
  #@state 其他 未知错误，请稍后再试
  def exit_course params,user
    if user.nil?
      @state = 2
      return @state
    end
    @member = Member.where('course_id = ? and user_id = ?', params[:object_id], user.id)
    if @member.nil? || @member.count == 0
      @state = 1
      return @state
    end
    @member.first.destroy
    joined = StudentsForCourse.where('student_id = ? and course_id = ?', user.id, params[:object_id])
    joined.each do |join|
      join.delete
      @state = 0
    end
    @state
  end

  #加入课程
  #object_id：课程id
  #course_password ：加入课程的密码
  #@state == 0 加入成功
  #@state == 1 密码错误
  #@state == 2 课程已过期 请联系课程管理员重启课程。(在配置课程处)
  #@state == 3 您已经加入了课程
  #@state == 4 您加入的课程不存在
  #@state == 5 您还未登录
  #@state 其他 未知错误，请稍后再试
  def join_course params,current_user
    course = Course.find_by_id params[:object_id]
    @state = 10
    if course
      if course_endTime_timeout? course
        @state = 2
      else
        if current_user.member_of_course?(course)
          @state = 3
        else
          if params[:course_password] == course.password
            members = []
            members << Member.new(:role_ids => [10], :user_id => current_user.id)
            course.members << members
            StudentsForCourse.create(:student_id => current_user.id, :course_id => params[:object_id])
            @state = 0
          else
            @state = 1
          end
        end
      end
    else
      @state = 4
    end
    {:state => @state,:course => course}
  end

  #作业列表
  #已提交的作业数量获取 bid.homeworks.count
  #学生提问数量获取 bid.commit.nil? ? 0 : bid.commit
  def homework_list params,current_user
    course = Course.find(params[:id])
    if course.is_public != 0 || current_user.member_of_course?(course)
      bids = course.homework_commons.page(params[:page] || 1).per(20).order('created_at DESC')
      bids = bids.like(params[:name]) if params[:name].present?
       homeworks = []
       bids.each do |bid|
         homeworks <<  show_homework_info(course,bid,current_user,is_course_teacher(current_user,course))
       end
       homeworks
    else
      raise '403'
    end
  end

  def course_dynamic(params,current_user)

    @user = User.find(params[:id])
    if current_user.nil? && !current_user.admin? && !@user.active?
      raise '404'
      return
    end
    if current_user == @user || current_user.admin?
      membership = @user.coursememberships.all
    else
      membership = @user.coursememberships.all(:conditions => Course.visible_condition(current_user))
    end
    if membership.nil? || membership.count == 0
      raise l(:label_no_courses,:locale => get_user_language(current_user))
    end
    membership.sort! {|older, newer| newer.created_on <=> older.created_on }
    result = []
    membership.each do |mp|
      course = mp.course
      latest_course_dynamics = []
      latest_news = course.news.order("created_on desc").first
      unless latest_news.nil?
        latest_course_dynamics << {:type => 1,:time => latest_news.created_on,
                                   :message =>latest_news.author.realname<< l(:label_recently_updated_notification,:locale => get_user_language(current_user))<<"："<< latest_news.title }
      end
      latest_message = course.journals_for_messages.order("created_on desc").first
      unless latest_message.nil?
        latest_course_dynamics << {:type => 2,:time => latest_message.created_on,:message =>latest_message.user.realname << l(:label_recently_updated_message,:locale => get_user_language(current_user))<<"："<<latest_message.notes}
      end
      latest_attachment = course.attachments.order("created_on desc").first
      unless latest_attachment.nil?
        latest_course_dynamics << {:type => 3,:time => latest_attachment.created_on,:message =>latest_attachment.author.realname<< l(:label_recently_updated_courseware,:locale => get_user_language(current_user))<<"："<<latest_attachment.filename}
      end
      latest_bid = course.homework_commons.order('updated_at DESC').first
      unless latest_bid.nil?
        latest_course_dynamics << {:type => 4,:time => latest_bid.updated_at,:message => latest_bid.user.realname<<l(:label_recently_updated_homework,:locale => get_user_language(current_user))<<"："<<latest_bid.name}
      end

      # Time 2015-04-07 14:58:30
      # Author lizanle
      # Description 添加课程创建动态
      if(User.find_by_id(CourseInfos.find_by_course_id(course.id).try(:user_id)))
        create_user_name = User.find_by_id(CourseInfos.find_by_course_id(course.id).user_id).realname
        latest_course_dynamics << {:type => 5,:time => course.created_at,:message =>l(:label_recently,:locale => get_user_language(current_user)) << create_user_name << l(:label_creat,:locale => get_user_language(current_user))}
      end


      #每个作业中的最新留言
      # messages = []
      # course.homework_commons.each do |hc|
      #   jour = hc.journals_for_messages.order("created_on desc").first
      #   unless jour.nil?
      #     messages << jour
      #   end
      # end
      # unless messages.count == 0
      #   messages.sort!{|order,newer| newer.created_on <=> order.created_on}
      # end
      # latest_bid_message = messages.first
      # unless latest_bid_message.nil?
      #   latest_course_dynamics << {:type => 4,:time => latest_bid_message.created_on,:message => l(:label_recently_updated_message,:locale => get_user_language(current_user))}
      # end
      #每个作业中学生最后提交的作业
      homeworks = []
      course.homework_commons.each do |bid|
         homework_attach = bid.student_works.order('updated_at DESC').first
         unless homework_attach.nil?
           homeworks << homework_attach
         end
      end
      unless homeworks.count == 0
        homeworks.sort!{|order,newer| newer.updated_at <=> order.updated_at}
      end
      latest_homework_attach = homeworks.first
      unless latest_homework_attach.nil?
        latest_course_dynamics << {:type => 4,:time => latest_homework_attach.updated_at,:message =>latest_homework_attach.user.realname<< l(:label_recently_updated_homework,:locale => get_user_language(current_user))<<"："<<(latest_homework_attach.name.nil? ? latest_homework_attach.description : latest_homework_attach.name)}
      end
      latest_course_dynamics.sort!{|order,newer| newer[:time] <=> order[:time]}
      latest_course_dynamic = latest_course_dynamics.first
      unless latest_course_dynamic.nil?
        result << {:course_name => course.name,:course_id => course.id,:course_img_url => url_to_avatar(course),:course_time => course.time,:course_term => course.term,:type => latest_course_dynamic[:type],:update_time => latest_course_dynamic[:time],:message => latest_course_dynamic[:message],:count => nil}
      end
    end
    result.sort!{|order,newer| newer[:update_time] <=> order[:update_time]}
    result
  end

   # 课程课件
   def course_attachments params
     result = []
     course = Course.find(params[:course_id])
     attachments = course.attachments.order("created_on ")
     if !params[:name].nil? && params[:name] != ""
       attachments.each do |atta|
         result << atta if atta.filename.include?(params[:name])

       end
     else
       result = attachments
     end
     result
   end

  # 课程学生列表
  def course_members params
    @all_members = searchmember_by_name(student_homework_score(0,params[:course_id], 10,"desc"),params[:name])
  end

  def show_member_score  params
    @member_score = Member.find(params[:member_id]) if params[:member_id]
    atta = @member_score.student_homework_score[0]
    result = []
    atta.each do |t|
      if !params[:homeworkName].nil? && params[:homeworkName] != ""
        result << {:name=>t[:name],:score=>t[:score]} if t[:name].include?(params[:homeworkName])
      else
        result << {:name=>t[:name],:score=>t[:score]}
      end

    end
    result
  end

  # 设置人员为课程教辅
  def set_as_assitant_teacher params
    members = []
    #找到课程
    course = Course.find(params[:course_id])
    #新建课程人员

    member =  Member.new(:role_ids =>[7], :user_id => params[:user_id],:course_id=>params[:course_id])
    joined = StudentsForCourse.where('student_id = ? and course_id = ?', member.user_id,course.id)
    joined.each do |join|
      join.delete
    end
    member.course_group_id = 0
    members << member
    course.members << members
    #将课程人员设置为教辅
  end

  def del_assitant_teacher params
     member =  Member.where("user_id = ? and course_id = ?",params[:user_id],params[:course_id])
     member.each do |m|
       m.destroy
     end
     user_admin = CourseInfos.where("user_id = ? and course_id = ?",params[:user_id], params[:course_id])
     if user_admin.size > 0
       user_admin.each do |user|
         user.destroy
       end
     end
     joined = StudentsForCourse.where('student_id = ? and course_id = ?', params[:user_id],params[:course_id])
     joined.each do |join|
       join.delete
     end
  end

  def create_course_notice params ,current_user
    n = News.new(:course_id =>params[:course_id], :author_id => current_user.id,:title =>params[:title],:description=> params[:desc])
    n.save
    {:id => n.id,:title => n.title,:author_name => n.author.name,:author_id => n.author.id, :description => n.description,:created_on => format_time(n.created_on),:comments_count => n.comments_count}
  end

  private
  def searchmember_by_name  members, name
    #searchPeopleByRoles(project, StudentRoles)
    mems = []
    if name != ""
      name = name.to_s.downcase
      members.each do |m|
        username = m.user[:lastname].to_s.downcase + m.user[:firstname].to_s.downcase
        if(m.user[:login].to_s.downcase.include?(name) ||  m.user.user_extensions[:student_id].to_s.downcase.include?(name) || username.include?(name))
          mems << m
        end
      end
    else
      mems = members
    end
    mems
  end
  def show_homework_info course,bid,current_user,is_course_teacher
    author_real_name = bid.user.lastname + bid.user.firstname
    many_times = course.homework_commons.index(bid) + 1
    name = bid.name
    homework_count = bid.student_works.count  #已提交的作业数量
    #student_questions_count = bid.journals_for_messages.where('m_parent_id IS NULL').count
    description = bid.description
    #if is_course_teacher(User.current, course) && @bid.open_anonymous_evaluation == 1 && @bid.homeworks.count >= 2
    #state = bid.homework_detail_manual.comment_status
    if !bid.nil?
      if  bid.homework_type == 1 && bid.homework_detail_manual
        case bid.homework_detail_manual.comment_status
          when 1
            state = show_homework_deadline bid
          when 2
            state = "正在匿评中"
          when 3
            state = "匿评已结束"
        end
      elsif bid.homework_type == 0
        state = "未启用匿评"
      elsif bid.homework_type == 2
        state = "编程作业"
      else
      end
    end
    # studentlist = []
    # bid.student_works.order("created_at desc").page(1).per(6).each do |work|
    #   studentlist << work.user
    # end
    # unless is_course_teacher
    #   homework_for_anonymous_comments = get_student_batch_homework_list bid,current_user
    # end
    #end
    open_anonymous_evaluation = bid.homework_detail_manual.comment_status
    {:course_name => course.name,:course_id => course.id,:id => bid.id,
     :author => bid.user,:author_real_name => author_real_name,
     :homework_times => many_times, :homework_name => name,
     :homework_count => homework_count,:student_questions_count => 0,
     :description => description, :homework_state => state,
     :open_anonymous_evaluation => open_anonymous_evaluation,
     #:homework_for_anonymous_comments => homework_for_anonymous_comments,
     :created_on => bid.created_at,:deadline => bid.end_time,
      :homework_notsubmit_num => bid.course.members.count - bid.student_works.count,
      :homework_submit_num => bid.student_works.count,
      :homework_status_student => get_homework_status( bid),:homework_status_teacher =>  homework_status_desc( bid),
       :student_evaluation_part => get_evaluation_part( bid ,3),
      :ta_evaluation_part => get_evaluation_part( bid ,2),:homework_anony_type => bid.homework_type == 1 && !bid.homework_detail_manual.nil?}

  end

  #显示作业列表的同时显示分配给当前学生匿评的作业
  def show_homework_info_with_batch course,bid
    author = bid.author.lastname + bid.author.firstname
    many_times = course.homeworks.index(bid) + 1
    name = bid.name
    homework_count = bid.homeworks.count  #已提交的作业数量
    student_questions_count = bid.journals_for_messages.where('m_parent_id IS NULL').count
    description = bid.description
                                          #if is_course_teacher(User.current, course) && @bid.open_anonymous_evaluation == 1 && @bid.homeworks.count >= 2
    state = bid.comment_status
                                          #end
    open_anonymous_evaluation = bid.open_anonymous_evaluation
    {:course_name => course.name,:id => bid.id, :course_teacher => author, :homework_times => many_times, :homework_name => name, :homework_count => homework_count,:student_questions_count => student_questions_count,
     :description => description, :homework_state => state,:open_anonymous_evaluation => open_anonymous_evaluation}
  end


  def student_homework_score(groupid,course_id, nums, score_sort_by)
    #teachers = find_course_teachers(@course)
    #start_from = start_from * nums
    sql_select = ""
    if groupid == 0
      if nums == 0
        sql_select = "SELECT members.*, SUM(homework_attaches.score) as score FROM members, homework_attaches
            WHERE members.course_id = #{course_id} AND members.user_id in (SELECT students_for_courses.student_id FROM students_for_courses WHERE course_id = #{course_id}) AND members.user_id = homework_attaches.user_id
        AND homework_attaches.bid_id in (SELECT bid_id FROM homework_for_courses WHERE course_id = #{course_id}) GROUP BY members.user_id
        UNION all
        SELECT members.*, 0 as  score FROM members,homework_attaches,students_for_courses WHERE members.course_id = #{course_id} AND
        students_for_courses.course_id = #{course_id} and members.user_id = students_for_courses.student_id AND
        members.user_id NOT IN (SELECT homework_attaches.user_id FROM homework_attaches WHERE homework_attaches.bid_id in (SELECT bid_id FROM homework_for_courses WHERE course_id = #{course_id} )
        )
        GROUP BY members.user_id ORDER BY score #{score_sort_by}"
      else
        sql_select = "SELECT members.*, SUM(homework_attaches.score) as score FROM members, homework_attaches
            WHERE members.course_id = #{course_id} AND members.user_id in (SELECT students_for_courses.student_id FROM students_for_courses WHERE course_id = #{course_id}) AND members.user_id = homework_attaches.user_id
        AND homework_attaches.bid_id in (SELECT bid_id FROM homework_for_courses WHERE course_id = #{course_id})  GROUP BY members.user_id
        UNION all
        SELECT members.*, 0 as  score FROM members,homework_attaches,students_for_courses WHERE members.course_id = #{course_id} AND
        students_for_courses.course_id = #{course_id} and members.user_id = students_for_courses.student_id AND
        members.user_id NOT IN (SELECT homework_attaches.user_id FROM homework_attaches WHERE homework_attaches.bid_id in (SELECT bid_id FROM homework_for_courses WHERE course_id = #{course_id} )
        )
        GROUP BY members.user_id ORDER BY score #{score_sort_by} " #limit #{start_from}, #{nums}"

      end
    else
      sql_select = "SELECT members.*, SUM(homework_attaches.score) as score FROM members, homework_attaches
        WHERE members.course_id = #{course_id} AND members.user_id in (SELECT students_for_courses.student_id FROM students_for_courses WHERE course_id = #{course_id}) AND members.user_id = homework_attaches.user_id
        and members.course_group_id = #{groupid} AND homework_attaches.bid_id in (SELECT bid_id FROM homework_for_courses WHERE course_id = #{course_id})
        GROUP BY members.user_id
        UNION all
        SELECT members.*, 0 as  score FROM members,homework_attaches,students_for_courses WHERE members.course_id = #{course_id}
        and members.course_group_id = #{groupid} AND
        students_for_courses.course_id = #{course_id} and members.user_id = students_for_courses.student_id AND
        members.user_id NOT IN (SELECT homework_attaches.user_id FROM homework_attaches WHERE homework_attaches.bid_id in (SELECT bid_id FROM homework_for_courses WHERE course_id = #{course_id} )
        )
        GROUP BY members.user_id ORDER BY score #{score_sort_by}"
    end
    sql = ActiveRecord::Base.connection()
    homework_scores = Member.find_by_sql(sql_select)
    sql.close()

    homework_scores
  end

  #app新版api
  #
  #
  #课程动态
  public
  def all_course_dynamics params, current_user
    #获取当前用户的所有课程
    @user = User.find(params[:id])
    if current_user.nil? && !current_user.admin? && !@user.active?
      raise '404'
      return
    end
    if current_user == @user || current_user.admin?
      membership = @user.coursememberships
    else
      membership = @user.coursememberships.all(:conditions => Course.visible_condition(current_user))
    end
    if membership.nil? || membership.count == 0
      raise l(:label_no_courses, :locale => get_user_language(current_user))
    end
    #membership.sort! { |older, newer| newer.created_on <=> older.created_on }

    #定义一个数组集合，存放hash数组，该hash数组包括课程的信息，并包含课程的最新发布的资源，最新的讨论区留言，最新的作业，最新的通知
    result = []
    #对用户所有的课程进行循环，找到每个课程最新发布的资源，最新的讨论区留言，最新的作业，最新的通知，并存进数组

    membership.each do |mp|
      course = mp.course
      latest_course_dynamics = []
      notices_count = 0
      topic_count = 0
      topics = nil
      homeworkss = nil
      notices = nil

      # 课程通知
      latest_news = course.news.page(1).per(2).order("created_on desc")
      unless latest_news.first.nil?
        notices_count = course.news.count
        notices = latest_news.all
        latest_course_dynamics << {:time => latest_news.first.created_on }
      end
      # 课程讨论区
       latest_message = course.boards.first.topics.page(1).per(2)
       unless latest_message.first.nil?
         topic_count = course.boards.nil? ? 0 : course.boards.first.topics.count
         topics = latest_message.all
         latest_course_dynamics << {:time => latest_message.first.created_on}
       end
      # 课程资源
      # latest_attachment = course.attachments.order("created_on desc").page(1).per(2)
      # unless latest_attachment.first.nil?
      #   latest_course_dynamics << {:type => 3, :time => latest_attachment.first.created_on,:count =>course.attachments.count , :documents=>latest_attachment}
      #   dynamics_count += 1
      # end

      #课程作业 已经交的学生列表（暂定显示6人），未交的学生列表，作业的状态
      homeworks = course.homework_commons.page(1).per(2).order('created_at desc')
      unless homeworks.first.nil?
        homeworkss =  homeworks
        latest_course_dynamics << {:time => homeworks.first.updated_at}
      end
      latest_course_dynamics.sort! { |order, newer| newer[:time] <=> order[:time] }
      # 课程学霸 学生总分数排名靠前的5个人
      homework_count = course.homework_commons.count
      sql = "select users.*,ROUND(sum(student_works.final_score),2) score from student_works left outer join users on student_works.user_id = users.id" <<
          " where  homework_common_id in ( select id from homework_commons where homework_commons.course_id = #{course.id}) GROUP BY student_works.user_id ORDER BY score desc limit 0,4"

      better_students = User.find_by_sql(sql)

      # 找出在课程讨论区发帖回帖数最多的
      active_students = []
      sql1 = " select users.*,count(author_id)*2 active_count from messages " <<
          " LEFT JOIN users on messages.author_id = users.id " <<
          " where messages.board_id in (select id from boards where boards.course_id = #{course.id} ) " <<
          " GROUP BY messages.author_id ORDER BY count(author_id) desc " <<
          " limit 0,4"
      active_students = User.find_by_sql(sql1)

      if homework_count != 0  &&  !better_students.empty?
        latest_course_dynamics <<{:time=>"1970-01-01 0:0:0 +0800"}
      end
      unless active_students.empty?
        latest_course_dynamics <<{:time=>"1970-01-01 0:0:0 +0800"}
      end
        latest_course_dynamic = latest_course_dynamics.first
        unless latest_course_dynamic.nil?
          result << {:course_name => course.name,
                     :current_user_is_member => current_user.member_of_course?(course),
                     :current_user_is_teacher => is_course_teacher(current_user,course),
                     :course_id => course.id,
                     :course_img_url => url_to_avatar(course),
                     :course_time => course.time,
                     :course_term => course.term,
                     :news_count => notices_count,
                     :homework_count => homework_count,
                     :topic_count => topic_count,
                     :news => notices,
                     :homeworks => homeworkss,
                     :topics => topics,
                     :better_students => better_students,
                     :active_students => active_students,
                     :message => "",
                     :course_student_num=>course ? course.members.count : 0,
                     #:time_from_now=> distance_of_time_in_words(Time.now, latest_course_dynamic[:time].to_time) << "前",
                     :time_from_now=>time_from_now(latest_course_dynamic[:time].to_time), #.strftime('%Y-%m-%d %H:%M:%S').to_s,
                     :time=>latest_course_dynamic[:time].to_time}
        end

    end
    #返回数组集合
    result.sort! { |order, newer| newer[:time] <=> order[:time] }

    result
  end

  # 获取课程历次作业的学生总成绩
  def students_score_list params,current_user
    page = (params[:page] || 1)  - 1
    user_list = []
    max_size = 0
    if params[:type] == 1

      sql = "select users.*,ROUND(sum(student_works.final_score),2) score from student_works left outer join users on student_works.user_id = users.id" <<
          " where  homework_common_id in ( select id from homework_commons where homework_commons.course_id = #{params[:course_id]}) GROUP BY student_works.user_id ORDER BY score desc limit #{page*10},10"
      sql_count = " select count(distinct(student_works.user_id) ) " <<
                 " from student_works left outer join users on student_works.user_id = users.id " <<
                 " where homework_common_id in " <<
                 " ( select id from homework_commons where homework_commons.course_id = #{params[:course_id]}) "
      max_size  =  ActiveRecord::Base.connection().select_value(sql_count)
      user_list = User.find_by_sql(sql)
    else
      sql1 = " select users.*,count(author_id)*2 active_count from messages " <<
          " LEFT JOIN users on messages.author_id = users.id " <<
          " where messages.board_id in (select id from boards where boards.course_id = #{params[:course_id]} ) " <<
          " GROUP BY messages.author_id ORDER BY count(author_id) desc " <<
          " limit #{page*10},10"
      sql1_count = " select count(DISTINCT(messages.author_id))" <<
          " from messages LEFT JOIN users on messages.author_id = users.id " <<
          " where messages.board_id in (select id from boards where boards.course_id = #{params[:course_id]} )"
      max_size  =  ActiveRecord::Base.connection().select_value(sql1_count)
      user_list = User.find_by_sql(sql1)
    end
    {:user_list=>user_list,:max_size=>max_size}
  end

  # 获取某次作业的所有作业列表
  def student_work_list params,current_user
    is_teacher = current_user.allowed_to?(:as_teacher,Course.find(params[:course_id]))
    homework = HomeworkCommon.find(params[:homework_id])
    student_works = []
    #老师 || 非匿评作业 || 匿评结束 显示所有的作品
    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 || current_user.admin?
        student_works =  homework.student_works.page(params[:page] || 1).per(10).order("final_score desc ")
      else
        my_work = homework.student_works.where(:user_id => current_user.id)
        if my_work.empty?
          student_works = []
        else
          student_works =  homework.student_works.page(params[:page] || 1).per(10).order("final_score desc")
        end
      end
    else #学生
      if homework.homework_detail_manual.comment_status == 1 #未开启匿评，只显示我的作品
        student_works = homework.student_works.where(:user_id => current_user.id).page(params[:page] || 1).per(10)
      elsif homework.homework_detail_manual.comment_status == 2 #匿评列表，显示匿评作品和我的作品
        #is_evaluation = true
        my_work = homework.student_works.where(:user_id => current_user.id).page(params[:page] || 1).per(10)
        student_works = my_work + current_user.student_works_evaluation_distributions.map(&:student_work).select { |work| work.homework_common_id == homework.id}
      end
    end
    student_works
  end

  # 获取课程的讨论区信息
  def board_message_list params,current_user
    # 课程讨论区
    course = Course.find(params[:course_id])
    latest_message = course.boards.first.topics.page(params[:page] || 1).per(10)
  end

  #获取回复列表
  def board_message_reply_list params,current_user
    board = Board.find(params[:board_id])
    reply_list = board.topics.where("id = #{params[:msg_id]}").first.children.order("created_on desc").page(params[:page] || 1).per(10)
  end

  #回复讨论区
  def board_message_reply params,current_user
    author = Message.find(params[:parent_id]).author
    quote = "<blockquote>" << author.realname << "(" << author.nickname << ")写到： <br/>" << params[:quote] <<"<div class='cl'></div></blockquote>"
    reply = Message.new
    reply.author = current_user
    reply.board = Board.find(params[:board_id])
    params[:reply] = {}
    params[:reply][:subject] = params[:subject] #本回复标题
    params[:reply][:content] = params[:content]   #本回复内容
    params[:reply][:quote] = {}
    params[:reply][:quote][:quote] = params[:quote]  #本回复引用的内容，也是父id内容
    params[:reply][:parent_topic] = params[:parent_id]  # 父id
    params[:reply][:board_id] = params[:board_id]   #讨论区id
    params[:reply][:id] = params[:root_id] #根id
    reply.safe_attributes = params[:reply]
    if params[:root_id] == params[:parent_id]
      reply.content = reply.content
    else
      reply.content = quote + reply.content
    end

    Message.find(params[:root_id]).children << reply
    reply
  end

  # # 开启匿评
  # #statue 1:启动成功，2：启动失败，作业总数大于等于2份时才能启动匿评，3:已开启匿评，请务重复开启,4:没有开启匿评的权限
  # def start_anonymous_comment params,current_user
  #   homework = HomeworkCommon.find(params[:homework_id])
  #   return {:status=>4}  unless current_user.admin? || current_user.allowed_to?(:as_teacher,Course.find(params[:course_id]))
  #   return {:status=>5}   if Time.parse(homework.end_time.to_s).strftime("%Y-%m-%d") >= Time.now.strftime("%Y-%m-%d")
  #   homework_detail_manual = homework.homework_detail_manual
  #   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
  #   {:status => statue}
  # end
  #
  # def get_assigned_homeworks(student_works, n, index)
  #   student_works += student_works
  #   student_works[index + 1 .. index + n]
  # end

end

