# encoding: utf-8
class OrganizationsController < ApplicationController


  helper :sort
  include SortHelper
  helper :custom_fields
  include CustomFieldsHelper
  include AvatarHelper
  include WordsHelper
  include GitlabHelper
  include UserScoreHelper

  include PollHelper
  helper :user_score
  helper :journals
  helper :attachments
  # added by liuping 关注

  helper :watchers
  helper :activities

  ### added by william
  include ActsAsTaggableOn::TagsHelper

  #  fq
  helper :words
  helper :project_score
  helper :issues
  include UsersHelper
  before_filter :find_organization, :only => [:show, :members, :apply_subdomain, :select_org_layout, :teachers]
  layout 'base_org'
  def index

  end


  def new
    @organization = Organization.new
    render :layout => 'new_base'
  end

  def edit
    # @organization = Organization.find(params[:id])
    begin
      @organization = Organization.where("id =?", params[:id])
    ensure
      render_404
    end
  end

  def destroy
    @organization = Organization.find(params[:id])
    @organization.destroy
    respond_to do |format|
      format.html{ redirect_to admin_organization_path }
    end
  end

  def create
    @organization = Organization.new
    @organization.name = params[:organization][:name]
    @organization.description = params[:organization][:description]
    @organization.is_public = params[:organization][:is_public]
    @organization.allow_guest_download = params[:organization][:allow_guest_download] == '1' ? 1 : 0
    @organization.show_mode = 0
    @organization.creator_id = User.current.id
    member = OrgMember.new(:user_id => User.current.id)

    @organization.org_members << member
    if @organization.save
      OrgMemberRole.create(:org_member_id => member.id, :role_id => 11)
      redirect_to organization_path(@organization)
    end
  end

  def show
    # 组织新类型 show_mode：判断标准 1为新类型，0为旧
    if @organization.show_mode.to_i == 1 && params[:org_subfield_id].nil? && params[:list] .nil?
      if @organization.is_public? || User.current.admin? || User.current.member_of_org?(@organization)
        # REDO:时间紧，暂时先这样
        @org_logo_attchment = Attachment.find_by_sql("SELECT * from attachments WHERE container_id = #{@organization.id} and container_type = 'Organization' and attachtype = 0 and filename REGEXP '(.jpg|.png|.bmp|.gif|.jpeg)' ORDER BY created_on desc limit 1").first
        @org_banner_attchment = Attachment.find_by_sql("SELECT * from attachments WHERE container_id = #{@organization.id} and container_type = 'Organization' and attachtype = 1 and filename REGEXP '(.jpg|.png|.bmp|.gif|.jpeg)' ORDER BY created_on desc limit 1").first

        @subfield_content = @organization.org_subfields.order("priority")
        @organization = Organization.find(params[:id])
          shield_project_ids = ShieldActivity.where("container_type='Organization' and container_id=#{@organization.id} and shield_type='Project'").map(&:shield_id)
          shield_course_ids = ShieldActivity.where("container_type='Organization' and container_id=#{@organization.id} and shield_type='Course'").map(&:shield_id)
          project_ids = (@organization.projects.map(&:id)-shield_project_ids) << 0
          course_ids = (@organization.courses.map(&:id)-shield_course_ids) << 0
          course_types = "('Message','News','HomeworkCommon','Poll','Course')"
          @project_acts = get_project_activities_org @organization, project_ids
          @course_acts = get_course_activities_org @organization, course_ids
        render :layout => 'base_org2'
      else
        render_403
      end
    else
      if @organization.is_public? || User.current.admin? || User.current.member_of_org?(@organization)
        @organization = Organization.find(params[:id])
        # params[:org_subfield_id] 存在即对应的栏目，否则进入组织动态
        if params[:org_subfield_id]
          @org_subfield = OrgSubfield.find(params[:org_subfield_id])
          if @org_subfield.field_type == "Comptec" || @org_subfield.field_type == "Compstu"

            # @org_teachers = User.find_by_sql("select u.*, ue.technical_title, ue.school_id,( SELECT `courses`.* FROM `courses` INNER JOIN `members` ON `courses`.`id` = `members`.`course_id` WHERE `members`.`user_id` = u.id AND (courses.status<>9)) as course_count
            #                               from users u, user_extensions ue where u.id = ue.user_id and ue.identity=0 order by course_count desc")
            @org_teachers = User.find_by_sql("select u.*, ue.technical_title, ue.school_id,(select count(*) from courses where courses.tea_id = u.id) as course_count from users u, user_extensions ue where u.id = ue.user_id and ue.identity=0 order by course_count desc")
            # @org_count = @org_teachers.count
            # @limit = 25
            # @is_remote = true
            # @atta_count = @attachments.count
            # @atta_pages = Paginator.new @atta_count, @limit, params['page'] || 1
            # @offset ||= @atta_pages.offset
            # #@curse_attachments_all = @all_attachments[@offset, @limit]
            # @attachments = paginateHelper @attachments,25
          else
            @org_subfield_ids = @org_subfield.org_document_comments.map(&:id) << 0
            @org_activities = OrgActivity.where("(org_act_type='OrgDocumentComment'and org_act_id in (#{@org_subfield_ids.join(",")})) || (container_type='OrgSubfield' and container_id=#{@org_subfield.id})").order('updated_at desc').page(params[:page] || 1).per(10)
          end
        else
          shield_project_ids = ShieldActivity.where("container_type='Organization' and container_id=#{@organization.id} and shield_type='Project'").map(&:shield_id)
          shield_course_ids = ShieldActivity.where("container_type='Organization' and container_id=#{@organization.id} and shield_type='Course'").map(&:shield_id)
          project_ids = (@organization.projects.map(&:id)-shield_project_ids) << 0
          course_ids = (@organization.courses.map(&:id)-shield_course_ids) << 0
          course_types = "('Message','News','HomeworkCommon','Poll','Course')"
          case params[:type]
            when nil
              @org_activities  = OrgActivity.where("(container_id =? and container_type =?) " +
                                                       "or (container_type ='Project' and org_act_type in ('Issue','Message','Project') and container_id in (#{project_ids.join(',')})) "+
                                                       "or (container_type ='Course' and org_act_type in #{course_types} and container_id in (#{course_ids.join(',')}))",
                                                   @organization.id, 'Organization').order('updated_at desc').page(params[:page] || 1).per(10)
            when 'project_issue'
              @org_activities = OrgActivity.where("container_type = 'Project' and org_act_type = 'Issue' and container_id in (#{project_ids.join(',')})").order('updated_at desc').page(params[:page] || 1).per(10)
            when 'project_message'
              @org_activities = OrgActivity.where("container_type = 'Project' and org_act_type = 'Message' and container_id in (#{project_ids.join(',')})").order('updated_at desc').page(params[:page] || 1).per(10)
            when 'org'
              @org_activities = OrgActivity.where("container_id =? and container_type =?",@organization.id, 'Organization').order('updated_at desc').page(params[:page] || 1).per(10)
            when 'course_homework'
              @org_activities = OrgActivity.where("container_type = 'Course' and org_act_type = 'HomeworkCommon' and container_id in (#{course_ids.join(',')})").order('updated_at desc').page(params[:page] || 1).per(10)
            when 'course_news'
              @org_activities = OrgActivity.where("container_type = 'Course' and org_act_type = 'News' and container_id in (#{course_ids.join(',')})").order('updated_at desc').page(params[:page] || 1).per(10)
            when 'course_message'
              @org_activities = OrgActivity.where("container_type = 'Course' and org_act_type = 'Message' and container_id in (#{course_ids.join(',')})").order('updated_at desc').page(params[:page] || 1).per(10)
            when 'course_poll'
              @org_activities = OrgActivity.where("container_type = 'Course' and org_act_type = 'Poll' and container_id in (#{course_ids.join(',')})").order('updated_at desc').page(params[:page] || 1).per(10)
          end
        end
        @page = params[:page] ? params[:page].to_i : 1
        respond_to do |format|
          format.html
          format.js
        end
      else
        render_403
      end
    end

  end

  def teachers
    unless @organization.allow_set_teachers
      render_403
      return
    end
    q = params[:search].nil? ? "" : "#{params[:search].strip}"
    @field = params[:org_subfield_id].nil? ? OrgSubfield.where("organization_id =? and field_type =?", params[:id].to_i, "Comptec").first : OrgSubfield.find(params[:org_subfield_id])
    @type = params[:type]
    if @type == "courses" || @type.nil?
      @org_teachers = User.find_by_sql("select u.*, ue.technical_title, ue.school_id,(select count(*) from courses where courses.tea_id = u.id) as course_count
                                   from users u, user_extensions ue where u.id = ue.user_id and ue.identity=0 and concat(lastname,firstname,login) like '%#{q}%' order by course_count desc")
    elsif @type == "students"
      @org_teachers = User.find_by_sql("select u.*, ue.technical_title, ue.school_id,(select count(*) from courses where courses.tea_id = u.id) as course_count
                                   from users u, user_extensions ue where u.id = ue.user_id and ue.identity=0 and concat(lastname,firstname,login) like '%#{q}%' order by course_count desc")
    elsif @type == "resources"
      @org_teachers = User.find_by_sql("select u.*, ue.technical_title, ue.school_id,(select count(*) from attachments where attachments.author_id = u.id) as course_count
                                   from users u, user_extensions ue where u.id = ue.user_id and ue.identity=0 and concat(lastname,firstname,login) like '%#{q}%' order by course_count desc")
    elsif @type == "famous"
      @org_teachers = User.find_by_sql("select u.*, ue.technical_title, ue.school_id,(select count(*) from courses where courses.tea_id = u.id) as course_count
                                   from users u, user_extensions ue where u.id = ue.user_id and ue.identity=0 and u.excellent_teacher =1 and concat(lastname,firstname,login) like '%#{q}%' order by course_count desc")
    end
    limit = 10
    # @is_remote = true
    @teachers_count = @org_teachers.count
    @atta_pages = Paginator.new @teachers_count, limit, params['page'] || 1
    @offset ||= @atta_pages.offset
    #@curse_attachments_all = @all_attachments[@offset, @limit]
    @org_teachers = paginateHelper @org_teachers, limit
    respond_to do |format|
      format.html
      format.js
    end
  end

  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 get_project_message_activities_org org
    project_ids = org.projects.map{|project| project.id}.join(",")
    unless project_ids.blank?
      project_acts = OrgActivity.find_by_sql("SELECT * FROM org_activities where container_id in (#{project_ids}) and container_type = 'project' and org_act_type = 'Message' order by updated_at desc limit 2;")
    else
      project_acts = nil
    end
  end

  def get_project_issue_activities_org org
    project_ids = org.projects.map{|project| project.id}.join(",")
    unless project_ids.blank?
      project_acts = OrgActivity.find_by_sql("SELECT * FROM org_activities where container_id in (#{project_ids}) and container_type = 'project' and org_act_type = 'issue' order by updated_at desc limit 4;")
    else
      project_acts = nil
    end
    #project_acts = OrgActivity.find_by_sql("SELECT * FROM org_activities where container_id in (#{project_ids}) and container_type = 'project' and org_act_type = 'issue' order by updated_at desc limit 4;")
  end

  # 获取整过项目的动态
  def get_project_activities_org org, project_ids
    unless project_ids.blank?
      project_acts = OrgActivity.find_by_sql("SELECT * FROM org_activities where container_id in (#{project_ids.join(',')}) and container_type = 'project'
                  and org_act_type in ('Message', 'Issue') order by updated_at desc limit 5;")
    else
      project_acts = nil
    end
    #project_acts = OrgActivity.find_by_sql("SELECT * FROM org_activities where container_id in (#{project_ids}) and container_type = 'project' and org_act_type = 'issue' order by updated_at desc limit 4;")
  end

  # 获取整过课程的动态
  def get_course_activities_org org, course_ids
    unless course_ids.blank?
      project_acts = OrgActivity.find_by_sql("SELECT * FROM org_activities where container_id in (#{course_ids.join(',')}) and container_type = 'course'
                  and org_act_type in ('HomeworkCommon', 'Poll',  'Message', 'News', 'Course') order by updated_at desc limit 5;")
    else
      project_acts = nil
    end
    #project_acts = OrgActivity.find_by_sql("SELECT * FROM org_activities where container_id in (#{course_ids}) and container_type = 'course' order by updated_at desc limit 5;")
    #project_acts = OrgActivity.find_by_sql("SELECT * FROM org_activities where container_id in (#{course_ids}) and container_type = 'course' and org_act_type = 'HomeworkCommon' order by updated_at desc limit 1;")
  end

  def get_course_homework_activities_org org
    course_ids = org.courses.map{|course| course.id}.join(",")
    unless course_ids.blank?
      project_acts = OrgActivity.find_by_sql("SELECT * FROM org_activities where container_id in (#{course_ids}) and container_type = 'course' and org_act_type = 'HomeworkCommon' order by updated_at desc limit 1;")
    else
      project_acts = nil
    end
    #project_acts = OrgActivity.find_by_sql("SELECT * FROM org_activities where container_id in (#{course_ids}) and container_type = 'course' order by updated_at desc limit 5;")
    #project_acts = OrgActivity.find_by_sql("SELECT * FROM org_activities where container_id in (#{course_ids}) and container_type = 'course' and org_act_type = 'HomeworkCommon' order by updated_at desc limit 1;")
  end

  def get_course_message_activities_org org
    course_ids = org.courses.map{|course| course.id}.join(",")
    unless course_ids.blank?
      project_acts = OrgActivity.find_by_sql("SELECT * FROM org_activities where container_id in (#{course_ids}) and container_type = 'course' and org_act_type = 'Message' order by updated_at desc limit 1;")
    else
      project_acts = nil
    end
  end

  def get_course_news_activities_org org
    course_ids = org.courses.map{|course| course.id}.join(",")
    unless course_ids.blank?
      project_acts = OrgActivity.find_by_sql("SELECT * FROM org_activities where container_id in (#{course_ids}) and container_type = 'course' and org_act_type = 'News' order by updated_at desc limit 1;")
    else
      project_acts = nil
    end
    #project_acts = OrgActivity.find_by_sql("SELECT * FROM org_activities where container_id in (#{course_ids}) and container_type = 'course' and org_act_type = 'News' order by updated_at desc limit 1;")
  end

  def update
    @organization = Organization.find(params[:id])
    @organization.name = params[:organization][:name]
    @organization.description = params[:organization][:description]
    # @organization.domain = params[:organization][:domain]
    @organization.is_public = params[:organization][:is_public] == 'on' ? 1 : 0
    @organization.allow_guest_download = params[:organization][:allow_guest_download] == 'on' ? 1 : 0
    @organization.allow_teacher = params[:organization][:allow_teacher] == 'on' ? 1 : 0
    @organization.show_mode = params[:show_mode]
    #@organization.name = params[:organization][:name]
    @organization.save
     respond_to do |format|
       if @organization.show_mode == 1
         format.html { redirect_to organization_path(@organization)}
       else
       format.html { redirect_to setting_organization_path(@organization)}
     end
  end
  end

  def check_uniq
    @check = false;
    @org_name = params[:org_name].strip
    @config_page = params[:config_page]
    sameName =  @config_page ? Organization.where('name = ? and id != ?',params[:org_name],params[:org_id].to_i).count == 0 : Organization.where('name = ?',params[:org_name]).count == 0
    if sameName == true
      @check = true
    end
    respond_to do |format|
      format.js
    end
  end

  def check_uniq_domain
    @is_exist = (Secdomain.where("subname=?",params[:org_domain]).count > 0)
  end

  def find_organization
    @organization = Organization.find(params[:id])
  end

  def setting
    @organization = Organization.find(params[:id])

    if User.current.admin? || User.current.admin_of_org?(@organization)
    else
      render_403
    end
  end

  def set_homepage
    @org = Organization.find(params[:id])
    @org.home_id = params[:home_id]
    @org.save
    # respond_to do |format|
    #   format.html {redirect_to organization_path(org)}
    # end
  end

  def cancel_homepage
    @org = Organization.find(params[:id])
    @org.home_id = nil
    @org.save
  end

  def autocomplete_search
    @project = Project.find(params[:project_id])
    #@flag = params[:flag] || false
    respond_to do |format|
      format.js
    end
  end

  def members
    if @organization.is_public? || User.current.admin? || User.current.member_of_org?(@organization)
      @members = OrgMember.where("organization_id =?", @organization.id)
    else
      render_403
    end
  end

  def  more_org_projects
    @organization = Organization.find params[:id]
    @page = params[:page]
    @org_projects = @organization.projects.reorder('created_at').uniq.page((params[:page].to_i || 1) +1).per(5)
    respond_to do |format|
      format.js
    end
  end

  def more_org_courses
    @organization = Organization.find(params[:id])
    @page = params[:page]
    @org_courses = @organization.courses.reorder('created_at').uniq.page((params[:page].to_i || 1) + 1 ).per(5)
    respond_to do |format|
      format.js
    end
  end

  def join_course_menu
    @organization = Organization.find(params[:id])
    respond_to do |format|
      format.js
    end
  end

  def search_courses
    @organization = Organization.find(params[:id])
    condition = '%%'
    if !params[:name].nil?
      condition = "%#{params[:name].strip}%".gsub(" ","")
    end
    if User.current.admin?
      sql = "select courses.* from courses where courses.is_public = 1 and courses.name like '#{condition}'"+
          "and courses.id not in (select distinct org_courses.course_id from org_courses where org_courses.organization_id = #{@organization.id}) and courses.is_delete=0"
    else
      sql = "select courses.* from courses inner join members on courses.id = members.course_id where members.user_id = #{User.current.id} and courses.is_public = 1 and courses.name like '#{condition}'"+
          "and courses.id not in (select distinct org_courses.course_id from org_courses where org_courses.organization_id = #{@organization.id}) and courses.is_delete=0"
    end
    #user_courses = Course.find_by_sql(sql)
    @courses = Course.find_by_sql(sql)
    # @added_course_ids = @organization.courses.map(&:id)
    # @courses = []
    # user_courses.each do |course|
    #   if !@added_course_ids.include?(course.id)
    #     @courses << course
    #   end
    # end
  end

  def join_courses
    @organization = Organization.find(params[:id])
    course_ids = params[:courseNames]
    course_ids.each do |id|
      OrgCourse.create(:organization_id => @organization.id, :course_id => id.to_i, :created_at => Time.now)
    end
    respond_to do |format|
      format.js
    end
  end

  def join_project_menu
    @organization = Organization.find(params[:id])
    respond_to do |format|
      format.js
    end
  end

  def logout
    logout_user
    respond_to do |format|
      format.html {redirect_to organization_path(params[:id])}
    end
  end

  def search_projects
    @organization = Organization.find(params[:id])
    condition = '%%'
    if !params[:name].nil?
      condition = "%#{params[:name].strip}%".gsub(" ","")
    end
    if User.current.admin?
      sql = "select projects.* from projects where projects.status != 9 and projects.is_public = 1 and projects.name like '#{condition}'" +
          " and projects.id not in (select org_projects.project_id from org_projects where organization_id = #{@organization.id}) and status=1"
    else
      sql = "select projects.* from projects inner join members on projects.id = members.project_id where members.user_id = #{User.current.id} and projects.status != 9 and projects.is_public = 1 and projects.name like '#{condition}'" +
          " and projects.id not in (select org_projects.project_id from org_projects where organization_id = #{@organization.id}) and status=1"
    end
    #user_projects = Course.find_by_sql(sql)
    @projects = Course.find_by_sql(sql)
    # @added_course_ids = @organization.projects.map(&:id)
    # @projects = []
    # user_projects.each do |project|
    #   if !@added_course_ids.include?(project.id)
    #     @projects << project
    #   end
    # end
  end

  def join_projects
    @organization = Organization.find(params[:id])
    project_ids = params[:projectNames]
    project_ids.each do |id|
      OrgProject.create(:organization_id => @organization.id, :project_id => id.to_i, :created_at => Time.now)
    end
    respond_to do |format|
      format.js
    end
  end

  # 设置为名师
  def set_excellent_teacher
    @ex_teacher = User.find(params[:user])
    @ex_teacher.update_column(:excellent_teacher, 1)
  end

  # 取消名师
  def reset_excellent_teacher
    @ex_teacher = User.find(params[:user])
    @ex_teacher.update_column(:excellent_teacher, 0)
  end

  def hide_org_subfield
    @org_subfield = OrgSubfield.find(params[:org_subfield_id])
    @org_subfield.update_attribute(:hide, 1)
  end

  def show_org_subfield
    @org_subfield = OrgSubfield.find(params[:org_subfield_id])
    @org_subfield.update_attribute(:hide, 0)
  end

  def org_resources_subfield
    @org = Organization.find(params[:id])
    if params[:send_type].present? and (params[:send_type] == 'news' or params[:send_type] == 'message')
      @subfield = @org.org_subfields.where("field_type = 'Post'")
    else
      @subfield = @org.org_subfields.where('field_type = "Resource" ')
    end
    respond_to do | format|
      format.js
    end
  end
  def apply_subdomain
    @organization = Organization.find(params[:id])
    admins = User.where("admin=1")
    admins.each do |admin|
      OrgMessage.create(:user_id => admin.id, :organization_id => @organization.id, :message_type => 'ApplySubdomain', :message_id => @organization.id, :sender_id => User.current.id, :viewed => 0, :content => params[:domain].downcase)
    end
  end

  def agree_apply_subdomain
    @organization = Organization.find(params[:organization_id])
    OrgMessage.find(params[:act_id]).update_attribute(:viewed, 1)
    if Secdomain.where("pid=? and sub_type=2",@organization.id).count > 0
      domain = Secdomain.where("pid=? and sub_type=2",params[:organization_id]).first
      Secdomain.update(domain.id, :subname => params[:org_domain])
    else
      Secdomain.create(:sub_type => 2, :pid => params[:organization_id], :subname => params[:org_domain])
    end
    if OrgMessage.where("message_type='AgreeApplySubdomain' and organization_id=#{@organization.id} and content=?",params[:org_domain]).count == 0
      OrgMessage.create(:user_id => params[:user_id], :organization_id => @organization.id, :message_type => 'AgreeApplySubdomain', :message_id => @organization.id, :sender_id => User.current.id, :viewed => 0, :content => params[:org_domain])
    end
  end
end
