class MemosController < ApplicationController
  before_action :set_memo, only: [:show, :edit, :update, :destroy]

  include ApplicationHelper
  # GET /memos
  # GET /memos.json
  def index
    @user = current_user
    @memos = Memo.all
    s_order = (params[:order] == "replies_count" ? "all_replies_count" : params[:order]) || "updated_at"
    #@tidding_count = unviewed_tiddings(current_user) if current_user.present?
    page = params[:page].to_i
    search = params[:search]
    offset = page * 15
    forum_id = params[:forum]
    user_id = params[:user_id]
    if user_id == -1
      user_id = current_user.try(:id)
    end
    tag_repertoire_id = params[:tag_repertoire_id]

    sql =
        if forum_id
          search ? "forum_id = #{forum_id} and root_id is null and subject like '%#{search}%'" :
              "forum_id = #{forum_id} and root_id is null"
        elsif search
          user_id ? "author_id = #{user_id.to_i} and forum_id in(3, 5) and root_id is null and subject like '%#{search}%'" :
              "forum_id in(3, 5) and root_id is null and subject like '%#{search}%'"
        else
          user_id ? "author_id = #{user_id.to_i} and forum_id in(3, 5) and root_id is null" :
              "forum_id in(3, 5) and root_id is null"
        end

    if tag_repertoire_id
      memo_ids = MemoTagRepertoire.where(tag_repertoire_id: tag_repertoire_id).pluck(:memo_id)
      memo_ids = memo_ids ? memo_ids.join(",") : -1
      sql += " and #{Memo.table_name}.id in(#{memo_ids})"
    end

    if params[:order] == "updated_at"
      sql += " and all_replies_count != 0"
    end

    memos = Memo.field_for_list.includes(:praise_tread, :author).where("#{sql}")
    @memos_count = memos.length
    @memos = memos.order("sticky = 1 desc, #{Memo.table_name}.#{s_order} desc").offset(offset).limit(15)
    @my_memos_count = Memo.user_posts(current_user.try(:id)).count
    @tags_info = MemoTagRepertoire.find_by_sql("SELECT tag_repertoire_id, tr.name, count(*) cnt
                                               FROM memo_tag_repertoires mtr join tag_repertoires tr on
                                               tr.id = mtr.tag_repertoire_id group by tag_repertoire_id order by cnt desc,
                                               tag_repertoire_id desc limit 9")
    @hot_memos = Memo.field_for_recommend.posts.hot.limit(4)
  end

  # GET /memos/1
  # GET /memos/1.json
  def show
    # tidding_count = unviewed_tiddings(current_user) if current_user
    @user = current_user
    # TODO 附件最后再做
    # attachments_list =
    @memo.update_column(:viewed_count, @memo.viewed_count+1)
    @memos = @memo.reply_for_memo.includes(:praise_tread, :author).order("created_at desc").limit(10)

  end

  # GET /memos/new
  def new
    @csrf_token = session[:_csrf_toke] ||= SecureRandom.base64(32)
    @tag_list = TagRepertoire.field_for_list.order("name asc")

  end

  # GET /memos/1/edit
  def edit
  end

  # POST /memos
  # POST /memos.json
  def create
    ActiveRecord::Base.transaction do
      begin
        @memo = Memo.new(memo_params)
        @memo.author = current_user
        # TODO 保存附件
        # @memo.save_attachments(params[:attachments]) if params[:attachments]
        @memo.save!
        params[:tags].each do |tag|
          MemoTagRepertoire.create(:memo_id => @memo.id, :tag_repertoire_id => tag)
        end
        @status = 0
        @message = "帖子创建成功!"
      rescue Exception => e
        @status = -1
        @message = "帖子创建失败,原因:#{e}"
        raise ActiveRecord::Rollback
      end
    end


  end

  # PATCH/PUT /memos/1
  # PATCH/PUT /memos/1.json
  def update
    respond_to do |format|
      if @memo.update(memo_params)
        format.html { redirect_to @memo, notice: 'Memo was successfully updated.' }
        format.json { render :show, status: :ok, location: @memo }
      else
        format.html { render :edit }
        format.json { render json: @memo.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /memos/1
  # DELETE /memos/1.json
  def destroy
    @memo.destroy
    respond_to do |format|
      format.html { redirect_to memos_url, notice: 'Memo was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_memo
      @memo = Memo.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def memo_params
      params.fetch(:memo, {})
    end

end