# Facebook
#
# Douglas Thrift
#
# $Id$

import atom
from datetime import datetime
import gdata.calendar
import icalendar
import pytz
import re
import urllib, urllib2
import warnings

def main(calendar, config, debug):
	uid = re.compile(r'^e(.*)@facebook\.com$')
	pacific = pytz.timezone('US/Pacific')
	reminder = gdata.calendar.Reminder(hours = 2)

	with warnings.catch_warnings():
		warnings.filterwarnings('ignore', r'object\.__init__\(\) takes no parameters', DeprecationWarning)

		for event in icalendar.Calendar.from_string(urllib2.urlopen('http://www.facebook.com/ical/u.php?' + urllib.urlencode({'uid': config.get('uid'), 'key': config.get('key')})).read()).walk('vevent'):
			id = uid.match(event.decoded('uid')).group(1)
			query = gdata.calendar.service.CalendarEventQuery('default', 'private', 'full', id)
			entries = calendar.CalendarQuery(query).entry
			title = event.decoded('summary')
			content = event.decoded('description')
			status = event.decoded('partstat')
			transparency = 'OPAQUE' if status == 'ACCEPTED' else 'TRANSPARENT'
			start_time = pacific.localize(event.decoded('dtstart'))
			end_time = pacific.localize(event.decoded('dtend'))
			where = event.decoded('location')

			eid = re.compile(r'http://www\.facebook\.com/event\.php\?eid=%s$' % re.escape(id))

			if not eid.search(content):
				content += '\n\nhttp://www.facebook.com/event.php?eid=%s' % id

			if not entries:
				entry = gdata.calendar.CalendarEventEntry()
				entry.title = atom.Title(text = title)
				entry.content = atom.Content(text = content)
				entry.transparency = gdata.calendar.Transparency()
				entry.transparency.value = transparency
				entry.visibility = gdata.calendar.Visibility()
				entry.visibility.value = 'CONFIDENTIAL'

				entry.when.append(gdata.calendar.When(start_time = start_time.isoformat(), end_time = end_time.isoformat()))

				if status != 'NEEDS-ACTION':
					entry.when[0].reminder.append(reminder)

				entry.where.append(gdata.calendar.Where(value_string = where))
				calendar.InsertEvent(entry, '/calendar/feeds/default/private/full')
			else:
				for index, entry in enumerate(filter(lambda entry: eid.search(entry.content.text), entries)):
					if index == 0:
						entry.title.text = title
						entry.content.text = content
						entry.transparency.value = transparency
						entry.visibility.value = 'CONFIDENTIAL'
						entry.when[0].start_time = start_time.isoformat()
						entry.when[0].end_time = end_time.isoformat()

						if status != 'NEEDS-ACTION':
							if entry.when[0].reminder:
								entry.when[0].reminder[0] = reminder
							else:
								entry.when[0].reminder.append(reminder)

						calendar.UpdateEvent(entry.GetEditLink().href, entry)
					else:
						calendar.DeleteEvent(entry.GetEditLink().href)
