class Page
	include Mongoid::Document
	include Mongoid::Timestamps
	include OrbitModel::Impression
	include OrbitCategory::Categorizable
		
	field :name, localize: true
	field :number, type: Integer
	field :module
	field :url
	field :page_type, type: String, default: "page"
	field :external_url, localize: true
	field :page_id
	field :layout, type: String, default: "index"
	field :data_count, type: Integer, default: 10
	field :enabled_for, type: Array, default: []
	field :enabled_for_mobile, :type => Boolean, :default => true
	field :menu_enabled_for, type: Array, default: []
	field :categories, type: Array, :default => []
	field :tags, type: Array, :default => []
	field :role_status, type: Array, :default => []
	field :member_sort_position, type: Boolean, :default => false
	field :enabled_for_sitemap, type: Array, :default => []
	field :rss2_id, type: String
	field :custom_string_field, type: String
	field :custom_array_field, type: Array, :default => []

	has_many :page_parts, :autosave => true, :dependent => :destroy
	has_many :mobile_page_parts, :autosave => true, :dependent => :destroy

	has_many :page_contexts, :autosave => true, :dependent => :destroy
	has_many :child_page, :class_name => 'Page', :inverse_of => :parent_page, :dependent => :destroy
	belongs_to :parent_page, :class_name => 'Page', :inverse_of => :child_page

	before_create :assign_page_number
	
	# after_save :clear_cache
	# after_destroy :clear_cache

	def clear_cache
		I18n.available_locales.each do |locale|
			Rails.cache.delete_matched( /main_menu/ )
		end
	end

	def assign_page_number
		parent_page = self.parent_page
		if !parent_page.nil?
			if parent_page.child_page.count == 0
				number = 0
			else
				number = parent_page.child_page.max(:number) + 1
			end
			self.number = number
		end
	end

	def parent_pages
		parent_page = self.parent_page
		pages = []
		while parent_page != nil
			pages << parent_page.id
			parent_page = parent_page.parent_page
		end
		pages
	end

	def parent_pages_without_root
		parent_page = self.parent_page
		pages = []
		while parent_page != nil
			if parent_page.parent_page_id != nil
				pages << parent_page.id
			end
			parent_page = parent_page.parent_page
		end
		pages
	end

	def to_param
		page_id.parameterize
	end

	def self.find_by_param(input)
		self.find_by(page_id: input) rescue nil
	end

	def self.root
		self.where(:parent_page_id.ne => "" , :parent_page_id.exists => false).first
	end

	def root?
		self.parent_page_id.nil?
	end

	def sorted_published_child_pages
		self.child_page.where(:menu_enabled_for => I18n.locale).asc(:number)
	end

	def sorted_published_child_pages_for_mobile
		self.child_page.where(:menu_enabled_for => I18n.locale).and(:enabled_for_mobile => true).asc(:number)
	end

	def child_pages_enabled_for_sitemap
	 	self.child_page.where(:enabled_for_sitemap => I18n.locale).asc(:number)
	end

	def child_pages_enabled_for_sitemap_for_mobile
	 	self.child_page.where(:enabled_for_sitemap => I18n.locale).and(:enabled_for_mobile => true).asc(:number)
	end

	def published_child_pages
	    self.child_page.where(:menu_enabled_for => I18n.locale).asc(:number)
	end

	def published_child_pages_for_mobile
	    self.child_page.where(:menu_enabled_for => I18n.locale).and(:enabled_for_mobile => true).asc(:number)
	end
end