# encoding: iso-8859-1
import os
import tempfile
import mx
import string

class Printer:
	Esc = '\x1B'

	InvalidCharacters = u'ñÑàáäÀÁÄèéëÈÉËìíïÌÍÏòóöÒÓÖùúüÙÚÜ' 
	ValidCharacters = u'nNaaaAAAeeeEEEiiiIIIoooOOOuuuUUU'

	def __init__(self):
		self.currentLine = ''
		self.lineCount = 0
		self.file, self.fileName = tempfile.mkstemp()
		self.file = os.fdopen( self.file, 'wb+' )

		# Underline (0 - Normal, 1 - Underline, 2 - Thick undreline)
		#self.file.write( Printer.Esc + '-1' )

		# Font selection (0, 1, 2)
		#self.file.write( Printer.Esc + 'M2' )

		# Print mode
		# Set underline mode
		self.file.write( Printer.Esc + '!\x20' )
		# Set normal mode
		self.file.write( Printer.Esc + '!\x00' )

		self.offset = 3
		self.pageHeight = 36
		
	def setPageHeight(self, height):
		self.pageHeight = height

	def writeLine(self, x, text):
		x += self.offset
		if not text:
			text = ''
		if x > len(self.currentLine):
			self.currentLine += ' ' * ( x - len(self.currentLine)  )
		else:
			self.currentLine = self.currentLine[:x]
		self.currentLine += self.printable( text )
		
	def write(self, x, text, maxLength = 0):
		if not text:
			text = ''
		if not type(text) in (str, unicode):
			text = str(text)

		texts = text.split('\n')
		if maxLength:
			srcTexts = texts[:]
			texts = []
			for i in xrange(len(srcTexts)):
				text = srcTexts[i]
				splits = []
				while len(text) > maxLength:
					size = maxLength
					for j in reversed(xrange(maxLength)):
						if text[j] in (' ', '\t'):
							size = j
							break
					splits.append( text[:size] )
					text = text[size:].lstrip()
				if len(text):
					splits.append( text )
				texts += splits

		if len(texts) > 1:
			for text in texts:
				self.writeLine( x, text )
				self.newLine()
		else:
			self.writeLine( x, text )

	def newLine(self, number = 1):
		self.file.write( self.currentLine + ('\n' * number) )
		self.currentLine = ''
		self.lineCount += number

	def newPage(self):
		if self.currentLine:
			self.newLine()
		lines = self.pageHeight - ( self.lineCount % self.pageHeight )
		if lines:
			self.newLine( lines )

	def close(self):
		if self.currentLine:
			self.file.write( self.currentLine )
		self.file.close()
		os.spawnlp(os.P_NOWAIT, 'lpr', 'lpr', self.fileName)

	def formatDate(self, date):
		if not date:
			return ''
		date = mx.DateTime.strptime(date, '%Y-%m-%d')
		return date.strftime('%d/%m/%Y')
		
	def formatTime(self, time):
		if not time:
			return ''
		time = mx.DateTime.strptime(time, '%H:%M:%S')
		return time.strftime('%H:%M')

	def formatNumber(self, number):
		if not number:
			number = 0.0
		return '%.2f' % number

	def printable(self, text):
		t = unicode(text, 'utf-8' )
		for x in range( len(Printer.InvalidCharacters) ):
			t = t.replace( Printer.InvalidCharacters[x], Printer.ValidCharacters[x] )
		return t.encode( 'utf-8' )

