#!/usr/bin/python
# -*- coding: utf-8 -*-
# Small hack that can send todo items to mobile phones
# Please set the "bluetooth_addr" parameter below...
#
# Dependencies:
#   bluetooth-sendto
#   python-vobject
#   python-gtk2
#
# Thomas Perl <thpinfo.com>, 2008-10-30

import gtk
import gobject
import datetime
import vobject
import tempfile
import threading
import os

class TodoToMobile(gtk.Dialog):
    APPNAME = 'New todo item'
    bluetooth_addr = os.environ['NOKIA_5310']

    def __init__(self):
        gtk.Dialog.__init__(self, self.APPNAME, None, gtk.DIALOG_MODAL, (gtk.STOCK_CLOSE, gtk.RESPONSE_CANCEL, gtk.STOCK_ADD, gtk.RESPONSE_OK))
        self.connect('destroy', gtk.main_quit)
        self.connect('response', self.on_response)

        self.vbox.set_spacing(6)
        self.hbox = gtk.HBox(spacing=6)
        self.hbox.set_border_width(10)
        self.vbox.pack_start(self.hbox)
        self.hbox.pack_start(gtk.Label('Todo:'), expand=False)
        self.summary = gtk.Entry()
        self.summary.connect('key-press-event', self.on_key_press)
        self.hbox.add(self.summary)

        self.calendar = gtk.Calendar()
        self.calendar.connect('day-selected', lambda c: gobject.idle_add(self.summary.grab_focus))
        self.expander = gtk.Expander('Due date for this item')
        self.expander.add(self.calendar)
        self.vbox.add(self.expander)

        self.set_resizable(False)
        self.move(200, 200)
        self.show_all()
        gobject.threads_init()
        gtk.main()

    def create_todo_object(self, summary, due):
        ics = vobject.iCalendar()
        todo = ics.add('vtodo')
        todo.add('summary').value = summary
        todo.add('due').value = due
        return ics

    def send_todo(self, summary, due):
        fp = tempfile.NamedTemporaryFile(suffix='.vcs')
        fp.write(self.create_todo_object(summary, due).serialize().encode('utf-8'))
        fp.flush()
        os.system('bluetooth-sendto --device=%s "%s"' % (self.bluetooth_addr, fp.name))
        fp.close()
        gobject.idle_add(self.summary.set_text, '')
        gobject.idle_add(self.summary.set_sensitive, True)
        gobject.idle_add(self.summary.grab_focus)

    def get_pydate(self, gtkdate):
        (year, month, day) = gtkdate
        month += 1
        return datetime.date(year, month, day)

    def on_key_press(self, button, event):
        if event.keyval == gtk.keysyms.Return:
            self.on_response(self, gtk.RESPONSE_OK)

    def on_response(self, dialog, response_id):
        if response_id == gtk.RESPONSE_CANCEL:
            self.destroy()
        elif response_id == gtk.RESPONSE_OK:
            self.summary.set_sensitive(False)
            summary = self.summary.get_text()
            if self.expander.get_expanded():
                due = self.get_pydate(self.calendar.get_date())
            else:
                due = datetime.datetime.now()
            threading.Thread(target=self.send_todo, args=[summary, due]).start()

TodoToMobile()


