import os
import string
import time

import gobject

from pretty_time import month_name, str_time

def memo_from_node(node):
	assert node.localName == 'memo'

	def flag(attr):
		v = node.getAttribute(attr)
		if v == 'True': return True
		if v == 'False': return False
		try:
			return bool(int(v))
		except:
			return 0

	time, = node.getElementsByTagName('time')
	message, = node.getElementsByTagName('message')

	message = ''.join([n.nodeValue for n in message.childNodes])

	return Memo(float(time.childNodes[0].nodeValue),
		    message, flag('at'), flag('silent'), flag('hidden'))

class Memo(gobject.GObject):
	# 'time' is seconds since epoch
	# 'at' is TRUE if the time of day matters
	def __init__(self, time, message, at, silent = 0, hidden = 0):
		self.__gobject_init__()

		assert at == 0 or at == 1
		assert silent == 0 or silent == 1
		assert hidden == 0 or hidden == 1

		self.time = int(time)
		self.message = message.strip()
		self.at = at
		self.silent = silent
		self.hidden = hidden
		self.brief = self.message.split('\n', 1)[0]
	
	def str_when(self):
		now_y, now_m, now_d = time.localtime(time.time() + 5 * 60)[:3]
		now_m = now_m - 1

		year, month, day, hour, min = time.localtime(self.time)[:5]
		month = month - 1

		if year != now_y:
			return '%s-%d' % (month_name[month][:3], year)

		if month != now_m or day != now_d:
			return '%02d-%s' % (day, month_name[month][:3])

		if self.at:
			return str_time(hour, min)

		return _('Today')
	
	def comes_after(self, other):
		return self.time > other.time
	
	def save(self, parent):
		doc = parent.ownerDocument

		node = doc.createElement('memo')
		node.setAttribute('at', str(self.at))
		node.setAttribute('silent', str(self.silent))
		node.setAttribute('hidden', str(self.hidden))
		parent.appendChild(node)

		time = doc.createElement('time')
		time.appendChild(doc.createTextNode(str(self.time)))
		node.appendChild(time)

		message = doc.createElement('message')
		message.appendChild(doc.createTextNode(self.message))
		node.appendChild(message)
	
	def set_hidden(self, hidden):
		assert hidden == 0 or hidden == 1

		self.hidden = hidden
