# Copyright (c) 2012 Web Notes Technologies Pvt Ltd.
# License: GNU General Public License (v3). For more information see license.txt

from __future__ import unicode_literals

frame_xml = """<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">%s
</urlset>"""

link_xml = """\n<url><loc>%s</loc><lastmod>%s</lastmod></url>"""

# generate the sitemap XML
def generate(domain):
	global frame_xml, link_xml
	import urllib, os
	import webnotes
	import webnotes.webutils
	from webnotes.utils import nowdate

	# settings
	max_items = 1000
	count = 0
	
	site_map = ''
	if domain:
		today = nowdate()
		
		# generated pages
		for doctype, opts in webnotes.webutils.get_generators().items():
			pages = webnotes.conn.sql("""select page_name, `modified`
				from `tab%s` where ifnull(%s,0)=1
				order by modified desc""" % (doctype, opts.get("condition_field")))
		
			for p in pages:
				if count >= max_items: break
				if p[0]:
					page_url = os.path.join(domain, urllib.quote(p[0]))
					modified = p[1].strftime('%Y-%m-%d')
					site_map += link_xml % (page_url, modified)
					count += 1
				
			if count >= max_items: break
		
		# standard pages
		for page, opts in webnotes.get_config()["web"]["pages"].items():
			if "no_cache" in opts:
				continue
			
			if count >= max_items: break
			page_url = os.path.join(domain, urllib.quote(page))
			modified = today
			site_map += link_xml % (page_url, modified)
			count += 1

	return frame_xml % site_map
