#!/usr/bin/env python
print 'running pages update'
import os
import datetime
import re

basedir = os.getcwd()
heididir = open('heididir').read().strip()

largetablesize = '800x600'
smallsize = '200x150'

parts = 'include_header,include_main_column,include_side_column,include_nav_end'.split(',')
partdict = {}
for part in parts:
	partdict.update({part:open(part+'.html').read()})

def bashsafe(cmd):
	cmd = cmd.replace(' ','\ ')
	cmd = cmd.replace('(','\(')
	cmd = cmd.replace(')','\)')
	cmd = cmd.replace("'","\'")
	return cmd
def ensurepathexists(path):
	if not os.path.exists(path):
		os.system('mkdir -p %s'%bashsafe(path))
def weblink(folder):
	return folder.replace(' ','%20')
def prettydate(date):
	#return date.strftime('%A, %B %e %Y')
	return date.strftime('%a, %B %e, %y')
def allfolders(path):
	listing = os.listdir(path)
	folders = filter(lambda x:os.path.isdir(os.path.join(path,x)),listing)
	return folders
test = """
title 1
http 1
desc 1

title 2
http 2
desc 2

title 3
http 3

title 4
http 4
desc 4"""

def readlinks(text):
	linkre = re.compile('[\n\r]*(.+)[\n\r]{1,2}(.+)[\n\r]{1,2}(.*)[\n\r]*')
	links = []
	while 1:
		myre = linkre.search(text)
		if myre:
			links.append(myre.groups())
			text = text[myre.end():]
		else:
			break
	links.sort(lambda x,y:cmp(x[0],y[0]))
	return links

def readvideos(text):
	return readlinks(text)



#generate main, only need function to make include_side_column

datere = re.compile('([0-9]{4})-([0-9]{2})-([0-9]{2})[ -]+(.*)')

def findtextold(path):
	files = os.listdir(path)
	textfiles = filter(lambda x:x[-4:].lower()=='.txt',files)
	if textfiles:
		return open(os.path.join(path,textfiles[0])).read()
	else:
		return ''

def findtext(path):
	return formattext_general(findtextold(path))

def findalltext(path):
	files = os.listdir(path)
	textfiles = filter(lambda x:x[-4:].lower()=='.txt',files)
	text = ''
	if textfiles:
		for file in textfiles:
			text += open(os.path.join(path,file)).read()
	else:
		return ''
	return text
	

def formattext_detectlinks(text):
	i=0
	linkre = re.compile('(http://[\S]*)')
	if 0:
		while 1:
			result = linkre.search(text,i)
			if result:
				a,b = result.start(),result.end()
				text = text.replace(text[a:b],'<a href="%s">%s</a>'%(text[a:b],text[a:b]))
				i=b+(b-a)+len('<a href=""></a>')
				print len(text)
			else:
				break
	return text
			
		

def formattext_contact(text):
	text = text.replace('\n','<br>')
	return text
def formattext_classes(text):
	text = text.replace('\n','<br>')
	return text
def formattext_general(text):
	text = text.replace('\n','<br>')
	text = text.replace('\x92',"'")
	text = formattext_detectlinks(text)
	return text

def findtextfile(path):
	files = os.listdir(path)
	textfiles = filter(lambda x:x[-4:].lower()=='.txt',files)
	if textfiles:
		return os.path.join(path,textfiles[0])

def readformattextfile(path):
	fo = open(path)
	text = fo.read()
	text = formattext_general(text)
	return text

def filterimages(files):
	images = filter(lambda x:x[-4:].lower() in ['.jpg','.png','.gif'],files)
	images.sort()
	return images

def tablefy(list_of_things,cols=2):
	n = 1
	toreturn = '\n<table border=0 cellspacing=15>'
	for thing in list_of_things:
		if n % cols == 1:
			toreturn += '<tr>'
		toreturn += '<td>%s</td>\n'%thing
		if n % cols == 0:
			toreturn += '</tr>'
		n += 1
	if n % cols != 1:
		toreturn += '</tr></table>'
	else:
		toreturn += '</table>'
	return toreturn

