#!/bin/env python
# vim:fileencoding=utf-8:ft=python
# Geburtstage der nächsten Tage ausgeben
#
import re, datetime, os, getopt, sys

# Einstellungen laden
try:
	options  = getopt.getopt(sys.argv[1:], "cgf:s:p:")
	settings = dict(options[0])
	
	if "-f" in settings:
		gebFile = settings["-f"]
	else:
		gebFile = os.path.expanduser("~/Textdateien/Geburtstage")
	if not os.access(gebFile, os.F_OK):
		raise 1
	if "-s" in settings:
		waitTime = int(settings["-s"]) * 1000
	else:
		waitTime = 4000
except:
	try:
		noGTK = ""
		import gtk, gobject
	except:
		noGTK = "         (Da kein pyGTK installiert ist, ist dies Standard)\n"
	print ("Geburtstage anzeigen\n"
		"Syntax:\n"
		" geburtstag [-g] [-c] [-f <file>] [-s <seconds>] [-p <name>]\n"
		"   -g    Nur Text, kein GTK-Frontend\n%s"
		"   -f    Diese Datei statt ~/Textdateien/Geburtstage verwenden\n"
		"   -p    Geburtstag von <name> ausgeben\n"
		"   -s    Das Fenster nach n Sekunden automatisch schließen (Standard: 4)\n"
		"   -c    Fenster zentrieren\n\n"
		"Aufbau der Geburtstagsdatei:\n"
		" <name>\\t\\tdd.mm.yyyy\\n\t(\\t == Tabulator, \\n == Zeilenumbruch)\n"
		" Hans Peter		31.03.1988\n\n") % noGTK
	sys.exit(1)

# Geburtstage einlesen
gebDates = dict([ re.split("\t+", st.strip(), 2) for st in
	open(gebFile).readlines() ])

# Geburtstage finden
gebSoon = []
for name in gebDates.keys():
	dmy = [ int(x) for x in gebDates[name].split(".", 3) ]
	date = apply(datetime.date, list(reversed(dmy)))
	
	daysTillBd = (date - datetime.date.today().replace(year=dmy[2])).days % 360
	age = int(((datetime.date.today() - date).days + daysTillBd) / 360)

	if "-p" in settings:
		if name.lower().find(settings["-p"].lower()) > -1:
			gebSoon.append({ "name": name, "days": daysTillBd, "date": gebDates[name], "age": age })
	elif daysTillBd < 8:
		gebSoon.append({ "name": name, "days": daysTillBd, "date": gebDates[name], "age": age })
gebSoon = sorted(gebSoon, key=lambda x: x["days"])

if len(gebSoon) == 0:
	sys.exit(0)

try:
	assert "-g" not in settings
	assert "-p" not in settings
	import gtk, gobject
except:
	# Kein GTK vorhanden
	for geb in gebSoon:
		print "· %s (%d Tage, %s, %s Jahre)" % (geb["name"], geb["days"], geb["date"], geb["age"])
	sys.exit(0)

# GTK Fenster erstellen
gebWindow = gtk.Window()
gebWindow.stick()
gebWindow.set_accept_focus(False)
gebWindow.set_title("Geburtstage")
gebWindow.set_size_request(320, 10 + 15 * len(gebSoon))
gebWindow.set_resizable(False)
width, height = gebWindow.get_size()
if "-c" in settings:
	gebWindow.move((gtk.gdk.screen_width() - width) / 2, (gtk.gdk.screen_height() - height) / 2)
else:
	gebWindow.set_decorated(gtk.gdk.DECOR_ALL & (not gtk.gdk.DECOR_TITLE))
	gebWindow.set_gravity(gtk.gdk.GRAVITY_SOUTH_EAST)
	gebWindow.move(gtk.gdk.screen_width() - width, gtk.gdk.screen_height() - height)
gebText = gtk.TextView()
gebText.set_sensitive(False)
gebText.set_border_width(5)
gebText.set_editable(False)
gebWindow.add(gebText)
gebBuffer = gebText.get_buffer()
bold = gtk.TextTag("bold")
bold.set_property("weight", 900)
gebBuffer.get_tag_table().add(bold)
red = gtk.TextTag("red")
red.set_property("foreground", "#ff0000")
gebBuffer.get_tag_table().add(red)
for geb in gebSoon:
	gebBuffer.insert_with_tags_by_name(gebBuffer.get_end_iter(), "· ", "bold")
	if geb["days"] == 0:
		gebBuffer.insert_with_tags_by_name(gebBuffer.get_end_iter(), geb["name"], "bold", "red")
	elif geb["days"] < 2:
		gebBuffer.insert_with_tags_by_name(gebBuffer.get_end_iter(), geb["name"], "bold")
	else:
		gebBuffer.insert_with_tags_by_name(gebBuffer.get_end_iter(), geb["name"])
	gebBuffer.insert(gebBuffer.get_end_iter(), " (%d Tage, %s, %s Jahre)\n" % (geb["days"], geb["date"], geb["age"]))
gebWindow.connect("hide", lambda x: gtk.main_quit())
gobject.timeout_add(waitTime, lambda: gebWindow.hide())
gebWindow.set_focus(None)
gebWindow.show_all()
gtk.main()
