#!/usr/bin/env python
# -*- coding: utf-8 -*-
import elementary, ecore
import gettext
import calendar
import datetime



try:
	cat = gettext.Catalog("dates")
	_ = cat.gettext
except IOError:
	_ = lambda x: x

# names of the months
month_strings = [ _("January"), _("February"), _("March"), _("April"), _("May"), _("June"), _("July"), _("August"), _("September"), _("October"), _("November"), _("December") ]
# shortnames of the days
day_names = [ _("Mon"), _("Tue"), _("Wed"), _("Thu"), _("Fri"), _("Sat"), _("Sun")  ]



class MainWindow:

	def destroy(self, obj, event, *args, **kargs):
		elementary.exit()

	def __init__(self):
		self.dbus_system = None
		elementary.init()
		self.win = elementary.Window("dates", elementary.ELM_WIN_BASIC)
		self.win.title_set(_("Dates"))
		self.win.destroy = self.destroy

		# add background to main window
		bg = elementary.Background(self.win)
		self.win.resize_object_add(bg)
		bg.size_hint_weight_set(1.0, 1.0)
		bg.show()

		# main container contains the calendar and the Quit button
		self.mainbox = elementary.Box(self.win)
		self.mainbox.size_hint_weight_set(1.0, 1.0)
		self.win.resize_object_add(self.mainbox)
		self.mainbox.show()

		# quit button
		quitbt = elementary.Button(self.mainbox)
		quitbt.clicked = self.destroy      
		quitbt.label_set(_("Quit"))        
		quitbt.size_hint_align_set(-1.0, 0.0)
		#quitbt.size_hint_weight_set(1.0, 1.0)
		ic = elementary.Icon(quitbt)         
		ic.file_set( "/usr/share/pixmaps/icon_quit.png" )
		ic.smooth_set(1)                                 
		ic.scale_set(1, 1)                               
		quitbt.icon_set(ic)                              
		quitbt.show()                                    
		self.mainbox.pack_end(quitbt)

		# calendar
		today = datetime.date.today()
		self.cal = CalendarMonth(self)
		self.mainbox.pack_start(self.cal)
		self.cal.show(today.year,today.month)

		# show main window
		self.win.show()



class CalendarMonth(elementary.Table):

	# sets first day of the week
	firstweekday = calendar.MONDAY


	def __init__(self,mainwin):
		elementary.Table.__init__(self,mainwin.mainbox)
		self.mainwin = mainwin
		self.size_hint_align_set(-1.0,-1.0)
		self.size_hint_weight_set(1.0, 1.0)
		# set table homogenous
		self.homogenous_set(True)
		self.calobj = calendar.Calendar(self.firstweekday)


	def setfirstweekday(weekday):
		self.firstweekday = weekday
		self.calobj = calendar.Calendar(self.firstweekday)


	def show(self,year,month):
		elementary.Table.show(self)
		row = 0

		# put month and year in first row
		title_label = elementary.Label(self)
		self.pack(title_label,row,0,7,1)
		title_label.show()
		title_label.label_set( month_strings[ month-1 ] + " " + str(year) )

		# contains previus and next butten, located in the 9th row
		navbox = elementary.Table(self)
		navbox.homogenous_set(True)
		#navbox.size_hint_align_set(-1.0,-1.0)
		navbox.size_hint_weight_set(1.0, 1.0)
		self.pack(navbox,0,8,7,1)
		navbox.show()

		# calculate previus month
		if month <= 1:
			prevyear = year - 1
			prevmonth = 12
		else:
			prevyear = year
			prevmonth = month - 1

		# previus month button
		prevbt = elementary.Button(navbox)
		prevbt._callback_add("clicked", (self.show_month, [prevyear, prevmonth]))    
		prevbt.label_set("< " + month_strings[ prevmonth - 1 ] + " " + str(prevyear))        
		prevbt.size_hint_weight_set(1.0, 1.0)                            
		prevbt.show()                                    
		navbox.pack(prevbt,0,0,1,1)

		# calculate next month
		if month >= 12:
			nextyear = year + 1
			nextmonth = 1
		else:
			nextyear = year
			nextmonth = month + 1

		# next month button
		nextbt = elementary.Button(navbox)
		nextbt._callback_add("clicked", (self.show_month, [nextyear, nextmonth]))    
		nextbt.label_set(month_strings[ nextmonth - 1 ] + " " + str(nextyear) + " >")        
		nextbt.size_hint_weight_set(1.0, 1.0)                            
		nextbt.show()                                    
		navbox.pack(nextbt,1,0,1,1)

		# put day names in second row
		row += 1
		for e in range(0,7):
			l = elementary.Label(self)
			l.label_set(day_names[e])
			l.size_hint_align_set(0.5,0.5)
			l.show()
			self.pack(l,e,row,1,1)

		today = datetime.date.today()

		# fill rows 3 to 8 with days
		for week in self.calobj.monthdays2calendar(year, month):
			row += 1
			for (day,weekday) in week:
				if day > 0:
					bt = elementary.Button(self)
					bt.size_hint_weight_set(1.0, 1.0)
					#bt.size_hint_align_set(0.5, 0.5)
					bt._callback_add("clicked", (self.show_day, [year, month, day]))
					bt.label_set( str( day ) )
					bt.show()
					self.pack(bt,weekday,row,1,1)
					if day == today.day and month == today.month and year == today.year:
						#TODO: mark as current day
						pass


	# called when next or previus button is clicked
	def show_month(self, obj, event, arguments, *args, **kargs):
		self.mainwin.cal.delete()
		self.mainwin.cal = CalendarMonth(self.mainwin)
		self.mainwin.mainbox.pack_start(self.mainwin.cal)
		self.mainwin.cal.show(arguments[0],arguments[1])


	# called when day is clicked
	def show_day(self, obj, event, arguments, *args, **kargs):
		self.mainwin.cal.delete()
		self.mainwin.cal = CalendarDay(self.mainwin)
		self.mainwin.mainbox.pack_start(self.mainwin.cal)
		self.mainwin.cal.show(arguments[0],arguments[1],arguments[2])



