# encoding: utf-8
#
# Redmine - project management software
# Copyright (C) 2006-2013  Jean-Philippe Lang
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.



include AvatarHelper
module UsersHelper
  def homework_bank_json_data homeworks
    homeworks.map do |homework|
      homework_path = homework_bank_path(homework)
      course_list = homework.course_list.name
      user_name = homework.user.show_real_name
      user_path = user_path(homework.user)
      homework.attributes.dup.except("description", "language", "standard_code", "min_num", "max_num", "base_on_project", "applicable_syllabus", "homework_common_id",
                                 "created_at", "updated_at", "reference_answer", "syllabus_id", "major_level", "discipline_category_id", "first_level_discipline_id").merge({
                                                                                                                  user_name: user_name,
                                                                                                                  user_path: user_path,
                                                                                                                  course_list: course_list,
                                                                                                                  homework_path: homework_path
                                                                                                              })
    end
  end

  def users_status_options_for_select(selected)
    user_count_by_status = User.count(:group => 'status').to_hash
    options_for_select([[l(:label_all), ''],
                        ["#{l(:status_active)} (#{user_count_by_status[1].to_i})", '1'],
                        ["#{l(:status_registered)} (#{user_count_by_status[2].to_i})", '2'],
                        ["#{l(:status_locked)} (#{user_count_by_status[3].to_i})", '3']], selected.to_s)
  end

  def task_count(unsolved_issues_count, unfinished_homework_count, unfinished_test_count, unfinished_poll_count, anonymous_evaluation_count, unapproval_homework)
    result = unsolved_issues_count + unfinished_homework_count + unfinished_test_count + unfinished_poll_count + anonymous_evaluation_count + unapproval_homework
  end

  # 判断某个时间再多少天前
  # params[:num] 天数
  def many_days_ago time, num
    time > Time.now - 86400 * num
  end

  def issue_list(issues, &block)
    ancestors = []
    issues.each do |issue|
      while (ancestors.any? && !issue.is_descendant_of?(ancestors.last))
        ancestors.pop
      end
      yield issue, ancestors.size
      ancestors << issue unless issue.leaf?
    end
  end

  # 我的issue 来源
  def options_for_issue_project_list( issues )
    issues = issues.group_by{|issue| issue.project_id}
    issues.map{ |issue| [Project.find(issue[0]).name, issue[0]]}.unshift(["来源", 0])
  end

  # 我的issue指派给我
  def options_for_my_issue_list(issues)
   # issues = issues.group_by{|issue| issue.assigned_to_id }
   # issues.map{ |issue| [User.find(issue[0]).show_name, issue[0]]}.unshift(["指派给", 0])

  end

  # 作业待匿评的次数
  def work_anonymous_num homework
    # student_work_ids = StudentWork.where(:homework_common_id => homework.id)
    # total_eva_count = StudentWorksEvaluationDistribution.where(:student_work_id => student_work_ids).count
    # already_eva_count = StudentWorksScore.where("SELECT * FROM (SELECT * FROM student_works_scores WHERE student_work_id in #{student_work_ids} AND reviewer_role = 3 ) AS t GROUP BY user_id")
    # unfinished_eva_count = total_eva_count - already_eva_count
  end

  def resource_json_data attachments
    attachments.map do |attach|
      user_name = attach.author.show_real_name
      create_time = format_date(attach.created_on)
      file_size = (number_to_human_size(attach.filesize)).gsub("ytes", "")
      resource_type = get_resource_type(attach.container_type)
      atta_path = download_named_attachment_path(attach.id, attach.filename)
      atta_name = truncate(attach.filename, :length => 30)
      attach.attributes.dup.except("container_id", "container_type", "disk_filename", "filesize", "content_type",
                                   "digest", "downloads", "author_id", "created_on", "description", "disk_directory").merge({
                                                                                                                                user_name: user_name,
                                                                                                                                create_time: create_time,
                                                                                                                                file_size: file_size,
                                                                                                                                resource_type: resource_type,
                                                                                                                                atta_path: atta_path,
                                                                                                                                atta_name: atta_name,
                                                                                                                            })
    end
  end

  def get_resource_type type
    case type
      when 'Course'
        '班级资源'
      when 'Project'
        '项目资源'
      when 'Issue'
        '缺陷附件'
      when 'Message'
        '讨论区附件'
      when 'Document'
        '文档附件'
      when 'News'
        '通知附件'
      when 'HomewCommon'
        '作业附件'
      when 'StudentWorkScore'
        '批改附件'
      when 'Principal'
        '用户资源'
      when 'OrgSubfield'
        '组织资源'
    end
  end

  # 作业类型提示
  def homework_type_tip homework_type
    case homework_type
      when 1
        "普通作业"
      when 2
        "编程作业"
      when 3
        "分组作业"
    end
  end

  # 当前用户在某个作业中的待匿评数
  def homework_evaluation_num homework
    student_works = homework.student_works.has_committed
    count = User.current.student_works_evaluation_distributions.where(:student_work_id => student_works.map(&:id)).count -
        User.current.student_works_scores.where(:reviewer_role => 3, :student_work_id => student_works.map(&:id)).group_by(&:student_work_id).count
    count
  end

  # 获取消息角色
  def applied_project_message_type role
    case role
      when 3
        "管理员"
      when 4
        "开发人员"
      when 5
        "报告人员"
    end
  end

  # 获取pullrequest消息状态
  def pull_request_message_status ma
    case ma.status
      when 1
        "创建了PullRequest:"
      when 2
        "接受了PullRequest:"
      when 3
        "重新打开了PullRequest:"
      when 4
        "关闭了PullRequest:"
    end

  end

  # 项目申请消息通过状态判断用户
  # status(1:申请的消息;2:已操作过该消息(包括同意或者拒绝,消息状态更新);3:拒绝消息;4:被拒人收到消息;5:拒绝者收到消息;6:同意后申请人收到消息;7:同意后批准人收到消息)
  def applied_project_users applied_message
    # case applied_message.status
    #   when 3,2,1,5,4,7,6
    user = User.find(applied_message.applied_user_id)
    # end
  end

  def applied_project_status applied_message
    case applied_message.status
      when 4
        "被拒绝"
      when 5
        "已拒绝"
      when 6
        "已通过"
      when 7
        "已同意"
    end
  end

  # 项目申请消息通过状态判断tip描述
  def applied_project_tip applied_message
    case applied_message.status
      when 4
        "拒绝申请加入:"
      when 5,3,2,1,7
        "申请加入:"
      when 6
        "同意申请加入:"
    end
  end

  # 单位申请消息:通过用户的状态判断
  # status(0:申请消息;1,2,3:系统消息)
  def applied_school_users applied_message
    user = User.find(applied_message.applied_user_id)
  end

  # 单位申请消息通过状态判断tip描述
  def applied_school_tip applied_message
    case applied_message.status
      when 1,2,3
        "您添加新的单位:"
      when 0
        "申请了单位:"
    end
  end

  def is_current_user
    is_current_user = (User.current == @user)
  end

  def applied_project_tip_header applied_message
    case applied_message.status
      when 4
        "婉拒您"
      when 5,3,2,1,7
        "申请:"
      when 6
        "同意您"
    end
  end



  def get_resource_origin attach
    type = attach.container_type
    content = attach.container
    unless content.nil?
      case type
        when 'Course'
          result = current_time_and_term_resource content
        when 'Project'
          result = content.name
        when 'Issue'
          result = content.subject
        when 'Message'
          result = content.subject
        when 'News'
          result = content.title
        when 'HomewCommon'
          result = content.name
        when 'StudentWorkScore'
          result = content.name
        when 'Principal'
          result = content.name
        when 'OrgSubfield'
          result = content.name
      end
    end
  end

  def current_time_and_term_resource course
    str = course.syllabus.title + "<span class='fb'> · </span>"
    term = cur_course_term_resource
    name = course.name
    if (course.time == course.end_time && course.term == course.end_term) || (course.end_term.nil? && course.end_time.nil?) || course.time > Time.now.year
      str = str + name + "(" + course.time.to_s + course.term.to_s + ")"
    elsif course.time == Time.now.year && set_term_value(cur_course_term) <= set_term_value(course.term)
      str = str + name + "(" + course.time.to_s + course.term.to_s + ")"
    elsif course.end_time < Time.now.year || (course.end_time == Time.now.year && set_term_value(cur_course_term) >= set_term_value(course.term))
      str = str + name + "(" + course.end_time.to_s + course.end_term.to_s + ")"
    else
      str = str + name + "(" + Time.now.year.to_s + cur_course_term_resource.to_s + ")"
    end
    str
  end

  def cur_course_term_resource
    month = Time.now.month
    if month >= 9 || month < 2
      term = "秋"
    elsif (month >= 7 && Time.now.day >= 15) || month == 8
      term = "夏"
    else
      term = "春"
    end
    term
  end

  def title_for_message type
    case type
      when nil
        '消息'
      when 'unviewed'
        '未读消息'
      when 'apply'
        '用户申请'
      when 'system_messages'
        '系统消息'
      when 'homework'
        '作业消息'
      when 'course_message'
        '班级讨论'
      when 'course_news'
        '班级通知'
      when 'poll'
        '班级问卷'
      when 'issue'
        '项目任务'
      when 'forge_message'
        '项目讨论'
      when 'forge_news'
        '项目新闻'
      when 'forum'
        '贴吧帖子'
      when 'user_feedback'
        '用户留言'
    end
  end

  def link_to_user_version(version, options = {})
    return '' unless version && version.is_a?(Version)
    link_to_if version.visible?, format_version_name(version), { :controller => 'versions', :action => 'show', :id => version }, :class => "linkBlue"
  end

  # 统计未读消息数
  def unviewed_message(user)
    courses = user.courses.where("is_delete = 1")
    course_ids = courses.empty? ? "(-1)" : "(" + courses.map{|course| course.id}.join(",") + ")"
    course_count = CourseMessage.where("user_id =? and viewed =? and course_id not in #{course_ids}", user, 0).count
    forge_count = ForgeMessage.where("user_id =? and viewed =?", user, 0).count
    org_count = OrgMessage.where("user_id =? and viewed =?", user, 0).count
    user_feedback_count = UserFeedbackMessage.where("user_id =? and viewed =?", user, 0).count
    user_memo_count = MemoMessage.where("user_id =? and viewed =?", user, 0).count
    at_count = user.at_messages.where(viewed: false).count
    contest_count = ContestMessage.where(:user_id => user, :viewed => 0).count
    applied_count = AppliedMessage.where("user_id=? and viewed =?", user, 0).count
    blog_count = BlogMessage.where(:user_id => user, :viewed => 0).count
    messages_count = course_count + forge_count + user_feedback_count + user_memo_count + at_count + org_count + contest_count + blog_count + applied_count
  end

  def user_mail_notification_options(user)
    user.valid_notification_options.collect {|o| [l(o.last), o.first]}
  end

  def change_status_link(user)
    url = {:controller => 'users', :action => 'update', :id => user, :page => params[:page], :status => params[:status], :tab => nil}

    if user.locked?
      link_to "解锁", url.merge(:user => {:status => User::STATUS_ACTIVE}), :method => :put, :class => 'mr10 link-color-blue'
    elsif user.registered?
      link_to l(:button_activate), url.merge(:user => {:status => User::STATUS_ACTIVE}), :method => :put, :class => 'icon icon-unlock'
    elsif user != User.current
      link_to "加锁", url.merge(:user => {:status => User::STATUS_LOCKED}), :method => :put, :class => 'mr10 link-color-blue'
    end
  end

  def user_settings_tabs
    tabs = [{:name => 'general', :partial => 'users/general', :label => :label_general},
            {:name => 'memberships', :partial => 'users/memberships', :label => :label_project_plural}
    ]
    if Group.all.any?
      tabs.insert 1, {:name => 'groups', :partial => 'users/groups', :label => :label_group_plural}
    end
    tabs
  end

  # this method is used to get all projects that tagged one tag
  # added by william
  def get_users_by_tag(tag_name)
    User.tagged_with(tag_name).order('updated_on desc')
  end

  # added by fq
  # <div class="pagination" >
  # <ul>
  # <li><%= link_to("所有动态", {:controller => 'users', :action => 'show'}) %></li>
  # <li><%= link_to("只看自己", {:controller => 'users', :action => 'show', :type => 1}) %></li>
  # <li><%= link_to("所有反馈", {:controller => 'users', :action => 'show', :type => 2}) %></li>
  # </ul></div> 

  # TODO: 待删
  # def show_activity(state)
  #   content = ''.html_safe
  #   case state
  #   when 0
  #     s = content_tag('span', l(:label_user_all_activity), :class => "current-page")
  #     content << content_tag('li', s)
  #     content << content_tag('li', link_to(l(:label_user_activity_myself), {:controller => 'users', :action => 'show', :type => 1}))
  #     content << content_tag('li', link_to(l(:label_user_all_respond), {:controller => 'users', :action => 'show', :type => 2}))
  #   when 1
  #     s = content_tag('span', l(:label_user_activity_myself), :class => "current-page")
  #     content << content_tag('li', link_to(l(:label_user_all_activity), {:controller => 'users', :action => 'show'}))
  #     content << content_tag('li', s, :class => "current-page")
  #     content << content_tag('li', link_to(l(:label_user_all_respond), {:controller => 'users', :action => 'show', :type => 2}))
  #   when 2
  #     s = content_tag('span', l(:label_user_all_respond), :class => "current-page")
  #     content << content_tag('li', link_to(l(:label_user_all_activity), {:controller => 'users', :action => 'show'}))
  #     content << content_tag('li', link_to(l(:label_user_activity_myself), {:controller => 'users', :action => 'show', :type => 1}))
  #     content << content_tag('li', s, :class => "current-page")
  #   end
  #   content_tag('div', content, :class => "pagination")
  # end

  #TODO: 待删
  def watch_projects(state)
    content = ''.html_safe
    case state
      when 0
        s = content_tag('span', l(:label_project_take), :class => "current-page")
        content << content_tag('li', s)
        content << content_tag('li', link_to(l(:label_has_watched_project), {:controller => 'users', :action => 'watch_projects', :type => 1}))
      when 1
        s = content_tag('span', l(:label_has_watched_project), :class => "current-page")
        content << content_tag('li', link_to(l(:label_project_take), {:controller => 'users', :action => 'user_projects'}))
        content << content_tag('li', s, :class => "current-page")
    end
    content_tag('div', content, :class => "pagination")
  end

  def user_course(state)
    content = ''.html_safe
    if @user != User.current
      if  @user.user_extensions.identity == 0
        case state
          when 0
            s = content_tag('span', '他执教的课程', :class => "current-page")
            content << content_tag('li', s)
            content << content_tag('li', link_to('他发布的作业', {:controller => 'users', :action => 'user_courses', :type => 1}))
            content_tag('div', content, :class => "pagination")
          when 1
            s = content_tag('span', '他发布的作业', :class => "current-page")
            content << content_tag('li', link_to('他执教的课程', {:controller => 'users', :action => 'user_courses'}))
            content << content_tag('li', s, :class => "current-page")
            content_tag('div', content, :class => "pagination")
        end
      else
        case state
          when 0
            s = content_tag('span', '他的课程', :class => "current-page")
            content << content_tag('li', s)
            content << content_tag('li', link_to('他的作业', {:controller => 'users', :action => 'user_courses', :type => 1}))
            content_tag('div', content, :class => "pagination")
          when 1
            s = content_tag('span', '他的作业', :class => "current-page")
            content << content_tag('li', link_to('他的课程', {:controller => 'users', :action => 'user_courses', :type => 0}))
            content << content_tag('li', s, :class => "current-page")
            content_tag('div', content, :class => "pagination")
        end
      end
    else
      if  @user.user_extensions.identity == 0
        case state
          when 0
            s = content_tag('span', l(:label_teaching_course), :class => "current-page")
            content << content_tag('li', s)
            content << content_tag('li', link_to(l(:label_release_homework), {:controller => 'users', :action => 'user_courses', :type => 1}))
            content_tag('div', content, :class => "pagination")
          when 1
            s = content_tag('span', l(:label_release_homework), :class => "current-page")
            content << content_tag('li', link_to(l(:label_teaching_course), {:controller => 'users', :action => 'user_courses'}))
            content << content_tag('li', s, :class => "current-page")
            content_tag('div', content, :class => "pagination")
        end
      else
        case state
          when 0
            s = content_tag('span', l(:label_my_course), :class => "current-page")
            content << content_tag('li', s)
            content << content_tag('li', link_to('我的作业', {:controller => 'users', :action => 'user_courses', :type => 1}))
            content_tag('div', content, :class => "pagination")
          when 1
            s = content_tag('span', '我的作业', :class => "current-page")
            content << content_tag('li', link_to(l(:label_my_course), {:controller => 'users', :action => 'user_courses', :type => 0}))
            content << content_tag('li', s, :class => "current-page")
            content_tag('div', content, :class => "pagination")
        end
      end
    end
  end

  # added by huang 
  def sort_user(state, project_type)
    content = ''.html_safe
    case state
      when 0
        content << content_tag('li', link_to(l(:label_sort_by_active), users_path(params.merge({:user_sort_type => '1', :project_type => project_type}) )))
        content << content_tag('li', link_to(l(:label_sort_by_influence), users_path(params.merge({:user_sort_type => '2', :project_type => project_type}) )))
        content << content_tag('li', link_to(l(:label_sort_by_time), users_path(params.merge({:user_sort_type => '0', :project_type => project_type}) ), :class=>"selected") )
      when 1
        content << content_tag('li', link_to(l(:label_sort_by_active), users_path(params.merge({:user_sort_type => '1', :project_type => project_type}) ), :class=>"selected") )
        content << content_tag('li', link_to(l(:label_sort_by_influence), users_path(params.merge({:user_sort_type => '2', :project_type => project_type}) )))
        content << content_tag('li', link_to(l(:label_sort_by_time), users_path(params.merge({:user_sort_type => '0', :project_type => project_type}) )))
      when 2
        content << content_tag('li', link_to(l(:label_sort_by_active), users_path(params.merge({:user_sort_type => '1', :project_type => project_type}) )))
        content << content_tag('li', link_to(l(:label_sort_by_influence), users_path(params.merge({:user_sort_type => '2', :project_type => project_type}) ), :class=>"selected") )
        content << content_tag('li', link_to(l(:label_sort_by_time), users_path(params.merge({:user_sort_type => '0', :project_type => project_type}) )))
    end
    content = content_tag('ul', content)
    content_tag('div', content, :class => "tabs")
  end

  def sort_user_enterprise(state, project_type)
    content = ''.html_safe
    case state
      when 0
        content << content_tag('li', link_to(l(:label_sort_by_active), users_path(:user_sort_type => '1', :project_type => project_type)))
        content << content_tag('li', link_to(l(:label_sort_by_influence), users_path(:user_sort_type => '2', :project_type => project_type)))
        content << content_tag('li', link_to(l(:label_sort_by_time), users_path(:user_sort_type => '0', :project_type => project_type), :class=>"selected"), :class=>"selected")
      when 1
        content << content_tag('li', link_to(l(:label_sort_by_active), users_path(:user_sort_type => '1', :project_type => project_type), :class=>"selected"), :class=>"selected")
        content << content_tag('li', link_to(l(:label_sort_by_influence), users_path(:user_sort_type => '2', :project_type => project_type)))
        content << content_tag('li', link_to(l(:label_sort_by_time), users_path(:user_sort_type => '0', :project_type => project_type)))
      when 2
        content << content_tag('li', link_to(l(:label_sort_by_active), users_path(:user_sort_type => '1', :project_type => project_type)))
        content << content_tag('li', link_to(l(:label_sort_by_influence), users_path(:user_sort_type => '2', :project_type => project_type), :class=>"selected"), :class=>"selected")
        content << content_tag('li', link_to(l(:label_sort_by_time), users_path(:user_sort_type => '0', :project_type => project_type)))
    end
    content = content_tag('ul', content)
    content_tag('div', content, :class => "tabs_enterprise")
  end

  def gender_avatar_uri user
    img_uri = '/images/sidebar/female.png'
    return img_uri if user.user_extensions.blank?
    person_gender = user.user_extensions.gender
    img_uri = (person_gender == 1) ? '/images/sidebar/female.png' : '/images/sidebar/male.png'
  end

  include CoursesHelper
  def is_watching?(user)
    login_user = User.current# 登录者

    courses = user.projects.where('project_type=1')
    return true if ((login_user == user) or login_user.admin?)
    courses.each do |course|
      return true if login_user.member_of?(course)
    end
    ## 下面的代码只判断是否是老师或者助教,上面是成员都可以看到
    # people_ids = []
    # user.projects.where('project_type=1').each do |project|
    #   tmp = searchTeacherAndAssistant(project)
    #   people_ids += (members_to_user_ids(tmp)) unless tmp.nil?
    # end
    # people_ids.include?(login_user.id) or (login_user == user) or login_user.admin?

    false
  end

  # base user上面的navbar显示内容
  def show_item_on_navbar params
    displayed_item = %w|index|
    displayed_item.include?(params['action'])
  end
  # base user上面searchBar显示
  def show_search_bar params
    displayed_flag = %w|index|
    !displayed_flag.include?(params['action'])
  end

  #获取指定用户的未过期的课程列表
  def user_courses_list user
    result = []
    user.coursememberships.map(&:course).each do |course|
      if !course_endTime_timeout?(course)
        result << course
      end
    end
    return result
  end


  #获取指定用户的课程大纲
  def user_syllabus(user)
    results = []
    courses = user_courses_list(user)

    other = Syllabus.new(title: '未命名课程')

    courses.each do |c|
      other << c unless c.syllabus
    end

    user.syllabuses.to_a << other
  end

  #获取用户参与的公开的课程列表
  def user_public_course_list user
    membership = user.coursememberships.all#@user.coursememberships.all(:conditions => Course.visible_condition(User.current))
    membership.sort! {|older, newer| newer.created_on <=> older.created_on }
    memberships = []
    membership.collect { |e|
      memberships.push(e)
    }
    ## 判断课程是否过期 [需封装]
    memberships_doing = []
    memberships_done  = []
    memberships.map { |e|
      if course_endTime_timeout?(e.course)
        memberships_done.push e
      else
        memberships_doing.push e
      end
    }
  end

  #获取用户留言相关的连接
  def user_jour_feed_back_url active
    if active.act_type == "JournalsForMessage"
      jour = JournalsForMessage.find active.act_id
      if jour
        case jour.jour_type
          when "Principal"
            link_to(l(:label_goto), user_newfeedback_user_path(jour.jour_id))
          when "Project"
            link_to(l(:label_goto), project_feedback_path(jour.jour_id))
          when "Bid"
            link_to(l(:label_goto), course_for_bid_path(jour.jour_id))
          when "Course"
            link_to(l(:label_goto), course_feedback_path(jour.jour_id))
          when "Contest"
            link_to(l(:label_goto), show_contest_contest_path(jour.jour_id))
          when "Softapplication"
            link_to(l(:label_goto), softapplication_path(jour.jour_id))
          when "HomeworkAttach"
            link_to(l(:label_goto), course_for_bid_path(jour.jour_id))
        end
      end
    end
  end

  # 用户的发布数
  def user_publish_count user
    shixun_count = Shixun.find_by_sql("select distinct(s.id),s.name,s.user_id,s.challenges_count,s.status,s.identifier
                                       from shixuns s, shixun_members sm
                                       where sm.user_id = #{user.id} and sm.shixun_id = s.id and s.hidden =0 and s.status in (2, 3)").try(:count)
    subject_count = Subject.find_by_sql("select count(subjects.id) count from subject_members sm, subjects where sm.user_id=#{user.id} and sm.subject_id = subjects.id and subjects.status = 2").first.try(:count)
    course_count = Course.find_by_sql("SELECT COUNT(courses.id) count FROM members m, courses, member_roles mr WHERE m.user_id=#{user.id} AND m.course_id = courses.id AND courses.`is_delete` = 0 AND mr.member_id = m.id AND mr.role_id IN (3, 7, 9)").first.try(:count)
    project_count = Project.find_by_sql("SELECT p.id FROM projects p, members m, member_roles mr WHERE m.project_id = p.id AND m.id=mr.member_id AND mr.role_id = 3 AND m.user_id=#{user.id} AND p.status != 9").count
    count = shixun_count.to_i + subject_count.to_i + course_count.to_i + project_count.to_i
  end

  def get_watcher_users(obj)
    count = User.watched_by(obj.id).count
    if count == 0
      return [0,[]]
    end
    list = User.watched_by(obj.id).order("#{Watcher.table_name}.id desc").limit(10).all
    return [count,list]
  end

  def get_fans_users(obj)
    count = obj.watcher_users.count
    if count == 0
      return [0,[]]
    end
    list = obj.watcher_users.order("#{Watcher.table_name}.id desc").limit(10).all
    return [count,list]
  end

  def get_visitor_users(obj)
    query = Visitor.where("master_id=?",obj.id)
    count = query.count
    if count == 0
      return [0,[]]
    end
    list = query.order("updated_on desc").limit(10).all
    return [count,list]
  end

  def get_create_course_count(user)
    user.courses.visible.where("tea_id = ?",user.id).count
  end

  #获取加入课程数
  def get_join_course_count(user)
    user.courses.visible.count - get_create_course_count(user)
  end

  #发布作业数
  def get_homework_commons_count(user)
    HomeworkCommon.where("user_id = ?",user.id).count
  end

  #资源数
  def get_projectandcourse_attachment_count(user)
    Attachment.where("author_id = ? and container_type in ('Project','Course')",user.id).count
  end

  #创建项目数
  def get_create_project_count(user)
    user.projects.visible.where("projects.user_id=#{user.id}").count
  end

  #加入项目数
  def get_join_project_count(user)
    user.projects.visible.count - get_create_project_count(user)
  end

  #创建缺陷数
  def get_create_issue_count(user)
    Issue.where("author_id = ?",user.id).count
  end

  #解决缺陷数
  def get_resolve_issue_count(user)
    Issue.where("assigned_to_id = ? and status_id=3",user.id).count
  end

  #参与匿评数
  def get_anonymous_evaluation_count(user)
    StudentWorksScore.where("user_id = ? and reviewer_role=3",user.id).count
  end

  def query_activities(query)
    list = query.limit(13).all
    result = []
    for item in list
      container = get_activity_container(item)
      result << { :item=>item,:e=>container }
    end
    result
  end

  def get_activity_container activity
    return activity.activity_container
  end

  def get_activity_act_showname_htmlclear(activity)
    str = get_activity_act_showname(activity)
    str = str.gsub(/<.*>/,'')
    str = str.gsub(/\r/,'')
    str = str.gsub(/\n/,'')
    str = str.lstrip.rstrip
    if str == ''
      str = 'RE:'
    end
    return str.html_safe
  end

  # journal.details 记录每个动作的新旧值
  def get_issue_des_update(journal)
    no_html = "message"
    arr = details_to_strings(journal.details, no_html)
    unless journal.notes.blank?
      arr << journal.notes
    end
    str = ''
    arr.each { |item| str = str+item }
    return str
  end

  def get_activity_act_showname(activity)
    case activity.act_type
      when "HomeworkCommon"
        return activity.act.name
      when "Issue"
        return activity.act.subject
      when "Journal"
        arr = details_to_strings(activity.act.details,true)
        arr << activity.act.notes
        str = ''
        arr.each { |item| str = str+item }
        return str
      when "JournalsForMessage"
        return activity.act.notes
      when "Message"
        return activity.act.subject
      when "News"
        return activity.act.title
      when "Poll"
        return activity.act.polls_name
      when "Contest"
        return ''
      when "Contestnotification"
        return ''
      when "Principal"
        return ''
      else
        return activity.act_type
    end
  end

  def get_activity_act_createtime(activity)
    case activity.act_type
      when "HomeworkCommon"
        return activity.act.created_at
      when "Poll"
        return activity.act.created_at
      else
        return activity.act.created_on
    end
  end

  def get_activity_container_url e
    if !e.visible?
      return "javascript:;"
    end

    if e.class.to_s == 'Course'
      return url_for(:controller => 'courses', :action=>"show", :id=>e.id, :host=>Setting.host_course)
    end
    return url_for(:controller => 'projects', :action=>"show", :id=>e.id, :host=>Setting.host_name)
  end

  def get_activity_url(activity,e)
    if !e.visible?
      return "javascript:;"
    end

    case activity.act_type
      # when "Contest"
      # when "Contestnotification"
      # when "Principal"
      when "HomeworkCommon"
        return homework_common_index_path( :course=>e.id )
      when "Issue"
        return issue_path(activity.act.id)
      when "Journal"
        return issue_path( activity.act.journalized_id )
      when "JournalsForMessage"
        return e.class.to_s == 'Course' ? course_feedback_path(e) : project_feedback_path(e)
      when "Message"
        return e.class.to_s == 'Course' ? course_boards_path(e) : project_boards_path(e)
      when "News"
        return news_path(activity.act)
      #return e.class.to_s == 'Course' ? course_news_index_path(e) : project_news_index_path(e)
      when "Poll"
        return poll_index_path( :polls_group_id=>activity.act.polls_group_id, :polls_type=>e.class.to_s )
      else
        return 'javascript:;'
    end
  end

  def get_activity_opt(activity,e)
    case activity.act_type
      when "HomeworkCommon"
        return '创建了作业'
      when "News"
        return e.class.to_s == 'Course' ? '发布了通知' : '添加了新闻'
      when "Issue"
        return '发表了问题'
      when "Journal"
        return '更新了问题'
      when "JournalsForMessage"
        return e.class.to_s == 'Course' ? '发表了留言' : '提交了反馈'
      #return ( activity.act.reply_id == nil || activity.act.reply_id == 0 ) ? '' : ''
      when "Message"
        return ( activity.act.parent_id == nil || activity.act.parent_id == '' ) ? '发布了帖子' : '回复了帖子'
      when "Poll"
        return '创建了问卷'
      else
        return '有了新动态'
    end
  end

  #获取指定用户作为老师的课程
  def get_as_teacher_courses user
    type = []
    option = []
    option << "请选择发布作业的课程"
    option << -1
    type << option
    user.courses.visible.where("is_delete =?", 0).select("courses.*,(SELECT MAX(created_at)  FROM `course_activities` WHERE course_activities.course_id = courses.id) AS a").order("a desc").select{|c| user.allowed_to?(:as_teacher,c)}.each do |course|
      option = []
      option << course.name+"("+course.time.to_s+course.term+")"
      option << course.id
      type << option
    end
    type
  end

  #根据姓名搜索用户
  def search_user_by_name user_ids, name
    result_ids = []
    user_ids.each do |user_id|
      user = User.find user_id
      username = user.lastname.to_s.downcase + user.firstname.to_s.downcase
      if username.include?(name)
        result_ids << user_id
      end
    end
    result_ids
  end

  #课程的班级列表最近更新时间
  def syllabus_course_list_sort syllabuses
    syllabuses.each do |sy|
      updated_at = sy.updated_at
      courses = sy.courses.not_deleted
      unless courses.empty?
        course_ids = "(" + courses.map { |course| course.id}.join(",") + ")"
        updated_at = CourseActivity.where("course_id in #{course_ids}").order("updated_at desc").first.updated_at
      end
      sy[:last_update] = updated_at
    end
    syllabuses
  end

  #获取按作业的发布者排序的用户ID
  def hw_publisher_user_ids search, course_ids
    if search && search != ""
      all_homeworks = HomeworkCommon.where("course_id in #{course_ids}")
      all_user_ids = all_homeworks.map{|hw| hw.user_id}
      user_str_ids = search_user_by_name all_user_ids, search
      user_ids = user_str_ids.empty? ? "(-1)" : "(" + user_str_ids.join(",") + ")"
    else
      user_ids = "(-1)"
    end
    return user_ids
  end

  # 获取竞赛申请者的角色
  def get_role_str role
    str = ""
    case role
      when 1
        str = "管理员"
      when 2
        str = "评委"
      when 3
        str = "参赛者"
      when 4
        str = "管理员、评委"
    end
    str
  end

  def get_work_count work
    work_count = 0
    case work.container_type
      when 'Common', 'Shixun', 'Group'
        work_count = StudentWork.find_by_sql("select count(sw.id) as count from student_works sw, homework_commons h where sw.homework_common_id = h.id and sw.work_status > 0 and sw.is_delete = 0 and h.homework_bank_id = #{work.container_id}").first.try(:count).to_i
      when 'Exercise'
        work_count = ExerciseUser.find_by_sql("select count(eu.id) as count from exercise_users eu, exercises e where eu.exercise_id=e.id and e.exercise_bank_id = #{work.container_id} and eu.commit_status = 1").first.try(:count).to_i
      when 'Poll'
        work_count = PollUser.find_by_sql("select count(pu.id) as count from poll_users pu, polls p where pu.poll_id = p.id and p.exercise_bank_id = #{work.container_id} and pu.commit_status = 1").first.try(:count).to_i
    end
    work_count
  end
end