#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 add_board(current_user, course_id, board_name)
    course = Course.find(course_id)
    raise "权限不足" unless current_user.has_teacher_role(course)

    position = 1
    last_board = ::Board.where(course_id: course.id).order('position desc').first
    if last_board.present?
      position = last_board.position+1
    end

    ::Board.create!(name: board_name,
                          description: board_name,
                          project_id: -1,
                          parent_id: 0,
                          topics_count: 0,
                          messages_count: 0,
                          position: position,
                          course_id: course.id
                          )
  end


  def edit_board(current_user, board_id, board_name)
    board = ::Board.find(board_id)
    raise "权限不足" unless current_user.has_teacher_role(board.course)

    board.name = board_name
    board.save!
    return board
  end


  def user_courses_list(current_user)
    courses = current_user.courses.not_deleted
    courses.inject([]) {|course_list, 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),
                      course_student_num: searchStudent(course).count
      }
    }
  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)))
    if current_user.nil?
      raise '403'
    end
    #@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)
      @members = searchmember_by_name(student_homework_score(0, c.id, 0, "desc"), "")
    else
      #@subPage_title = ''
      @members = c.member_principals.includes(:roles, :principal).all.sort
    end
    users = []
    @members.each do |m|
      img_url = "/images/" + 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

      role_ids = []
      m.roles.each do |r|
        role_ids << r.id
      end

      #双重身份 学生列表中不显示
      # unless (params[:role] == '2' && role_ids.length >= 2)
      # users << {:id => m.user.id,
      #           :img_url => img_url,
      #           :nickname => m.user.nickname,
      #           :gender => gender,
      #           :work_unit => work_unit, :mail => m.user.mail, :location => location,
      #           role_name: m.roles.first.name,
      #           name: m.user.show_name,
      #           roles_id: role_ids.include?(7) ? 7 : (role_ids.include?(9) ? 9 : 10),
      #           :brief_introduction => m.user.user_extensions.brief_introduction,
      #           :realname => m.user.realname,
      #           :is_me => current_user.id == m.user.id ? 1 : 0}
      # end
      #
      users << m.user

    end
    users
  end

  def reviewers_list course_id
    reviewers = []
    c = Course.find(course_id)

    if c
      messages = CourseMessage.where("course_id=? and course_message_type = 'JoinCourseRequest' and status = 0 ", course_id)

      messages.each do |m|
        user = User.find(m.course_message_id)

        if user
          img_url = url_to_avatar(user)
          gender = user.user_extensions.gender.nil? ? 0 : user.user_extensions.gender
          work_unit = get_user_work_unit user
          location = get_user_location user
          roles_ids = m.content.split(",")
          reviewers << {:id => user.id, :img_url => img_url, :nickname => user.nickname, :gender => gender,
                        :work_unit => work_unit, :mail => user.mail, :location => location,
                        role_name: "",
                        name: user.show_name,
                        roles_id: roles_ids.include?("7") ? 7 : 9,
                        :brief_introduction => user.user_extensions.brief_introduction, :realname => user.realname}
        end
      end

    end

    reviewers
  end

  def get_reviewer_info params
    status = -1
    info = nil
    c = Course.find(params[:course_id])
    if c
      messages = CourseMessage.where("course_id=? and course_message_id = ? and course_message_type = 'JoinCourseRequest' ", params[:course_id], params[:user_id]).last
      if messages
        #status  0未处理 1同意 2 通过
        status = messages.status
        user = User.find(params[:user_id])
        if user
          img_url = url_to_avatar(user)
          gender = user.user_extensions.gender.nil? ? 0 : user.user_extensions.gender
          work_unit = get_user_work_unit user
          location = get_user_location user
          roles_ids = messages.content.split(",")
          info = {:id => user.id, :img_url => img_url, :nickname => user.nickname, :gender => gender,
                  :work_unit => work_unit, :mail => user.mail, :location => location,
                  role_name: "",
                  name: user.show_name,
                  roles_id: roles_ids.include?("7") ? 7 : 9,
                  :brief_introduction => user.user_extensions.brief_introduction, :realname => user.realname}
        end
      end
    end

    {status: status, reviewer: info}
  end

  def deal_join_apply params, current_user
    status = -1
    message = ""

    c = Course.find(params[:course_id])

    if c
      messages = CourseMessage.where("course_id=? and course_message_id = ? and course_message_type = 'JoinCourseRequest' and status = 0 ", params[:course_id], params[:user_id]).first
      if messages
        apply_user = User.find(params[:user_id])
        ids = messages.content.split(",") #  content保存的是申请的职位角色
        integer_ids = []
        ids.each do |role_id|
          integer_ids << role_id.to_i
        end

        if params[:type] == 0

          if apply_user.member_of_course?(c)
            #将角色改为老师或者教辅
            member = c.members.where(:user_id => apply_user.id).all[0]
            member.role_ids = integer_ids
            #删除为学生的记录
            unless member.role_ids.include?(10)
              joined = StudentsForCourse.where('student_id = ? and course_id = ?', member.user_id, c.id)
              joined.each do |join|
                join.destroy
              end
            end

            member.course_group_id = 0
            member.save
            CourseMessage.create(:user_id => apply_user.id, :course_id => c.id, :viewed => false, :content => messages.content, :course_message_id => current_user.id, :course_message_type => 'CourseRequestDealResult', :status => 1)
            messages.update_attributes(:status => 1, :viewed => 1)
          else
            members = []
            members << Member.new(:role_ids => integer_ids, :user_id => apply_user.id)
            c.members << members
            CourseMessage.create(:user_id => apply_user.id, :course_id => c.id, :viewed => false, :content => messages.content, :course_message_id => current_user.id, :course_message_type => 'CourseRequestDealResult', :status => 1)
            messages.update_attributes(:status => 1, :viewed => 1)
          end
          if integer_ids.include?(9)
            message = "您已同意教师" + apply_user.show_name + ",加入班级"
            # send_wechat_join_class_notice apply_user,c,9,0
          else
            message = "您已同意助教" + apply_user.show_name + ",加入班级"
            # send_wechat_join_class_notice apply_user,c,7,0
          end
        else
          CourseMessage.create(:user_id => apply_user.id, :course_id => c.id, :viewed => false, :content => messages.content, :course_message_id => current_user.id, :course_message_type => 'CourseRequestDealResult', :status => 2)
          messages.update_attributes(:status => 2, :viewed => 1)
          if integer_ids.include?(9)
            message = "您已拒绝教师" + apply_user.show_name + ",加入班级"
            # send_wechat_join_class_notice apply_user,c,9,1
          else
            message = "您已拒绝助教" + apply_user.show_name + ",加入班级"
            # send_wechat_join_class_notice apply_user,c,7,1
          end
        end
        status = 0
      else
        message = "该申请不存在或已被处理"
      end
    else
      message = "该班级不存在或已被删除"
    end

    {:status => status, :message => message}
  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.reorder("created_on desc")
    @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])
    course.generate_invite_code
    course.generate_qrcode

    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
    groupnum = 0
    groupnum = course.course_groups.length if course.course_groups
    {:course => course, :syllabus_title => course.syllabus.nil? ? "" : course.syllabus.title, :work_unit => work_unit, :img_url => "/images/" + url_to_avatar(course), :current_user_is_member => current_user.nil? ? false : current_user.member_of_course?(course), :current_user_is_teacher => current_user.nil? ? false : is_course_teacher(current_user, course), :course_student_num => course ? course.student.count.to_s : 0, :groupnum => groupnum}
  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]:学时总数
  #params[:course][:publish_resource]允许学生上传资源
  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.password = params[:course][:password]
      @course.name = params[:course][:name]
      @course.tea_id = current_user.id
      #@course.syllabus_id = params[:syllabus_id].to_i
      #@course.term = params[:term]
      #@course.time = params[:time]
      #@course.end_term = params[:end_term]
      #@course.end_time = params[:end_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[:period].to_i if params[:period]
      @course.credit = params[:credit] if params[:credit]
      @course.end_date = params[:end_date] if params[:end_date]
      params[:course][:is_public] ? @course.is_public = 1 : @course.is_public = 0
      @course.open_student = 0
      @course.publish_resource = 1
      if CourseList.where(:name => params[:course][:course_list].strip).count > 0
        @course.course_list_id = CourseList.where(:name => params[:course][:course_list].strip).first.id
      else
        course_list = CourseList.create(:name => params[:course][:course_list].strip, :user_id => User.current.id, :is_admin => 0)
        @course.course_list_id = course_list.id
      end

    else

    end

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

    if @course && @course.save
      #copy_avatar(@course, @course.syllabus)
      #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 copy_a_course origin_course
    ActiveRecord::Base.transaction do
      course = Course.new(:name => origin_course.name, :tea_id => User.current.id, :school_id => User.current.user_extensions.school_id, :class_period => origin_course.class_period, :credit => origin_course.credit, :end_date => Date.new() + 6 * 30,
                          :is_public => 0, :course_list_id => origin_course.course_list_id, :is_copy => origin_course.id)
      course.extra = 'course' + DateTime.parse(Time.now.to_s).strftime('%Y-%m-%d_%H-%M-%S').to_s
      if course.save
        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.members << m
        course.course_infos << CourseInfos.new(:user_id => current_user.id, :course_id => course.id)

        # 作业复制
        origin_course.homework_commons.where(:homework_type => [1, 3, 4]).each do |homework|
          new_homework = HomeworkCommon.new(:name => homework.name, :user_id => User.current.id, :description => homework.description, :homework_type => homework.homework_type, :late_penalty => 5,
                                            :course_id => course.id, :teacher_priority => 1, :anonymous_comment => 1, :quotes => 0, :is_open => 0, :homework_bank_id => homework.homework_bank_id, :score_open => 1,
                                            :anonymous_appeal => 0, :is_public => 0, :reference_answer => homework.reference_answer, :answer_public => 1, :allow_late => 1)

          new_homework.homework_detail_manual = HomeworkDetailManual.new(:te_proportion => 1.0, :ta_proportion => 0, :comment_status => 0, :evaluation_num => 0, :absence_penalty => 0)
          new_homework_detail_manual = new_homework.homework_detail_manual
          homework.attachments.each do |attachment|
            att = attachment.copy
            att.container_id = nil
            att.container_type = nil
            att.author_id = homework.user_id
            att.copy_from = attachment.id
            att.save
            new_homework.attachments << att
            attachment.update_attributes(:quotes => attachment.quotes.to_i + 1)
          end
          if new_homework.homework_type == 3
            new_homework.homework_detail_group = HomeworkDetailGroup.new
            new_homework_detail_group = new_homework.homework_detail_group
            new_homework.homework_detail_group.min_num = homework.homework_detail_group.min_num
            new_homework.homework_detail_group.max_num = homework.homework_detail_group.max_num
            new_homework.homework_detail_group.base_on_project = homework.homework_detail_group.base_on_project
          end

          if new_homework.save
            if new_homework.homework_type == 4
              HomeworkCommonsShixuns.create(:homework_common_id => new_homework.id, :shixun_id => homework.homework_commons_shixuns.shixun_id)
              create_shixun_homework_cha_setting new_homework, homework.shixuns.first
            end
            new_homework_detail_manual.save if new_homework_detail_manual
            new_homework_detail_group.save if new_homework_detail_group
            homework.update_column(:quotes, homework.quotes.to_i + 1)
            if homework.homework_bank
              homework.homework_bank.update_column(:quotes, homework.homework_bank.quotes.to_i + 1)
              QuestionBank.where(:container_id => homework.homework_bank_id, :container_type => ["Common", "Shixun"]).update_all(:quotes => homework.homework_bank.quotes)
            end
          end
        end

        # 试卷复制
        origin_course.exercises.each do |exercise|
          new_exercise = Exercise.new(:exercise_name => exercise.exercise_name, :exercise_description => exercise.exercise_description, :user_id => User.current.id, :is_public => 0,
                                      :exercise_status => 1, :show_result => 1, :course_id => course.id, :time => -1, :exercise_bank_id => exercise.exercise_bank_id)

          exercise.exercise_questions.each do |q|
            option = {
                :question_title => q[:question_title],
                :question_type => q[:question_type] || 1,
                :question_number => q[:question_number],
                :question_score => q[:question_score]
            }
            exercise_question = new_exercise.exercise_questions.new option

            for i in 1..q.exercise_choices.count
              choice_option = {
                  :choice_position => i,
                  :choice_text => q.exercise_choices[i - 1][:choice_text]
              }
              exercise_question.exercise_choices.new choice_option
            end

            for i in 1..q.exercise_standard_answers.count
              standard_answer_option = {
                  :exercise_choice_id => q.exercise_standard_answers[i - 1][:exercise_choice_id],
                  :answer_text => q.exercise_standard_answers[i - 1][:answer_text]
              }
              exercise_question.exercise_standard_answers.new standard_answer_option
            end
          end
          if new_exercise.save
            if exercise.exercise_bank
              exercise.exercise_bank.update_column(:quotes, exercise.exercise_bank.quotes.to_i + 1)
              QuestionBank.where(:container_id => exercise.exercise_bank_id, :container_type => "Exercise").update_all(:quotes => exercise.exercise_bank.quotes)
            end
          end
        end

        # 问卷复制
        origin_course.polls.each do |poll|
          new_poll = Poll.new(:polls_name => poll.polls_name, :polls_description => poll.polls_description, :user_id => User.current.id, :is_public => 0,
                              :polls_status => 1, :show_result => 1, :course_id => course.id, :exercise_bank_id => poll.exercise_bank_id)

          poll.poll_questions.each do |q|
            option = {
                :question_title => q[:question_title],
                :question_type => q[:question_type] || 1,
                :is_necessary => q[:is_necessary],
                :question_number => q[:question_number],
                :max_choices => q[:max_choices],
                :min_choices => q[:min_choices]
            }
            poll_question = new_poll.poll_questions.new option

            for i in 1..q.poll_answers.count
              choice_option = {
                  :answer_position => i,
                  :answer_text => q.poll_answers[i - 1][:answer_text]
              }
              poll_question.poll_answers.new choice_option
            end
          end
          if new_poll.save
            if poll.exercise_bank
              poll.exercise_bank.update_column(:quotes, poll.exercise_bank.quotes.to_i + 1)
              QuestionBank.where(:container_id => poll.exercise_bank_id, :container_type => "Poll").update_all(:quotes => poll.exercise_bank.quotes)
            end
          end
        end

        # 资源复制
        origin_course.attachments.each do |attachment|
          attach_copied_obj = attachment.copy
          attach_copied_obj.tag_list.add(attachment.tag_list) # tag关联
          attach_copied_obj.container = course
          attach_copied_obj.created_on = Time.now
          attach_copied_obj.publish_time = nil
          attach_copied_obj.author_id = User.current.id
          attach_copied_obj.copy_from = attachment.copy_from.nil? ? attachment.id : attachment.copy_from
          attach_copied_obj.is_publish = 0
          if attach_copied_obj.attachtype == nil
            attach_copied_obj.attachtype = 4
          end
          attach_copied_obj.save
          update_quotes attach_copied_obj
        end
      end
      {:course => course}
    end
  end

  def update_quotes attachment
    if attachment.copy_from
      attachments = Attachment.find_by_sql("select * from attachments where copy_from = #{attachment.copy_from} or id =  #{attachment.copy_from}")
    else
      attachments = Attachment.find_by_sql("select * from attachments where copy_from = #{attachment.id} or id = #{attachment.copy_from}")
    end
    attachment.quotes = get_qute_number attachment
    attachment.save
    attachments.each do |att|
      att.quotes = attachment.quotes
      att.save
    end
  end

  def get_qute_number attachment
    if attachment.copy_from
      result = Attachment.find_by_sql("select count(*) as number from attachments where copy_from = #{attachment.copy_from}")
    else
      result = Attachment.find_by_sql("select count(*) as number from attachments where copy_from = #{attachment.id}")
    end
    if result.nil? || result.count <= 0
      return 0
    else
      return result[0].number
    end
  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]:学时总数
  #params[:publish_resource] 允许学生上传资源 0 不允许 1 允许
  def edit_course(params, course, current_user)
    course.send(:safe_attributes=, params[:course], current_user)
    #course.safe_attributes = params[:course]
    #course.password = params[:course][:password]
    course.name = params[:course][:name]
    #course.tea_id = current_user.id
    #course.syllabus_id = params[:syllabus_id].to_i
    #course.time = params[:time]
    #course.term = params[:term]
    #course.end_time = params[:end_time]
    #course.end_term = params[:end_term]
    course.class_period = params[:period].to_i if params[:period]
    course.credit = params[:credit] if params[:credit]
    course.end_date = params[:end_date] if params[:end_date]
    course.show_unit = params[:course][:show_unit] ? 1 : 0
    if course.is_end && (course.end_date.nil? || course.end_date > Date.today)
      course.is_end = 0
      Tiding.where(:container_id => course.id, :container_type => "ArchiveCourse").destroy_all
    elsif !course.is_end && course.end_date.present? && course.end_date < Date.today
      course.is_end = 1
    end
    params[:course][:is_public] ? course.is_public = 1 : course.is_public = 0
    if CourseList.where(:name => params[:course][:course_list].strip).count > 0
      course.course_list_id = CourseList.where(:name => params[:course][:course_list].strip).first.id
    else
      course_list = CourseList.create(:name => params[:course][:course_list].strip, :user_id => User.current.id, :is_admin => 0)
      course.course_list_id = course_list.id
    end
    if course.save
      if params[:course][:is_public]
        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)
      else
        course_status = CourseStatus.find_by_course_id(course.id)
        course_status.destroy if course_status
      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)}
    {:course => 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).first
    if @member.nil?
      @state = 1
      return @state
    end
    student_role = @member.member_roles.where("role_id = 10").first
    teacher_role = @member.member_roles.where("role_id = 7 || role_id = 9").first
    ActiveRecord::Base.transaction do
      if @member.member_roles.count > 1 && student_role && teacher_role
        student_role.destroy
        teacher_role.update_attribute("is_current", 1)
        @member.update_attribute("course_group_id", 0)
      else
        @member.destroy
      end
      joined = StudentsForCourse.where('student_id = ? and course_id = ?', user.id, params[:object_id])
      joined.destroy_all
    end
    @state = 0
    @state
  end

  class JoinCourseError < Errors
    define_error [
                     0, '加入成功',
                     1, '密码错误',
                     2, '班级已过期 请联系班级管理员重启班级。',
                     3, '您已经是该班级的成员了',
                     4, '您的邀请码不正确',
                     5, '您还未登录',
                     6, '您的申请已提交,请等待管理员审批',
                     7, '您已经发送过申请了,请耐心等待',
                     8, '您已经是该班级的教师了',
                     9, '您已经是该班级的教辅了',
                     10, '您已经是该班级的管理员了',
                     11, '该班级不存在或已被删除啦',
                     12, '您已经发送过申请了,请耐心等待',
                     13, '您的申请已提交,请等待管理员审批',
                     '未知错误,请稍后再试'
                 ]
  end
  #加入课程
  #object_id:课程id
  #course_password :加入课程的密码
  def join_course params, current_user
    course = Course.find_by_invite_code(params[:invite_code]) if params[:invite_code]

    @state = 10
    if course
      if course_endTime_timeout? course
        @state = 2
      elsif course[:is_delete] == 1
        @state = 11
      else
        if current_user.member_of_course?(course) #如果已经是成员
          member = course.members.where("user_id=#{current_user.id} and course_id=#{course.id}")[0]
          roleName = member.roles[0].name if member
          if params[:invite_code].present?
            #如果加入角色为学生 并且当前是学生
            if roleName == "Student"
              @state = 3
              #如果加入的角色为老师,并且当前已经是老师
            elsif roleName == "Teacher"
              @state = 8
              #如果加入的角色教辅并且当前为教辅
            elsif roleName == "TeachingAsistant"
              @state = 9
            elsif roleName == "Manager"
              @state = 10
            end
          else
            @state = 1
          end
        else
          if params[:invite_code].present?
            members = []
            members << Member.new(:role_ids => [10], :user_id => current_user.id)
            course.members << members
            StudentsForCourse.create(:student_id => current_user.id, :course_id => course.id)
            @state = 0
          else
            @state = 1
          end
        end
      end
    else
      @state = 4
    end
    {:state => @state, :course => course}
  end

  #加入班级结果
  # def send_wechat_join_class_notice user,course,role_id,result
  #   count = ShieldWechatMessage.where("container_type='User' and container_id=#{user.id} and shield_type='Course' and shield_id=#{course.id}").count
  #   if count == 0
  #     ws = WechatService.new
  #
  #     role_name = role_id == 7 ? "助教" : role_id == 9 ? "教师" : "学生"
  #     result_name = result == 0 ? "通过" : "被拒绝"
  #     content = "您以"+role_name+"身份加入班级的申请已"+result_name+"。"
  #
  #     if result == 0
  #       title = "恭喜您加入班级成功。"
  #       remark = "点击查看班级详情。"
  #       uid = 0
  #       type = "class"
  #     else
  #       title = "很遗憾您未能成功加入班级。"
  #       remark = "点击查看申请详情。"
  #       uid = user.id
  #       type = "review_class_member"
  #     end
  #
  #     name = course.course_list.nil? ? course.name : course.course_list_name+" • "+course.name
  #     ws = WechatService.new
  #     ws.class_notice user.id, type, course.id, title,name, user.show_name, format_time(Time.now), content, remark,uid
  #
  #   end
  # end

  #多个角色加入课程
  def join_course_roles params, current_user
    course = Course.find_by_invite_code(params[:invite_code].strip) if params[:invite_code]
    unless course
      course_group = CourseGroup.find_by_invite_code(params[:invite_code].strip) if params[:invite_code]
      course = course_group.course if course_group
    end
    go_coursegroup_flag = 0
    course_id = 0

    @state = 10
    if course
      if course_endTime_timeout? course
        @state = 2
      elsif course[:is_delete] == 1
        @state = 11
      elsif course[:invite_code_halt] == 1
        @state = 14
      else
        role_ids = params[:role]
        if current_user.member_of_course?(course) #如果已经是成员
          member = course.members.where("user_id=#{current_user.id}").first
          roleName = member.roles.map{|role| role.name}.join(",") if member
          if course_group.present? && roleName.include?("Student")
            member.update_attributes(:course_group_id => course_group.id)
          end

          #如果加入角色为学生 并且当前是学生
          if role_ids.include?("10") && role_ids.length == 1 && roleName.include?("Student")
            @state = 16
            #如果加入的角色为老师,并且当前已经是老师
          elsif role_ids.include?("9") && role_ids.length == 1 && roleName.include?("Teacher")
            @state = 8
            #如果加入的角色教辅并且当前为教辅
          elsif role_ids.include?("7") && role_ids.length == 1 && roleName.include?("TeachingAsistant")
            @state = 9
          elsif roleName == "Manager"
            @state = 10
            #如果加入角色为教师或者教辅,并且当前是学生
          elsif (role_ids.include?("7") || role_ids.include?("9")) && roleName == "Student"
            #如果已经发送过消息了,那么就要给个提示
            if CourseMessage.where("course_message_type = 'JoinCourseRequest' and user_id = #{course.tea_id} and content = '#{role_ids.include?("9") ? 9 : 7}' and course_message_id = #{User.current.id} and course_id = #{course.id} and status = 0 ").count != 0
              @state = 7
            else
              # Mailer.run.join_course_request(course, User.current, params[:role])
              course_message = CourseMessage.create(:user_id => course.tea_id, :course_id => course.id, :viewed => false,:content=> role_ids.include?("9") ? 9 : 7,:course_message_id=>User.current.id,:course_message_type=>'JoinCourseRequest',:status=>0)
              if CourseActivity.where(:course_act_type => 'JoinCourse', :user_id => User.current.id, :course_id => course.id, :course_act_id => course_message.id).count == 0
                CourseActivity.create(:course_act_type => 'JoinCourse', :user_id => User.current.id, :course_id => course.id, :course_act_id => course_message.id)
              end
              @state = 6
            end
            #如果加入角色是学生,但是是当前课程的教师或者教辅
          elsif role_ids.include?("10") && !roleName.include?("Student")
            member.role_ids = member.role_ids + [10]
            member.course_group_id = course_group.try(:id).to_i if course_group.present?
            member.save
            StudentsForCourse.create(:student_id => current_user.id, :course_id => course.id)
            @state = 0
          else
            @state = 3
          end
        else
          if role_ids.include?("10") && !role_ids.include?("7") && !role_ids.include?("9")
            members = []
            members << Member.new(:role_ids => [10], :user_id => current_user.id, :course_group_id => course_group.try(:id).to_i)
            course.members << members
            StudentsForCourse.create(:student_id => current_user.id, :course_id => course.id)
            @state = 0
            go_coursegroup_flag = 1 if course.course_groups
            course_id = course.id
            # send_wechat_join_class_notice current_user,course,10,0
          else
            is_stu = false
            if role_ids.include?("10")
              members = []
              members << Member.new(:role_ids => [10], :user_id => current_user.id, :course_group_id => course_group.try(:id).to_i)
              course.members << members
              StudentsForCourse.create(:student_id => current_user.id, :course_id => course.id)
              is_stu = true
              go_coursegroup_flag = 1 if course.course_groups
              course_id = course.id
              # send_wechat_join_class_notice current_user,course,10,0
            end

            #如果已经发送过消息了,那么就要给个提示
            if CourseMessage.where("course_message_type = 'JoinCourseRequest' and user_id = #{course.tea_id} and content = '#{role_ids.include?("7") ? 7 : 9}' and course_message_id = #{current_user.id} and course_id = #{course.id} and status = 0").count != 0
              course_message = CourseMessage.where("course_message_type = 'JoinCourseRequest' and user_id = #{course.tea_id} and content = '#{role_ids.include?("7") ? 7 : 9}' and course_message_id = #{current_user.id} and course_id = #{course.id} and status = 0").first
              if is_stu
                @state = 12
              else
                @state = 7
              end
            else
              # Mailer.run.join_course_request(course, current_user, params[:role])
              course_message = CourseMessage.create(:user_id => course.tea_id, :course_id => course.id, :viewed => false, :content => role_ids.include?("7") ? 7 : 9, :course_message_id => current_user.id, :course_message_type => 'JoinCourseRequest', :status => 0)

              #----------------微信通知----------------------

              # if role_ids.include?("7") || role_ids.include?("9")
              #   tea_user = User.find(course.tea_id)
              #   count = ShieldWechatMessage.where("container_type='User' and container_id=#{tea_user.id} and shield_type='Course' and shield_id=#{course.id}").count
              #   if count == 0
              #
              #     rolename = role_ids.include?("7") ? "助教" : "教师"
              #     content = current_user.show_name + "申请以"+rolename+"身份加入班级,等待您的审批。"
              #     name = course.course_list.nil? ? course.name : course.course_list_name+" • "+course.name
              #     ws = WechatService.new
              #     ws.class_notice tea_user.id, "review_class_member", course.id, "班级成员审批通知。", name, tea_user.show_name, format_time(Time.now), content, "点击查看申请详情。",current_user.id
              #   end
              # end
              #--------------------------------------------

              if is_stu
                @state = 13
              else
                @state = 6
              end
            end
            # 创建动态
            if role_ids.include?("7") || role_ids.include?("9")
              if CourseActivity.where(:course_act_type => 'JoinCourse', :user_id => User.current.id, :course_id => course.id, :course_act_id => course_message.id).count == 0
                CourseActivity.create(:course_act_type => 'JoinCourse', :user_id => User.current.id, :course_id => course.id, :course_act_id => course_message.id)
              end
            end
          end
        end
      end
    else
      @state = 4
    end
    {:state => @state, :course => course, :go_coursegroup_flag => go_coursegroup_flag, :course_id => course_id}
  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.where("publish_time <= ?", Time.now).page(params[:page] || 1).per(20).reorder('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.where("is_publish = 1").reorder("created_on desc")
    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.destroy
    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.destroy
    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
    state = get_homework_state(bid)
    # 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.student_works.count - bid.student_works.all_commit.count,
     :homework_submit_num => bid.student_works.all_commit.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?,
     :current_user_is_teacher => is_course_teacher,
     ##学生提交作业的状态 0 未提交  1 已提交
     :status => bid.student_works.where(user_id: current_user).first.try(:work_status).to_i,
     :homework_type => bid.homework_type
    }

  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, sort_type = 'score')
    sql_select = ""
    if groupid == 0
      sql_select = "SELECT members.*,(
          SELECT SUM(student_works.work_score)
          FROM student_works,homework_commons
          WHERE student_works.homework_common_id = homework_commons.id
          AND homework_commons.course_id = course_id
          AND student_works.user_id = members.user_id
        ) AS score,(SELECT (message_num*2 + message_reply_num*1 + news_reply_num*1 + news_num*1 +
         resource_num*5 + journal_num*1 + homework_journal_num*1 ) FROM `course_contributor_scores` AS ccs WHERE ccs.course_id = #{course_id} AND ccs.user_id = members.user_id
        ) AS act_score
        FROM members
        JOIN students_for_courses
        ON students_for_courses.student_id = members.user_id AND students_for_courses.course_id = members.course_id
        WHERE members.course_id = #{course_id} ORDER BY #{sort_type} #{score_sort_by}"
    else
      sql_select = "SELECT members.*,(
          SELECT SUM(student_works.work_score)
          FROM student_works,homework_commons
          WHERE student_works.homework_common_id = homework_commons.id
          AND homework_commons.course_id = #{course_id}
          AND student_works.user_id = members.user_id
        ) AS score,(SELECT (message_num*2 + message_reply_num*1 + news_reply_num*1 + news_num*1 +
         resource_num*5 + journal_num*1 + homework_journal_num*1 ) FROM `course_contributor_scores` AS ccs WHERE ccs.course_id = #{course_id} AND ccs.user_id = members.user_id
        ) AS act_score
        FROM members
        JOIN students_for_courses
        ON students_for_courses.student_id = members.user_id AND students_for_courses.course_id = members.course_id
        WHERE members.course_id = #{course_id} AND members.course_group_id = #{groupid} ORDER BY #{sort_type} #{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_all_messages params, user
    topics = Board.find(params[:board_id]).topics.page(params[:page]).page(params[:page] || 1).per(10)
    return nil unless topics.present?

    #取子评论
    comments = []
    topics.each do |topic|
      comments << {topic: topic, comments: Message.where(root_id: topic.id)}
    end

    comments
  end

  def topic_all_messages params, user
    topic = Message.find(params[:topic_id])
    {topic: topic, comments: Message.where(root_id: topic.id)}
  end

  #回复讨论区
  def board_message_reply params, current_user
    reply = Message.new
    reply.author_id   = current_user.id
    reply.board_id    = params[:board_id]
    reply.subject  = params[:title]
    reply.content  = params[:content] #本回复内容
    reply.parent_id = params[:reply_id] # 父id
    reply.reply_id  = params[:reply_id] #根id
    reply.root_id = params[:root_id]

    unless reply.subject.present?
      reply.subject = params[:content]
    end

    if reply.parent_id.nil? || reply.parent_id == 0
      reply.parent_id = params[:root_id]
    end

    if reply.board_id == 0 #回帖时可以不传board_id
      parent_msg = Message.find(reply.parent_id)
      reply.board_id = parent_msg.board_id
    end

    reply.save!

    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

  #修改班级成员角色
  def modify_user_course_role params, roles_id
    status = -1

    c = Course.find("#{params[:id]}")

    # member = c.member_principals.includes(:roles, :principal).where("user_id=?",params[:user_id]).first
    member = c.members.where("user_id=?", params[:user_id]).first

    if member
      member.role_ids = roles_id

      role = Role.find(roles_id[0])

      # 这里的判断只能通过角色名,可以弄成常量
      if roles_id && roles_id.include?(10)
        StudentsForCourse.create(:student_id => params[:user_id], :course_id => params[:id])
      else
        joined = StudentsForCourse.where('student_id = ? and course_id = ?', params[:user_id], params[:id])
        joined.each do |join|
          join.destroy
        end
        member.course_group_id = 0
      end
      if role.allowed_to?(:is_manager)
        courseInfo = CourseInfos.new(:user_id => params[:user_id], :course_id => params[:id])
        courseInfo.save
      else
        user_admin = CourseInfos.where("user_id = ? and course_id = ?", params[:user_id], params[:id])
        if user_admin.size > 0
          user_admin.each do |user|
            user.destroy
          end
        end
      end

      Role.givable.all[3..5]

      if member.save
        status = 0
      end
    end
    status
  end

  #删除班级成员
  def delete_course_member course, user_id, current_user
    if current_user.nil?
      state = -1
      return state
    end

    member = course.members.where("user_id=?", user_id).first

    if member != nil
      member.destroy
      user_admin = CourseInfos.where("user_id = ? and course_id = ?", member.user_id, course.id)
      if user_admin.size > 0
        user_admin.each do |user|
          user.destroy
        end
      end
      joined = StudentsForCourse.where('student_id = ? and course_id = ?', member.user_id, course.id)
      joined.each do |join|
        join.destroy
      end
      roles = Role.givable.all[3..5]
      #移出课程发送消息
      CourseMessage.create(:user_id => member.user_id, :course_id => course.id, :course_message_type => "RemoveFromCourse", :viewed => false, :course_message_id => current_user.id)
      return 0
    else
      return 1
    end
  end

end