class CalendarDay(elementary.Box):

	def __init__(self, mainwin):
		elementary.Box.__init__(self, mainwin.mainbox)
		#self.size_hint_align_set(-1.0,-1.0)
		self.size_hint_weight_set(1.0, 1.0)
		self.mainwin = mainwin


	def show(self, year, month ,day):
		elementary.Box.show(self)
		date = datetime.datetime(year, month, day)
		row = 0;

		# shows the current day
		title_label = elementary.Label(self)
		self.pack_end(title_label)
		title_label.label_set( str(date.date()) )
		title_label.show()

		box = elementary.Box(self)
		box.size_hint_weight_set(1.0, 1.0)
		self.pack_end(box)

		# add scroller
		scroller = elementary.Scroller(box)
		scroller.size_hint_weight_set(1.0, 1.0)
		#scroller.size_hint_align_set(-1.0, -1.0)
		scroller.show();
		box.pack_end(scroller)

		# put table into scroller
		self.table = elementary.Table(scroller)
		self.table.show()
		#self.table.size_hint_align_set(-1.0,-1.0)
		self.table.size_hint_weight_set(1.0, 1.0)
		self.table.homogenous_set(True)
		scroller.content_set(self.table)
		#self.pack_start(self.table)

		# contains back and new butten
		navbox = elementary.Table(self)
		navbox.homogenous_set(True)
		navbox.size_hint_weight_set(1.0, 1.0)
		self.pack_end(navbox)
		navbox.show()

		# back to month button
		backbt = elementary.Button(navbox)
		backbt._callback_add("clicked", (self.show_month, [year, month]))
		backbt.label_set(_("Back"))
		backbt.size_hint_weight_set(1.0, 1.0)
		backbt.show()
		navbox.pack(backbt,0,0,1,1)

		# new button
		newbt = elementary.Button(navbox)
		#newbt._callback_add("clicked", (self.show_month, [nextyear, nextmonth]))
		newbt.label_set(_("New"))
		newbt.size_hint_weight_set(1.0, 1.0)
		newbt.show()
		navbox.pack(newbt,1,0,1,1)

		# add hours to the table
		for h in range(6,23):
			row += 1
			l = elementary.Label(self.table)
			l.label_set( str(h) +"h")
			l.show()
			self.table.pack(l,0,row,1,1)


	# called when next or previus button is clicked
	def show_month(self, obj, event, arguments, *args, **kargs):
		self.mainwin.cal.delete()
		self.mainwin.cal = CalendarMonth(self.mainwin)
		self.mainwin.mainbox.pack_start(self.mainwin.cal)
		self.mainwin.cal.show(arguments[0],arguments[1])



if __name__ == "__main__":
    
	MainWindow()
	elementary.run()
	elementary.shutdown()

    