def gallery(base,showtitle=False):
	html = ''
	folders = os.listdir(os.path.join(heididir,base))
	folders.sort(lambda x,y:cmp(x,y))
	folders = filter(lambda x:os.path.isdir(os.path.join(heididir,base,x)),folders)
	for folder in folders:
		#get first image for preview
		images = filterimages(os.listdir(os.path.join(heididir,base,folder)))
		text = findtext(os.path.join(heididir,base,folder))
		if images:
			image = images[0]
			html += """<p><a href="/%s/%s">"""%(base,folder)
			html += """<img src="/%s/%s/%s/%s"></a>\n"""%(base,folder,'small',image)
			if showtitle:
				html += """<br>%s<br>"""%folder
			html += """<br>%s"""%text
	return html

def goodforgallery(images):
	if len(images) == 1 and images[0].lower().find('flyer') != -1 or images[0].lower().find('main') != -1:
		return False
	else:
		return True

def combinegallery(base1,base2,showtitle=False):
	html = ''
	folders = []
	base1folders = allfolders(os.path.join(heididir,base1))
	base2folders = allfolders(os.path.join(heididir,base2))
	for f in base1folders:
		folders.append([base1,f])
	for f in base2folders:
		folders.append([base2,f])
	folders.sort(lambda x,y:-cmp(x[1],y[1]))
	for base,folder in folders:
		#get first image for preview
		images = filterimages(os.listdir(os.path.join(heididir,base,folder)))
		text = findtext(os.path.join(heididir,base,folder))
		if images and goodforgallery(images): #and also not just a stupid flyer...
			image = images[0]
			html += """<p><a href="/%s/%s">"""%(base,folder)
			html += """<img src="/%s/%s/%s/%s"></a>\n"""%(base,folder,'small',image)
			#if showtitle:
			html += """<br>%s<br>"""%folder
			#html += """<br>%s"""%text
	return html
	

def subgallery(base,dir,textafter=False):
	html = ''
	files = os.listdir(os.path.join(heididir,base,dir))
	text = findtext(os.path.join(heididir,base,dir))
	#look for main image, so as not to resize it
	mainimage = filter(lambda x:x.lower().find('main image')!=-1,files)
	if mainimage:
		files.remove(mainimage[0])
		html += """<img src="/%s/%s/%s">""" %(base,dir,mainimage[0])
	if base == 'eventsp':
		text = formattext_general(text)
	if not textafter:
		html += """<p>%s<p>""" % text
	files = filterimages(files)
	loi = []
	for file in files:
		mystr = ''
		mystr += """<a href="/%s/%s/%s">\n""" %(base,dir,file)
		mystr += """<img src="/%s/%s/%s/%s"></a>\n""" %(base,dir,'small',file)
		loi.append(mystr)
	html += tablefy(loi)
	if textafter:
		html += """<p>%s<p>""" % text
	return html

