#!/usr/bin/env python
import sys
import datetime
frankierart={
	0x01:'Stampit 2003',
	0x02:'0x02???',
	0x03:'Frankit',
	0x05:'Filiale',
	0x07:'Frankierservice Infopost/Infobrief',
	0x08:'Premiumadress',
	0x09:'Pressepost Randbeschriftung 52x52 Module, Version 1',
	0x0c:'Frankit PremA???',
	0x12:'DV-Freimachung',
	0x18:'Elektroreturn',
	0x19:'Pressepost Etikett, Version1',
	0x1a:'Pressepost Randbeschriftung 16x28 Module, Version 1',
	0x1c:'Premiumadress Label',
	0x30:'Plusbrief',
	0x33:'Stampit',
	0x42:'Plusbrief/Marke individuell',
	0x4d:'Handyporto?',
	0x52:'Elektroreturn',
	0x66:'Handyporto?',
	#0x33:'Marke individuell',
	0x85:'Internetmarke'
	
}
productid={
	1:'Standardbrief',
	2:'Standardbrief Einschreiben Einwurf',
	7:'Standardbrief Einschreiben',
	8:u'Standardbrief Einschreiben + R\xfcckschein',
	9:u'Standardbrief Einschreiben + Eigenh\xe4ndig',
	10:u'Standardbrief Einschreiben + Eigenh\xe4ndig + R\xfcckschein',
	11:'Kompaktbrief',
	21:u'Gro\xdfbrief',
	32:'Maxibrief',
	51:'Postkarte',
	76:u'B\xfcchersendung Standard',
	77:u'B\xfcchersendung Kompakt',
	78:u'B\xfcchersendung Gro\xdf',
	79:u'B\xfcchersendung Maxi',
	80:u'Warensendung Standard',
	81:u'Warensendung Kompatk',
	82:u'Warensendung Maxi',
	83:u'Warensendung Standard',
	86:'Infobrief/Katalog Standard',
	87:'Infobrief/Katalog Kompakt',
	88:u'Infobrief/Katalog Gro\xdf',
	89:'Infobrief/Katalog Maxi',
	90:'Infopost/Katalog',
	450:'Pressesendung E+0',
	451:'Pressesendung E+1',
	452:'Pressesendung E+2',
	453:'Postvertriebsstk. E+0',
	454:'Postvertriebsstk. E+1',
	455:'Postvertriebsstk. E+2',
	2743:u'Gro\xdfbrief, international <500g',
	3106:'Infopost/Katalog Kompakt',
	3101:'Infopost/Katalog Kompakt >20g',
	3107:u'Infopost/Katalog Gro\xdf',
	3108:u'Infopost/Katalog Maxi',
	3104:u'Infopost/Katalog Maxi >20g',
	3105:u'Infopost/Katalog Maxi >100g',
	9001:'Standardbrief PremA',
	9279:'Pressesendung E+0 PremA',
	9280:'Pressesendung E+1 PremA',
	9287:'Pressesendung E+2 PremA'
}
frankmaschmanuf={
	0x1d:'Neopost',
	0x2d:'Frama',
	0x3d:'Francotyp-Postalia',
	0x4d:'Pitney Bowes',
	0x6d:'Telefrank'}
# Write a Data Matrix barcode
#dm_write = DataMatrix()
#dm_write.encode("Hello, world!")
#dm_write.save("hello.png", "png")

def decodedm(str1):
	print len(str1)
	print str1.encode('hex')
	if str1.startswith('DEA'):
		frankierartnum=ord(str1[3])
		frankierartname=frankierart.get(frankierartnum)
		print 'Frankierart %d %s'%(frankierartnum,frankierartname)
		if frankierartnum == 0x07:
			print 'Briefzentrum %d' % ord(str1[4])
		if frankierartnum != 0x1c:
			proid=ord(str1[14])*2**8+ord(str1[15]) 
			print 'Produkt-ID %d %s'%(proid,productid.get(proid))
		if frankierartnum == 0x03 or frankierartnum ==5:
			print 'Frankierwert %d Eurocent'%(
			ord(str1[10])*2**8+ord(str1[11]) )
		if frankierartnum == 0x85:
			print 'Kundennummer %s'%str1[9:14].encode('hex')
			num=ord(str1[4])*2**32+ord(str1[5])*2**24+\
				ord(str1[6])*2**16+ord(str1[7])*2**8+\
				ord(str1[8])
			print'Fortlaufende Nummer (dez) %d' %num
		if frankierartnum == 0x03 or frankierartnum == 0x19 or\
		frankierartnum == 0x1a or frankierartnum == 0x09  or\
		frankierartnum == 0x0c or frankierartnum == 0x05:
			datein=ord(str1[12])*2**8+ord(str1[13]) 
			year=datein%100+2000
			day=datein/100
			date=datetime.date.fromordinal(datetime.date(year,1,1).toordinal()-1+day)
			print 'Einlieferungsdatum: %s'% date.strftime('%a %d.%m.%Y')			
		if frankierartnum == 0x03 or frankierartnum == 0x33:
			
			print 'Preisliste %d' % ord(str1[4])
			frankmasch=str1[5:10].encode('hex')
			print 'Frankiermaschine %s Hersteller %s'%(frankmasch,\
			frankmaschmanuf.get(int(frankmasch[0:2],16)))
			
		if str1[3]=='\x19' or str1[3]=='\x1A' or str1[3]=='\x09':
			print 'Zeitungskennziffer %d'%(
			(ord(str1[5])*2**16+ord(str1[6])*2**8 +ord(str1[7])) )
			#print str1[5:8].encode('hex')
			#print 'Zeitungskennziffer %d'% int(str1[5:8],256)
			print 'Heftnummer %d'%(
			ord(str1[8])*2**8+ord(str1[9]) )
			print 'Premiumaddress-ID %d'%(
			ord(str1[16])*2**8+ord(str1[17]) )
			print 'Abonentennummer %s' % str1[18:42]
			if str1[3]=='\x19' or str1[3]=='\x09':
				print 'PLZ Ort %d %s'%((ord(str1[42])*2**16+\
				ord(str1[43])*2**8 +ord(str1[44])),\
				str1[45:69].strip())
				print  u'Stra\xdfe %s' % str1[69:91]
				print 'Hausnummer %s' % str1[91:101]
				print 'Name1 %s' % str1[101:131]
				print 'Name2 %s' % str1[131:161]
				print 'Name3 %s' % str1[161:191]
				print 'Kd-Inv Info %s' % str1[191:202].strip()
			elif str1[3]=='\x1A':
				print 'Kd-Inv Info %s' % str1[42:47]
			#print 'Referenz %s' % str1[0x12:]
		
	else:
		print str1;

# Read a Data Matrix barcode
def handleargc():
	for filename in sys.argv[1:]:
		if filename.endswith('.bin'):
			decodedm(str1=open(filename,'rb').read())
		else:
        		from pydmtx import DataMatrix
		        from PIL import Image
			dm_read = DataMatrix()
			img = Image.open(sys.argv[1])

			dm_read.decode(img.size[0], img.size[1], buffer(img.tostring()))
			#print dm_read.count()
			#print dm_read.stats(1)
			decodedm(dm_read.message(1))

try:
	import android
	droid = android.Android()
	code = droid.scanBarcode()
	str2=code.result['extras']['SCAN_RESULT']
	if True: #procedute to identify hex encoding
		decodedm(str2.replace(' ','').decode('hex'))
except ImportError:
	if len(sys.argv) == 1:
		decodedm(raw_input())
	else:
		handleargc()