#  fq
# class BidsController < ApplicationController
class ContestsController < ApplicationController
  layout "contest_base"
  
  menu_item :respond                
  menu_item :project, :only => :show_project
  menu_item :application, :only => :show_softapplication
  menu_item :attendingcontests, :only => :show_attendingcontest
  menu_item :contestnotifications, :only => :index

  before_filter :can_show_contest, :except => []    # modified by alan
  
  # modified by longjun
  before_filter :find_contest, :only => [
                                      :show_contest, :show_project, :show_softapplication,
                                      :show_attendingcontest, :index, :set_reward_project, 
                                      :set_reward_softapplication, :create, :destroy, :more,
                                      :back, :add, :add_softapplication, :new,:show_results, 
                                      :set_reward, :show_contest_project, :show_contest_user, :watcherlist,
                                      :join_in_contest, :unjoin_in_contest, :new_join,  :settings
                                    ]
  # end longjun            
         
  # added by fq
  before_filter :require_login, :only => [:join_in_contest, :unjoin_in_contest]
  # end
  before_filter :require_login,:only => [:set_reward, :destroy, :add, :new ]

  helper :watchers
  helper :attachments
  helper :projects
  helper :words

  include AttachmentsHelper
  include ApplicationHelper
  

  def index
    render_404 unless params[:name]
    # @contests = Contest.visible
    # @contests ||= []
    @offset, @limit = api_offset_and_limit(:limit => 10)
    #@contests = Contest.visible
    #@contests = @contests.like(params[:name]) if params[:name].present?
    @is_search = params[:name] ? true:false
    @contests =  Contest.visible.where("name like '%#{params[:name]}%'")
    if params[:contests_search]
      (redirect_to contests_url, :notice => l(:label_sumbit_empty);return) if params[:name].blank?
    end
    @contest_count = @contests.count
    @contest_pages = Paginator.new @contest_count, @limit, params['page']

    @offset ||= @contest_pages.reverse_offset
    if params[:contest_sort_type].present?
    case params[:contest_sort_type]
    when '0'
       # modified by longjun
      # never use unless and else, 将下面重复操作模块化,放在private下
      # unless @offset == 0
      # if @offset != 0
      #   @contests = @contests.reorder('contests.commit').offset(@offset).limit(@limit).all.reverse
      # else
      #   limit = @contest_count % @limit
      #   limit = @limit  if limit == 0
      #   @contests = @contests.reorder('contests.commit').offset(@offset).limit(limit).all.reverse

      @contests = index_page_sort(@offset, @limit, @contest_count, @contests, 'contests.commit')
      # end
      @s_state = 0
    when '1'

      @contests = index_page_sort(@offset, @limit, @contest_count, @contests, 'contests.created_on')
      @s_state = 1
    # modified by longjun
    # 目前只有 0, 1 两个sort_type
    # when '2'
      else
    # end longjun

      @contests = index_page_sort(@offset, @limit, @contest_count, @contests, '')
      @s_state = 0
    end
    else
      # modified by longjun
      # never use unless and else
      # unless @offset == 0
      if @offset != 0
        @contests = @contests.reorder('contests.created_on').offset(@offset).limit(@limit).all.reverse
      else
        limit = @contest_count % @limit
        limit = @limit  if limit == 0
        @contests = @contests.reorder('contests.created_on').offset(@offset).limit(limit).all.reverse
      end
      @s_state = 1
    end
  end

  def search
    redirect_to action: 'index',name:params[:name]
  end

  def homework
    @offset, @limit = api_offset_and_limit({:limit => 10})
    @bids = @course.homeworks.order('deadline DESC')
    @bids = @bids.like(params[:name]) if params[:name].present?
    @bid_count = @bids.count
    @bid_pages = Paginator.new @bid_count, @limit, params['page']

    @offset ||= @bid_pages.reverse_offset
    # modified by longjun
    # never use unless and else
    # unless @offset == 0
    if @offset != 0
      @bids = @bids.offset(@offset).limit(@limit).all.reverse
    else
      limit = @bid_count % @limit
      @bids = @bids.offset(@offset).limit(limit).all.reverse
    end
    render :layout => 'base_courses'

  end


  def show_contest
    @user = @contest.author
    @jours = @contest.journals_for_messages.where('m_parent_id IS NULL').order('created_on DESC')
    #@limit =  10
    #@feedback_count = @jours.count
    #@feedback_pages = Paginator.new @feedback_count, @limit, params['page']
    #@offset ||= @feedback_pages.offset
    #@jour = @jours[@offset, @limit]
    @jour = paginateHelper @jours,10
    @state = false

    respond_to do |format|
      format.html {
        render :layout => 'base_newcontest'
      }
      format.api
    end
  end
  
  def join_in_contest
    if params[:contest_password] == @contest.password
      JoinInCompetition.create(:user_id => User.current.id, :competition_id => @contest.id)
      @state = 0
    else
      @state = 1
    end
 
    respond_to do |format|
      format.js { render :partial => 'set_join', :locals => {:user => User.current, :object_id => params[:id]} }
    end
  end
  
  def unjoin_in_contest
     
    joined = JoinInCompetition.where('competition_id = ? and user_id = ?', @contest.id, User.current.id)
            
    joined.each do |join|
      join.delete
    end
    
    respond_to do |format|
      format.js { render :partial => 'set_join', :locals => {:user => User.current, :object_id => params[:id]} }
    end
  end
  

  
  def show_participator
    render :layout => 'base_newcontest'
    
  end
  
  
  def settings
     if @contest.author.id == User.current.id 
           @contest = Contest.find(params[:id])
           render :layout => 'base_newcontest'
     else
         render_403 :message => :notice_not_contest_setting_authorized
     end
  end

  # Added by Longjun
  def destroy_contest
    @contest = Contest.find(params[:id])
    if @contest.author_id == User.current.id || User.current.admin?
      
      @contest.destroy
      redirect_to  welcome_contest_url
    else
      render_403 :message => :notice_not_contest_delete_authorized
    end
    
  end
  # end
  
  def show_contest_project
    contests = Contest.where('parent_id = ?', @contest.id)
    @projects = []
    
    # Modified by longjun
    # 用 arr.each 替换 for [ according to the style guide ]
    
    # for contest in contests
      # @projects += contest.contesting_projects
    # end
    
    contests.each do |contest|
        @projects += contest.contesting_projects
    end  
    
    # end

    respond_to do |format|
        format.html {
          render :layout => 'base_newcontest'
        }
        format.api
    end
  end

  def show_contest_softapplication
    contests = Contest.where('parent_id = ?', @contest.id)
    @softapplications = []
    
    # Modified by Longjun
    # for contest in contests
      # @softapplications += contest.contesting_softapplications
    
  
    contests.each do |contest|
        @softapplications += contest.contesting_softapplications
     end
     
     # end
     
    respond_to do |format|
        format.html {
          render :layout => 'base_newcontest'
        }
        format.api

    end
  end
  
  def show_contest_user
    contests = Contest.find(:all)
    @users = []
  
    # Modified by Longjun 
    # for contest in contests
      # for project in contest.projects
        # @users += project.users
      # end
  
    
    contests.each do |contest|
        contest.projects.each do |project|
          @users += project.users
        end
    end
    # end 
    
    respond_to do |format|
        format.html {
          render :layout => 'base_newcontest'
        }
        format.api

    end
  end
  #显示参赛的项目
  def show_project
    @membership = User.current.memberships.all(:conditions => Project.visible_condition(User.current))
    @option = []
    # @contesting_project_count = @contesting_project_all.count
    # @contesting_project_pages = Paginator.new @contesting_project_count, per_page_option, params['page']
    @membership.each do |membership|
      
      # Modified by Longjun 
      # 将两个判断语句合并
      # unless membership.project.project_type==1
        # if User.current.allowed_to?(:quote_project, membership.project)
            # @option << membership.project
        # end
      # end
      if membership.project.project_type != 1 && User.current.allowed_to?(:quote_project, membership.project)
            @option << membership.project
        
      end
      # end
      
    end
    @user = @contest.author
    @contesting_project = @contest.contesting_projects.all
    if params[:student_id].present?
      @temp = []
      @contesting_project.each do |pro|
        if pro.project && pro.project.project_status
          if /#{params[:student_id]}/ =~  pro.user.user_extensions.student_id
            @temp << pro
          end
        end
        @temp
      end
      @contesting_project = @temp
    else
  
      @temp = []
      @contesting_project.each do |pro|
        # modified by longjun
        # if pro.project && pro.project.project_status
        #   @temp << pro
        # end
        @temp << pro if pro.project && pro.project.project_status
        # end longjun
        @temp
      end
      if @temp.size > 0
          @contesting_project = @temp.sort {|a,b| b.project.project_status.grade <=> a.project.project_status.grade}
      end
    end
    @contesting_project = paginateHelper(@contesting_project)
    respond_to do |format|
      format.html {
        render :layout => 'base_newcontest'
      }     
      format.api
    end
  end 
  ############
  ##显示参赛的应用
  def show_softapplication
    
    # @membership = User.current.memberships.all(:conditions => Project.visible_condition(User.current))
    # @option = []  

    # @user = @contest.user
    @softapplication = Softapplication.all 
    @contesting_softapplication = @contest.contesting_softapplications

    @contesting_softapplication = paginateHelper(@contesting_softapplication, 10) 
    
    # @temp = []
    # @softapplicationt.each do |pro|
    #   if pro.project && pro.project.project_status
    #     @temp << pro
    #   end
    #   @temp
  
    # if @temp.size > 0
    #     @contesting_project = @temp.sort {|a,b| b.project.project_status.grade <=> a.project.project_status.grade}
    # end
    # end
    # respond_to do |format|
    #   format.html {
    #     render :layout => 'base_newcontest'
    #   }     
    #   format.api
    # end  