class Page:
	def __init__(self,nav='',sub=None):
		self.fullsidebar = False
		self.nav = nav
		self.sub = sub
	def make_header(self):
		return partdict['include_header']
	def make_nav_end(self):
		return partdict['include_nav_end']
	def make_main_column(self):
		html = """\n<!-- begin body -->\n"""
		if self.nav == '':
			html += """<div id="column1">"""
			html += """<h2>%s</h2>"""%"She'enedra"
			#return partdict['include_main_column']
			html += findtext(heididir)
		elif self.nav == 'about':
			html += """<div id="column1">"""
			html += """<h2>%s</h2>"""%self.nav.capitalize()
			html += """
			These pages were designed my Kyle Graehl.<br>
			<a href="http://kgraehl.org">kgraehl.org</a>
			<p>These scripts generate all the pages from some data and images on a samba share.
			<a href="/pages.py">pages.py (create pages)</a>
			<a href="/updateimages.py">updateimages.py (make sure thumbnails and images are resized)</a>
			<p>This is so that my Mom (who got me to make this site) can update the website without having to use any html or special program. She just puts images and some dummy text file into the appropriate events or video or photoshoot folder.
			"""
		else:
			html += """<div id="column1">"""
			html += """<h2>%s</h2>"""%self.nav.capitalize()
			if self.nav == 'gallery' or self.nav == 'events' or self.nav == 'members':
				if self.nav == 'events':
					self.fullsidebar = True
				#check if sub, too!, if sub, then we are on a small gallery
				if self.sub:
					if self.nav == 'members':
						#mom wants the bio text to come after the pictures
						html += subgallery(self.nav,self.sub,True)
					else:
						html += subgallery(self.nav,self.sub)
				else:
					if self.nav == 'members':
						html += """<p>(Click on a member for more photos)"""
						html += gallery(self.nav,True)
					elif self.nav == 'gallery':
						html += """<p>(Click on a picture for more photos)"""
						html += combinegallery(self.nav,'events')
					else:
						html += """<p>(Click on a picture for more photos)"""
						html += gallery(self.nav) #if gallery, also get pictures from events!
			elif self.nav == 'videos':
				textfile = findtextfile(os.path.join(heididir,self.nav))
				text = open(textfile).read()
				links = readvideos(text)
				for title,http,desc in links:
					html += """<p><a href="%s">%s</a><br>%s"""%(http,title,desc)
				#now also read videos from events
			elif self.nav == 'classes':
				html += formattext_general(findalltext(os.path.join(heididir,self.nav)))
			elif self.nav == 'contact':
				html += findtext(os.path.join(heididir,self.nav))
			elif self.nav == 'links':
				textfile = findtextfile(os.path.join(heididir,self.nav))
				text = open(textfile).read()
				links = readlinks(text)
				links.sort(lambda x,y:cmp(x[0],y[0]))
				for title,http,desc in links:
					html += """<p><a href="%s">%s</a><br>%s"""%(http,title,desc)
		html += """</div><!-- end col 1 -->"""
		html += """\n<!-- end body -->\n"""
		return html
	def make_side_column(self):
		#have to do more special stuff here
		pass
		#now = datetime.datetime.now().strftime('%A, %B %e %Y')
		#today =  datetime.datetime.now()
		today = datetime.date.today()
		#collect future events
		eventdirs = os.listdir(os.path.join(heididir,'events'))
		eventlist = []
		for dir in eventdirs:
			#parse!
			myre = datere.search(dir)
			if myre:
				year,month,day,desc = myre.groups()
				year,month,day = map(int,[year,month,day])
				date = datetime.date(year,month,day)
				eventlist.append([dir,date,desc])
		eventlist.sort(lambda x,y:-cmp(x[1],y[1]))
		futureevents = []
		pastevents = []
		for dir,date,desc in eventlist:
			if date >= today: #future
				futureevents.append([dir,date,desc])
			else:
				pastevents.append([dir,date,desc])
		if not self.fullsidebar:
			numnonfullsidebar = 10
			pastevents = pastevents[:numnonfullsidebar]
		html = """<div id="column2"><dl class="portlet"><dt class="portletHeader">Upcoming Events</dt>"""
		n = 0
		for dir,date,desc in futureevents:
			n += 1
			if n%2 == 0:
				evenodd = 'odd'
			else:
				evenodd = 'even'
			html += """<dd class="portletItem %s"><a class="dir_event" href="/events/%s">%s<span class="portletItemDetails">%s</span></a></dd>"""%(evenodd,weblink(dir),desc,prettydate(date))
		html += """<dl class="portlet"><dt class="portletHeader">Past Events</dt>"""
		n = 0
		for dir,date,desc in pastevents:
			n += 1
			if n%2 == 0:
				evenodd = 'odd'
			else:
				evenodd = 'even'
			html += """<dd class="portletItem %s"><a class="dir_event" href="/events/%s">%s<span class="portletItemDetails">%s</span></a></dd>"""%(evenodd,weblink(dir),desc,prettydate(date))
		html += """<dd class="portletFooter"><a href="/events">see more past events...</a></dd></dl></div><p>&nbsp;<p>&nbsp;<p>&nbsp;<p>&nbsp;<p>&nbsp;<p>&nbsp;<p>&nbsp;<p>&nbsp;<!-- end col 2 -->"""
		return html
	def make_all(self):
		return self.make_header() + self.make_main_column() + self.make_side_column() + self.make_nav_end()

navs = ',gallery,videos,members,classes,contact,links,events,about'.split(',')
navdict = {'gallery':allfolders(os.path.join(heididir,'gallery')),\
		   'members':allfolders(os.path.join(heididir,'members')),\
		   'events':allfolders(os.path.join(heididir,'events'))}

for nav in navs:
	page = Page(nav,None)
	ensurepathexists(os.path.join(basedir,nav))
	fo = open(os.path.join(basedir,nav,'index.html'),'w')
	fo.write(page.make_all())
	fo.close()
	if navdict.has_key(nav):
		for sub in navdict[nav]:
			page = Page(nav,sub)
			ensurepathexists(os.path.join(basedir,nav,sub))
			fo = open(os.path.join(basedir,nav,sub,'index.html'),'w')
			fo.write(page.make_all())
			fo.close()


print 'made pages'
