class Category < ActiveRecord::Base
	has_many :articles
	
	validates :name, :presence => true, :uniqueness => true
	validates :slug, :presence => true, :uniqueness => true
	
	before_validation do
		self.slug = self.name.to_slug
    self.validate_permalink
		
	end
  attr_accessor :skip_before_update, :skip_permalink
  acts_as_tree
  
  
  
  
  
  
	def generate_permalink
		r = ""
		
		node, ancestors = self, []
		ancestors << node = Category.find(node.parent_id) while node.parent_id?
		      
		
		
		ancestors.reverse.each do |ancestor|
			r += ancestor.slug.to_s
			r+= "/"
		end
		r+= self.slug.to_s
	end
	
	def set_permalink
		
		
		if !skip_permalink
			
			self.permalink = self.generate_permalink
			self.skip_permalink = true
			self.skip_before_update = true
			
			
			
			self.save

		end
		
	end
	
	
	
	def validate_permalink
		self.parent_id = nil if self.parent_id == 0
		errors.add(:parent_id, 'doit être différent de la page actuelle') if parent_id == id and id != nil
		
		if self.id
			errors.add(:parent_id, 'attention la page parente à pour page parente celle-ci = boucle') if self.parent_id and self.id == Category.find(self.parent_id).parent_id
		end

		conditions = ["parent_id "+(self.parent_id ? "=" : "IS")+" ? and slug = ? "+("and id != ?" if self.id).to_s,self.parent_id ,self.slug]
		conditions << self.id if self.id
		if Category.where(conditions).first
			errors.add(:slug, 'est déjà utilisé') 
			
		end
		

	end
	
	




	before_create do
		if !position
			top = Category.where( :parent_id => self.parent_id).order("position DESC")
			if top
				self.position = top.position.to_i + 1
			else
				self.position = 1
			end
		end
		
	end

	before_update do
	
			if self.parent_id_changed?
				
				Category.where(["position > ? and parent_id "+(self.changes['parent_id'][0] ? "=" : "IS")+" ?",self.position,self.changes['parent_id'][0]]).each do |portlet|
					portlet.position = portlet.position - 1
					portlet.save!
				end
				
				self.position = 1
				
				Category.where(["parent_id "+(self.parent_id ? "=" : "IS")+" ?",self.parent_id]).each do |portlet|
					portlet.position = portlet.position + 1

					portlet.save!
				end
				
				
				
				
			
		end
	end

	before_destroy do
		Category.where(["position > ? and parent_id "+(self.parent_id ? "=" : "IS")+" ?",self.position,self.parent_id]).each do |portlet|
			portlet.position = portlet.position - 1
			portlet.skip_before_update = true
			portlet.save!
		end

	end
  
  
  
  
  

end