#! /usr/local/bin/python

# Calculate your unbirthday count (see Alice in Wonderland).
# This is defined as the number of days from your birth until today
# that weren't your birthday.  (The day you were born is not counted).
# Leap years make it interesting.

import sys
import time
import calendar

def main():
	# Note that the range checks below also check for bad types,
	# e.g. 3.14 or ().  However syntactically invalid replies
	# will raise an exception.
	if sys.argv[1:]:
		year = eval(sys.argv[1])
	else:
		year = input('In which year were you born? ')
	if year in range(100):
		print 'I\'ll assume that by', year,
		year = year + 1900
		print 'you mean', year, 'and not the early Christian era'
	elif year not in range(1850, 2000):
		print 'It\'s hard to believe you were born in', year
		return
	#
	if sys.argv[2:]:
		month = eval(sys.argv[2])
	else:
		month = input('And in which month? (1-12) ')
	if month not in range(1, 13):
		print 'There is no month numbered', month
		return
	#
	if sys.argv[3:]:
		day = eval(sys.argv[3])
	else:
		day = input('And on what day of that month? (1-31) ')
	if month == 2 and calendar.isleap(year):
		maxday = 29
	else:
		maxday = calendar.mdays[month]
	if day not in range(1, maxday+1):
		print 'There are no', day, 'days in that month!'
		return
	#
	bdaytuple = (year, month, day)
	bdaydate = mkdate(bdaytuple)
	print 'You were born on', format(bdaytuple)
	#
	todaytuple = time.localtime(time.time())[:3]
	todaydate = mkdate(todaytuple)
	print 'Today is', format(todaytuple)
	#
	if bdaytuple > todaytuple:
		print 'You are a time traveler.  Go back to the future!'
		return
	#
	if bdaytuple == todaytuple:
		print 'You were born today.  Have a nice life!'
		return
	#
	days = todaydate - bdaydate
	print 'You have lived', days, 'days'
	#
	age = 0
	for y in range(year, todaytuple[0] + 1):
		if bdaytuple < (y, month, day) <= todaytuple:
			age = age + 1
	#
	print 'You are', age, 'years old'
	#
	if todaytuple[1:] == bdaytuple[1:]:
		print 'Congratulations!  Today is your', nth(age), 'birthday'
		print 'Yesterday was your',
	else:
		print 'Today is your',
	print nth(days - age), 'unbirthday'

def format((year, month, day)):
	return '%d %s %d' % (day, calendar.month_name[month], year)

def nth(n):
	if n == 1: return '1st'
	if n == 2: return '2nd'
	if n == 3: return '3rd'
	return '%dth' % n

def mkdate((year, month, day)):
	# Januari 1st, in 0 A.D. is arbitrarily defined to be day 1,
	# even though that day never actually existed and the calendar
	# was different then...
	days = year*365			# years, roughly
	days = days + (year+3)/4	# plus leap years, roughly
	days = days - (year+99)/100	# minus non-leap years every century
	days = days + (year+399)/400	# plus leap years every 4 centirues
	for i in range(1, month):
		if i == 2 and calendar.isleap(year):
			days = days + 29
		else:
			days = days + calendar.mdays[i]
	days = days + day
	return days

main()
