class Memo < ActiveRecord::Base
	include Redmine::SafeAttributes
	belongs_to :forum
	belongs_to :author, :class_name => "User", :foreign_key => 'author_id' 

	validates_presence_of :author_id, :forum_id, :subject
	# 若是主题帖，则内容可以是空
	validates :content, presence: true, if: Proc.new{|o| !o.parent_id.nil? }
	validates_length_of :subject, maximum: 50
	validates_length_of :content, maximum: 3072
	validate :cannot_reply_to_locked_topic, :on => :create

	acts_as_tree :counter_cache => :replies_count, :order => "#{Memo.table_name}.created_at ASC"
	acts_as_attachable
	belongs_to :last_reply, :class_name => 'Memo', :foreign_key => 'last_reply_id'
	# acts_as_searchable :column => ['subject', 'content'],
	# 					#:include => { :forum => :p}
	# 					#:project_key => "#{Forum.table_name}.project_id"
	# 					:date_column => "#{table_name}.created_at"
	acts_as_event :title => Proc.new {|o| "#{o.forum.name}: #{o.subject}"},
				  :datetime => :updated_at,
				  # :datetime => :created_at,
				  :description => :content,
				  :author => :author,
				  :type => Proc.new {|o| o.parent_id.nil? ? 'Memo' : 'Reply'},
				  :url => Proc.new {|o| {:controller => 'memos', :action => 'show', :forum_id => o.forum_id}.merge(o.parent_id.nil? ? {:id => o.id} : {:id => o.parent_id, :r => o.id, :anchor => "reply-#{o.id}"})}
	acts_as_activity_provider :author_key => :author_id,
							  :func => 'memos',
							  :timestamp => 'created_at'
							  # :find_options => {:type => 'memos'}
	# acts_as_watchable

	safe_attributes "author_id",
					"subject",
					"content",
					"forum_id",
					"last_memo_id",
					"lock",
					"sticky",
					"parent_id",
					"replies_count"

	after_create :add_author_as_watcher, :reset_counters!
	# after_update :update_memos_forum
	after_destroy :reset_counters!
	# after_create :send_notification
	# after_save :plusParentAndForum
	# after_destroy :minusParentAndForum

	# scope :visible, lambda { |*args|
	# 	includes(:forum => ).where()
	# }

	def cannot_reply_to_locked_topic
		errors.add :base, l(:label_memo_locked) if root.locked? && self != root
	end

	# def update_memos_forum
	# 	if forum_id_changed?
	# 		Message.update_all({:board_id => board_id}, ["id = ? OR parent_id = ?", root.id, root.id ])
	# 		Forum.reset_counters!(forum_id_was)
	# 		Forum.reset_counters!(forum_id)
	# 	end
	# end

	def reset_counters!
		if parent && parent.id
			Memo.update_all({:last_reply_id => parent.children.maximum(:id)}, {:id => parent.id})
			parent.update_attribute(:updated_at, Time.now)
		end
		forum.reset_counters!
	end

	def sticky?
		sticky == 1
	end

	def replies
	  Memo.where("parent_id = ?", id)
	end

	def locked?
		self.lock
	end
	
	def editable_by? user
		# user && user.logged? || (self.author == usr && usr.allowed_to?(:edit_own_messages, project))
		user.admin?
	end

	def destroyable_by? user
		(user && user.logged? && (Forum.find(self.forum_id).creator_id == user.id) ) || user.admin?
		#self.author == user || user.admin?
	end

	def deleted_attach_able_by? user
		(user && user.logged? && (self.author == user) ) || user.admin?
	end

	private

	def add_author_as_watcher
		Watcher.create(:watchable => self.root, :user => author)
	end

	def send_notification
		if Setting.notified_events.include?('message_posted')
			Mailer.message_posted(self).deliver
		end
	end

	def plusParentAndForum
		@forum = Forum.find(self.forum_id)
		@forum.memo_count = @forum.memo_count.to_int + 1
		@forum.last_memo_id = self.id
		if self.parent_id
			@parent_memo = Memo.find_by_id(self.parent_id)
			@parent_memo.last_reply_id = self
			@parent_memo.replies_count = @parent_memo.replies_count.to_int + 1
			@parent_memo.save
		else
			@forum.topic_count = @forum.topic_count.to_int + 1
		end
		@forum.save
	end

	def minusParentAndForum
		@forum = Forum.find(self.forum_id)
		@forum.memo_count = @forum.memo_count.to_int - 1
		@forum.memo_count = 0 if @forum.memo_count.to_int < 0
		# @forum.last_memo_id = Memo.reorder('created_at ASC').find_all_by_forum_id(self.forum_id).last.id
		if self.parent_id
			@parent_memo = Memo.find_by_id(self.parent_id)
			# @parent_memo.last_reply_id = Memo.reorder('created_at ASC').find_all_by_parent_id(self.parent_id).last.id
			@parent_memo.replies_count = @parent_memo.replies_count.to_int - 1
			@parent_memo.replies_count = 0 if @parent_memo.replies_count.to_int < 0
			@parent_memo.save
		else
			@forum.topic_count = @forum.topic_count.to_int - 1
			@forum.topic_count = 0 if @forum.topic_count.to_int < 0
		end
		@forum.save
	end
end