##########################
    @contest = Contest.find_by_id(params[:id])
    respond_to do |format|
      format.html {
        render :layout => 'base_newcontest'
      }     
      format.api
    end
  end
 
 
 ###我要参赛
 def show_attendingcontest
##取出参赛项目--项目列表
    @membership = User.current.memberships.all(:conditions => Project.visible_condition(User.current))
    @option = []
    # @contesting_project_count = @contesting_project_all.count
    # @contesting_project_pages = Paginator.new @contesting_project_count, per_page_option, params['page']
    @membership.each do |membership|
      unless membership.project.project_type==1
        #拥有编辑项目权限的可将该项目参赛
        if User.current.allowed_to?(:quote_project, membership.project)
          @option << membership.project
        end
      end
    end
    @user = @contest.author
    @contesting_project = @contest.contesting_projects.all
    if params[:student_id].present?
      @temp = []
      @contesting_project.each do |pro|
        if pro.project && pro.project.project_status
          if /#{params[:student_id]}/ =~  pro.user.user_extensions.student_id
            @temp << pro
          end
        end
        @temp
      end
      @contesting_project = @temp
    else
  
      @temp = []
      @contesting_project.each do |pro|
        # modified by longjun
        # if pro.project && pro.project.project_status
        #   @temp << pro
        # end
        @temp << pro if pro.project && pro.project.project_status
        # end longjun
        @temp
      end
      if @temp.size > 0
          @contesting_project = @temp.sort {|a,b| b.project.project_status.grade <=> a.project.project_status.grade}
      end
    end
    # 取出参赛应用   --应用列表
    @softapplication = Softapplication.all 
    @contesting_softapplication = @contest.contesting_softapplications.
      joins("LEFT JOIN softapplications ON contesting_softapplications.softapplication_id=softapplications.id").
      joins("LEFT JOIN (
              SELECT * FROM seems_rateable_cached_ratings
                  WHERE cacheable_type='Softapplication' AND DIMENSION = 'quality') AS cached
                  ON cached.cacheable_id=softapplications.id").
      order("cached.avg").reverse_order
    @contesting_softapplication = paginateHelper  @contesting_softapplication, 10
    
    
    #引用base_newcontest整体样式
    @contest = Contest.find_by_id(params[:id])
    respond_to do |format|
      format.html {
        render :layout => 'base_newcontest'
      }     
      format.api
    end  
 end
 
 ###end

  def show_notification
      @contest = Contest.find_by_id(params[:id])
      respond_to do |format|
        format.html {
          render :layout => 'base_newcontest'
        }     
        format.api
      end 
  end

 
  def set_reward_project
    @c_p = nil
    @contesting_project_id = nil

    if params[:set_reward_project][:reward]&&((User.current.id==@contest.author_id)||User.current.admin)
      # @bid_id = params[:id]
      @contesting_project_id = params[:set_reward_project][:c_id]
      @c_p = ContestingProject.find_by_id(@contesting_project_id)

      # 把字段存进表中
      @c_p.update_reward(params[:set_reward_project][:reward].to_s)
    end

    respond_to do |format|
      format.js
    end
  end
 
  def set_reward_softapplication
    @c_sa = nil
    @contesting_softapplication_id = nil

    if params[:set_reward_softapplication][:reward]&&((User.current.id==@contest.author_id)||User.current.admin)
      # @bid_id = params[:id]
      @contesting_softapplication_id = params[:set_reward_softapplication][:c_id]
      @c_sa = ContestingSoftapplication.find_by_id(@contesting_softapplication_id)

      # 把字段存进表中
      @c_sa.update_reward(params[:set_reward_softapplication][:reward].to_s)
    end

    respond_to do |format|
      format.js
    end
  end 
 
 
  ###添加已创建的参赛项目
  def add
    project = Project.find(params[:contest])
    contest_message = params[:contest_for_save][:contest_message]
    if ContestingProject.where("project_id = ? and contest_id = ?", project.id, @contest.id).size == 0
      # modified by longjun, create 写错了
      # if ContestingProject.cerate_contesting(@contest.id, project.id, contest_message)
      if ContestingProject.create_contesting(@contest.id, project.id, contest_message)
      # end longjun

        flash.now[:notice] = l(:label_bidding_contest_succeed)
      end
    else
      flash.now[:error] = l(:label_bidding_fail)
    end
    
    @contesting_project = paginateHelper @contest.contesting_projects
    
    respond_to do |format|

      format.html { redirect_to :back }
      format.js
    end
  end
  ###添加已发布的参赛应用
  def add_softapplication
    softapplication = Softapplication.find(params[:contest])
    contest_message = params[:contest_for_save][:contest_message]
    if ContestingSoftapplication.where("softapplication_id = ? and contest_id = ?", softapplication.id, @contest.id).size == 0
      if ContestingSoftapplication.create_softapplication_contesting(@contest.id, softapplication.id, contest_message)
        flash.now[:notice] = l(:label_release_add_contest_succeed)
      end
    else
      flash.now[:error] = l(:label_add_contest_succeed_fail)
    end
    
    @contesting_softapplication = paginateHelper @contest.contesting_softapplications
    
    respond_to do |format|

      format.html { redirect_to :back }
      format.js
    end
  end
  ## 新建留言
  def create

    if params[:contest_message][:message].size>0
      if params[:reference_content]
        message = params[:contest_message][:message] + "\n" + params[:reference_content]
      else
        message = params[:contest_message][:message]
      end
      refer_user_id = params[:contest_message][:reference_user_id].to_i
      @contest.add_jour(User.current, message, refer_user_id)
    end
    @user = @contest.author
    @jours = @contest.journals_for_messages.where('m_parent_id IS NULL').order('created_on DESC')
    @limit =  10
    @feedback_count = @jours.count
    @feedback_pages = Paginator.new @feedback_count, @limit, params['page']
    @offset ||= @feedback_pages.offset
    @jour = @jours[@offset, @limit]
    @contest.set_commit(@feedback_count)

    respond_to do |format|
      format.js
    end

  end

  ##删除留言
  def destroy
    @user = @contest.author
    if User.current.admin? || User.current.id == @user.id
      JournalsForMessage.delete_message(params[:object_id])
    end
    @jours = @contest.journals_for_messages.reverse
    @limit =  10
    @feedback_count = @jours.count
    @feedback_pages = Paginator.new @feedback_count, @limit, params['page']
    @offset ||= @feedback_pages.offset
    @jour = @jours[@offset, @limit]

    @contest.set_commit(@feedback_count)
    respond_to do |format|
      format.js
    end
  end

  ##引用留言
  def new
    @jour = JournalsForMessage.find(params[:journal_id]) if params[:journal_id]
    if @jour
      user = @jour.user
      text = @jour.notes
    else
      user = @contest.author
      text = @contest.description
    end
    text = text.to_s.strip.gsub(%r{<pre>((.|\s)*?)</pre>}m, '[...]')
    @content = "> #{ll(User.current.language, :text_user_wrote, user)}\n> "
    @content << text.gsub(/(\r?\n|\r\n?)/, "\n> ") + "\n\n"
    @id = user.id
    rescue ActiveRecord::RecordNotFound
    render_404
  end

  ##新建竞赛
  def new_contest
    @contest = Contest.new
    @contest.safe_attributes = params[:contest]
  end
  
  ##提交创建的竞赛
  def create_contest
    @contest = Contest.new
    @contest.name = params[:contest][:name]
    @contest.description = params[:contest][:description]
    @contest.budget = params[:contest][:budget]
    @contest.deadline = params[:contest][:deadline]
    @contest.password = params[:contest][:password]     
    @contest.author_id = User.current.id
    @contest.commit = 0
    if @contest.save
      unless @contest.watched_by?(User.current)
        if @contest.add_watcher(User.current)
          flash[:notice] = l(:label_contesting_created_succeed)
        end
      end
      redirect_to show_contest_contest_url(@contest)
    else
      @contest.safe_attributes = params[:contest]
      render :action => 'new_contest'
    end
  end

  ##更新竞赛配置信息
  def update_contest
    @contest = Contest.find(params[:id])
    @contest.name = params[:contest][:name]
    @contest.description = params[:contest][:description]
 
    @contest.budget = params[:contest][:budget]
    @contest.deadline = params[:contest][:deadline]
    @contest.password = params[:contest][:password]      
    @contest.author_id = User.current.id
    @contest.commit = 0
    if @contest.save
      unless @contest.watched_by?(User.current)
        if @contest.add_watcher(User.current)
          flash[:notice] = l(:label_contesting_updated_succeed)
        end
      end
      redirect_to show_contest_contest_url(@contest)
      
    else
      @contest.safe_attributes = params[:contest]
      render :action => 'new_contest'
    end
  end

  def more
    @jour = @contest.journals_for_messages
    @jour.each_with_index {|j,i| j.indice = i+1}
    @state = true

    respond_to do |format|
      format.html { redirect_to :back }
      format.js
    #format.api { render_api_ok }
    end
  end

  def back
    @jour = @contest.journals_for_messages
    @jour.each_with_index {|j,i| j.indice = i+1}
    @state = false

    respond_to do |format|
      format.html { redirect_to :back }
      format.js
    #format.api { render_api_ok }
    end
  end

  def set_reward
    @b_p = nil
    @contesting_project_id = nil

    if params[:set_reward][:reward]&&((User.current.id==@contest.author_id)||User.current.admin)
      # @contest_id = params[:id]
      @contesting_project_id = params[:set_reward][:b_id]   #[:b_id]???
      @b_p = ContestingProject.find_by_id(@contesting_project_id)

      # 把字段存进表中
      @b_p.update_reward(params[:set_reward][:reward].to_s)
    end

    respond_to do |format|
      format.js
    end
  end
  def watcherlist
    render :layout => 'base_newcontest'
  end



  private

  def find_contest
    if params[:id]
      @contest = Contest.find(params[:id])
      @user = @contest.author
    end
    rescue
    render_404
  end

  #验证是否显示竞赛
  def can_show_contest
    @first_page = FirstPage.find_by_page_type('project')
    if @first_page.show_contest == 2
      render_404
    end
  end

  # added by longjun
  # 将index页面中分页排序的方法抽离出来
  def index_page_sort(offset, limit, contest_count, contests, contest_sort_by)
    # modified by longjun
    # never use unless and else
    # unless @offset == 0
    if offset != 0
      contests = contests.reorder(contest_sort_by).offset(offset).limit(limit).all.reverse
    else
      limit = contest_count % limit
      limit = limit  if limit == 0
      contests = contests.reorder(contest_sort_by).offset(offset).limit(limit).all.reverse
    end
    contests
  end
end