# encoding: utf-8
#####leave message   fq
class WordsController < ApplicationController
  include ApplicationHelper
  before_filter :find_user, :only => [:new, :create, :destroy, :more, :back]
  before_filter :require_login, :only => [:create_reply]

  def create
    if params[:new_form][:user_message].size>0 && User.current.logged?
      unless params[:user_id].nil?
        if params[:reference_content]
          message = params[:new_form][:user_message] + "\n" + params[:reference_content]
        else
          message = params[:new_form][:user_message]
        end
        refer_user_id = params[:new_form][:reference_user_id].to_i
        
        list = @user.add_jour(User.current, message, refer_user_id)
        unless refer_user_id == 0 || refer_user_id == User.current.id
          list = User.find(refer_user_id).add_jour(User.current, message, refer_user_id)
        end
        @jour = list.last
      end
    end
    jours = @user.journals_for_messages.where('m_parent_id IS NULL').order('created_on DESC')
    @jour = paginateHelper jours,10

    respond_to do |format|
      format.js
    end
  end

  
  def create_reply
    # 这里是创建回复所使用的方法，此方法只针对回复，每一个新的留言并不在此方法管理范围内。
    # 由于多个地方用到了留言，而之前的表设计也有jour_type/jour_id这类信息
    # 所以在方法 add_reply_adapter 中判断所有调用此方法的来源页面，
    # 为了保证兼容以往所有的代码，保证以往的方法可以调用，在返回页面中都做了各式各样的判断。
    # 页面保证 render new_respond/journal_reply
    # 修改 add_reply_adapter 中可以确保留言创建成功
    # 删除留言功能要调用destroy，也记得在destroy.js中修改

    # deny api. api useless
    parent_id = params[:reference_id]
    author_id = User.current.id
    reply_user_id = params[:reference_user_id]
    reply_id = params[:reference_message_id] # 暂时不实现
    content = params[:user_notes]
    @show_name = params[:show_name] == "true"
    options = {:user_id => author_id,
               :status => true,
              :m_parent_id => parent_id,
              :m_reply_id => reply_id,
              :reply_id => reply_user_id,
              :notes => content, 
              :is_readed => false}
    @jfm = add_reply_adapter options
    @save_succ = true if @jfm.errors.empty?
    if @save_succ
      update_course_activity('JournalsForMessage',parent_id)
      update_user_activity('JournalsForMessage',parent_id)
      update_forge_activity('JournalsForMessage',parent_id)
      update_org_activity('JournalsForMessage',parent_id)
      update_principal_activity('JournalsForMessage',parent_id)
      (JournalsForMessage.find parent_id).update_attribute(:updated_on,Time.now)
    end
    respond_to do |format|
      # format.html {
      #   if @jfm.errors.empty?
      #     flash.now.notice = l(:label_feedback_success)
      #   else
      #     flash.now.errors = l(:label_feedback_fail)
      #   end
      #   render 'test/index'
      # }
      format.js {
        #@reply_type = params[:reply_type]
        @user_activity_id = params[:user_activity_id]
        @activity = JournalsForMessage.find(parent_id)
        @is_activity = params[:is_activity] if params[:is_activity]
      }
    end

  end
  
  def destroy
    @journal_destroyed = JournalsForMessage.find params[:object_id]
    if @journal_destroyed.destroy
      if @journal_destroyed.jour_type == "Bid"
        @bid = Bid.find(@journal_destroyed.jour_id)
        @jours_count =  @bid.journals_for_messages.where('m_parent_id IS NULL').count
      elsif @journal_destroyed.jour_type == "Course"
        @course = Course.find @journal_destroyed.jour_id
        @jours_count = @course.journals_for_messages.where('m_parent_id IS NULL').count
      elsif @journal_destroyed.jour_type == "Principal"
        @user = User.find(@journal_destroyed.jour_id)
        @jours_count = @user.journals_for_messages.where('m_parent_id IS NULL').count
        @is_user = true
        @user_activity_id = params[:user_activity_id] if params[:user_activity_id]
        @is_activity = params[:is_activity].to_i if params[:is_activity]
        @activity = @journal_destroyed.parent if @journal_destroyed.parent
        unless @activity
          redirect_to feedback_path(@user)
          return
        end
      elsif @journal_destroyed.jour_type == 'HomeworkCommon'
        @homework = HomeworkCommon.find @journal_destroyed.jour_id
        if params[:user_activity_id]
          @user_activity_id = params[:user_activity_id]
        else
          @user_activity_id = -1
        end
        @is_in_course = params[:is_in_course].to_i
        @course_activity = params[:course_activity].to_i
      end
      respond_to do |format|
        format.js
      end
    end
  end

  def destroyJournal
    @journalP=JournalsForMessage.find(params[:object_id])
    @journalP.destroy

    @page = params[:page]
    @page = @page.to_i
    @project = Project.find params[:project_id]
    # Find the page of the requested reply
    @jours = @project.journals_for_messages.where('m_parent_id IS NULL').order('created_on DESC')
    @limit =  10

    offset = @jours.count(:conditions => ["#{JournalsForMessage.table_name}.id > ?", params[:r].to_i])
    page = 1 + offset / @limit
    if params[:r] && @page.nil?
      @page = page
    end

    if @page < 0
      @page = 1
    end
    if @page > page
      @page = page
    end

    @feedback_count = @jours.count
    @feedback_pages = Paginator.new @feedback_count, @limit, @page
    @offset ||= @feedback_pages.offset
    @jour = @jours[@offset, @limit]
    @state = false
    @base_courses_tag = @project.project_type

    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 = @user
      text = []
    end
    # Replaces pre blocks with [...]
    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"
        
    # @content << text.gsub(/(\r?\n|\r\n?)/, "\n> ") + "\n\n"
    # @content = "> #{ll(Setting.default_language, :text_user_wrote, user)}\n> "
    
    @id = user.id
  rescue ActiveRecord::RecordNotFound
    render_404
  end
  
  def more
    @jours = @user.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]
    @state = true
    
    respond_to do |format|
      format.html { redirect_to :back }
      format.js
      #format.api { render_api_ok }
    end
  end
  
  def back
    @jours = @user.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]
    @state = false
    
    respond_to do |format|
      format.html { redirect_to :back }
      format.js
      #format.api { render_api_ok }
    end
  end
  
  def add_project_respond
    user = User.current
    message = params[:new_form][:project_message]
    Project.add_jour(user, message)
    
    redirect_to project_feedback_url('trustie')
    # redirect_to signin_path
  end
  
  def leave_project_message
    user = User.current
    message = params[:new_form][:project_message]
    feedback = Project.add_new_jour(user, message, params[:id])
    if(feedback.errors.empty?)
      redirect_to project_feedback_url(params[:id]), notice: l(:label_feedback_success)
    else
      flash[:error] = feedback.errors.full_messages[0]
      redirect_to project_feedback_url(params[:id])
    end
  end

  #给用户留言
  def leave_user_message
    if User.current.logged?
      @user = User.find(params[:id])
      if params[:new_form][:content].size>0 && User.current.logged? && @user
        if params[:private] && params[:private] == '1'
          @user.journals_for_messages << JournalsForMessage.new(:user_id => User.current.id, :notes => params[:new_form][:content], :reply_id => 0, :status => true, :is_readed => false, :private => 1)
        else
          @user.add_jour(User.current, params[:new_form][:content])
        end
      end
      redirect_to feedback_path(@user)
    else
      render_403
    end
  end

  # add by nwb
  def leave_course_message
    user = User.current
    message = params[:new_form][:course_message]
    feedback = Course.add_new_jour(user, message, params[:id])
    if(feedback.errors.empty?)
      if params[:asset_id]
        ids = params[:asset_id].split(',')
        update_kindeditor_assets_owner ids,feedback[:id],OwnerTypeHelper::JOURNALSFORMESSAGE
      end
      redirect_to course_feedback_url(params[:id]), notice: l(:label_feedback_success)
    else
      flash[:error] = feedback.errors.full_messages[0]
      redirect_to course_feedback_url(params[:id])
    end
  end

  #作业的回复
  def leave_homework_message
    if User.current.logged?
      @user = User.current
      @homework_common = HomeworkCommon.find(params[:id]);
      if params[:homework_message].size>0 && User.current.logged? && @user
        feedback = HomeworkCommon.add_homework_jour(@user, params[:homework_message], params[:id])
        if (feedback.errors.empty?)
          if params[:asset_id]
            ids = params[:asset_id].split(',')
            update_kindeditor_assets_owner ids,feedback[:id],OwnerTypeHelper::JOURNALSFORMESSAGE
          end
          @homework_common.update_column('updated_at', Time.now)
          update_course_activity(@homework_common.class,@homework_common.id)
          update_user_activity(@homework_common.class,@homework_common.id)
          update_org_activity(@homework_common.class,@homework_common.id)
          respond_to do |format|
            format.js{
              @user_activity_id = params[:user_activity_id]
              @is_in_course = params[:is_in_course]
              @course_activity = params[:course_activity]
              @homework_common_id = params[:homework_common_id]
            }
          end
        else
          flash[:error] = feedback.errors.full_messages[0]
        end
      end
    else
      render_403
    end
  end

  #作业的二级回复
  def reply_to_homework
    if User.current.logged?
      @user = User.current
      reply = JournalsForMessage.find params[:id].to_i
      @homework_common = HomeworkCommon.find reply.jour_id
      if params[:reply_message].size>0 && User.current.logged? && @user
        options = {:notes => params[:reply_message], :reply_id => reply.user_id,:user_id => @user.id,:m_parent_id => params[:id].to_i,:m_reply_id => params[:id].to_i}
        feedback = HomeworkCommon.add_homework_jour(@user, params[:reply_message], reply.jour_id, options)
        if (feedback.errors.empty?)
          if params[:asset_id]
            ids = params[:asset_id].split(',')
            update_kindeditor_assets_owner ids,feedback[:id],OwnerTypeHelper::JOURNALSFORMESSAGE
          end
          @homework_common.update_column('updated_at', Time.now)
          update_course_activity(@homework_common.class,@homework_common.id)
          update_user_activity(@homework_common.class,@homework_common.id)
          update_org_activity(@homework_common.class,@homework_common.id)
          respond_to do |format|
            format.js{
              @user_activity_id = params[:user_activity_id].to_i
              @is_in_course = params[:is_in_course].to_i
              @course_activity = params[:course_activity].to_i
            }
          end
        else
          flash[:error] = feedback.errors.full_messages[0]
        end
      end
    else
      render_403
    end
  end
  
  def add_brief_introdution
    user = User.current
    message = params[:new_form][:user_introduction]
    UserExtensions.introduction(user, message)
    redirect_to user_url(user.id)
  end
  
  private

  def find_user
    if params[:user_id]
      @user = User.find(params[:user_id])
    end
  rescue
    render_404
  end
  
  def obj_distinguish_url_origin
    #modify by nwb
    #添加对课程留言的支持
    referer = request.headers["Referer"]
    #referer = "http://forge.trustie.net/words/create_reply"
    obj_id = referer.match(%r(/([0-9]{1,})(/|\?|$)))[1]
    if referer.match(/project/)
      obj = Project.find_by_id(obj_id)
    elsif referer.match(/user/)
      obj = User.find_by_id(obj_id)
    elsif ( referer.match(/bids/) || referer.match(/calls/) )
      obj = Bid.find_by_id(obj_id)
    elsif ( referer.match(/contests/) || referer.match(/contests/) )   #new added
      obj = Contest.find_by_id(obj_id)
    elsif ( referer.match(/softapplications/) || referer.match(/softapplications/) )   #new added
      obj = Softapplication.find_by_id(obj_id)
    elsif ( referer.match(/homework_attach/) || referer.match(/homework_attach/) )   #new added
      obj = HomeworkAttach.find_by_id(obj_id)
    elsif referer.match(/course/)
      obj = Course.find_by_id(obj_id)
    else
      #raise "create reply obj unknow type.#{referer}"
    end
    obj
  end

  def add_reply_adapter options
    #modify by nwb
    #添加对课程留言的支持
    #留言回复应该不关系其所属的Class，而关心的是其所属的父留言
    obj = obj_distinguish_url_origin || User.find_by_id(2)
    if obj.kind_of? User
      obj.add_jour(nil, nil, nil, options)
    elsif obj.kind_of? Project
      Project.add_new_jour(nil, nil, obj.id, options)
    elsif obj.kind_of? Course
      Course.add_new_jour(nil, nil, obj.id, options)
    elsif obj.kind_of? Bid
      obj.add_jour(nil, nil, nil, options)
    elsif obj.kind_of? Contest
      obj.add_jour(nil, nil, obj.id, options)   #new added
    elsif obj.kind_of? Softapplication
      obj.add_jour(nil, nil, obj.id, options)   #new added
    elsif obj.kind_of? HomeworkAttach
      obj.add_jour(nil, nil, obj.id, options)   #new added
    else
      raise "create reply obj unknow type.#{obj.class}"
    end
  end
  #######end of message
end
