#!/usr/bin/python
# -*- coding: utf-8 -*-

import simplejson as json
import random

random.seed()

# luodaan dict jossa avaimena toimii kokonaisluku
henkilot = {
	1 : "Tommi Lahtonen", 
	2 : "Kalle Kehveli", 
	3 : "Maija Virtanen",
	4 : "Matti Virtanen",
	5 : "Ville Kehveli",
	6 : "Kalle Kehveli",
	7 : None
}

print str(henkilot)

# dict jossa avaimena on merkkijono
henkilot2 = {
	"tunniste1" : "Lammi Tohtonen", 
	"tunniste2" : "Nalle Kehveli", 
	"tunniste3" : "Miia Virtanen",
	"tunniste4" : "Ville Virtanen",
	"tunniste5" : "Kalle Kehveli",
	"tunniste6" : "Lammi Tohtonen"
}

print str(henkilot2)

# dict jossa listoja. Osassa merkkijonoja, osassa kokonaislukuja,
# osassa molempia sekaisin
jutut1 = {
	1 : ["Nalle", "Lego", "Pipo"], 
	2 : ["Lusikka","Veitsi","Haarukka", "Spork"], 
	3 : [33, 44, 55, 66, 77, 88],
	4 : [1,2,3,"Lusikka","Nalle","Pipo", 100],
	5 : [],
	6 : ["Just one"]
}

print str(jutut1)

# lista jossa dicteja
jutut2 = [
	{1:"foo", 2:"bar", 3:"foobar"},
	{10:"foo", 11:"bar", 13:"foobar"},
	{"1":"foo", "2":"bar", "3":"foobar"},
	{10:1, 11:2, 13:3},
]


print str(jutut2)

#lista jossa kaikki edelliset
kaikki = [
	henkilot, henkilot2, jutut1, jutut2
]

print str(kaikki)

# silmukassa kaikki avaimet ja niiden arvot
for i in henkilot:
	# kaatuu jos ei ole str()-funktio kaikissa. None-arvo
	# kaataa viimeisen
	print str(i) + " : " + str(henkilot[i])
	

for i in henkilot:
	# kaatuu koska kaikille ei ole arvoja jutut1-dictissa
	try:
		print "Jutut1: " + str(i) + " : " + str(jutut1[i]) 
	except:	
		print "Jutut1: " + str(i) + " : " + "Not found" 

        # silmukassa kaikki avaimet ja arvot jutut1-listasta
	# Kaatuu muilla arvoilla kuin 1,2,3
	try:
		print "Jutut2: " + str(i) + " : " + str(jutut2[i]) 
	except:	
		print "Jutut2: " + str(i) + " : " + "Not found" 

        # silmukassa kaikki avaimet ja arvot henkilot2-dictista
	# on muodostettava oikeanlainen avain
	try:
		print "Henkilot2: " + str(i) + " : " + str(henkilot2["tunniste" + str(i)]) 
	except:
		print "Henkilot2: " + str(i) + " : " + "Not Found" 

# luodaan sisakkaiset dictit joihin tallennetaan tietoja jokaisesta henkilosta

tiedot = {}

for i in henkilot:
	# taytyy kayttaa uniikkia avainta. Nimi ei kay koska samannimisia
	# voi olla useita
	# Luodaan uusi dict

	henkilo = {}
	# kopioidaan nimi
	henkilo["Nimi"] = henkilot[i]
	henkilo["Osoite"] = "Unknown"
	henkilo["Postinumero"] = "00000" 
	henkilo["Puhelin"] = "+358000000"
	henkilo["Data"] = [1,2,3,4,5,6,7,8,9,10] # whatever dataa listana
	# tallennetaan tiedot-dictiin
	tiedot[i] = henkilo

print str(tiedot)

tiedot2 = {}
# sama kuin edella mutta lyhyempana
for i in henkilot:
	tiedot2[i] = {
		"Nimi": henkilot[i],
		"Osoite": "Unknown",
		"Postinumero": "00000",
		"Puhelin": "+358000000",
		"Data" : [1,2,3,4,5,6,7,8,9,10]
	}


print str(tiedot2)

# sama kuin aiemmin mutta generoidaan satunnaista dataa
tiedot3 = {}
for i in henkilot:
	tiedot3[i] = {
		"Nimi": henkilot[i],
		"Osoite": random.choice(["Koivukuja", "Kaarnatie", "Keskuskatu", "Kotikatu", "Viitatie", "Valtatie"]) + " " + str(random.randrange(1,32,1)),
		# https://pyformat.info/#number_padding
		"Postinumero": '%05d' % random.randrange(100,99000,100),
		"Puhelin": "+358" + random.choice(["050","040", "044"]) + '%06d' % random.randrange(0,999999,1),
		"Data": random.sample(range(0,100), 10)
	}

print str(tiedot3)

# kaydaan lapi...
for key in tiedot3:
	print key,
	# sisempi dict
	for j in tiedot3[key]:
		if j != "Data":
			# kaatuu tyhjaan nimeen. Tama pitaa joko iffitella
			# tai napata poikkeus kiinni
			# tai tulostaa None jolloin riittaa str()
			try:
				print " " + j + " : " + tiedot3[key][j],
			except:
				print " " + j + " : " + "",
		else:
			# testataan onko lista vai jotain muuta
			# nyt kaikki ovat listoja mutta jos voisi olla muutakin...
			# kelpuutetaan kaikki muut tyypit paitsi basestring
			if not isinstance(tiedot3[key][j], basestring):
				print " " + j + " : ",
				for i in range(0, len(tiedot3[key][j])):				
					# ei haluta loppuun ylim. pilkkua
					if i < len(tiedot3[key][j])-1:
						print str(tiedot3[key][j][i])+",",
					else:
						print tiedot3[key][j][i],
# simppelimpi silmukka
#				for i in tiedot3[key][j]:				
#					print str(i)+",",
				
			else: # tama kaikille muille kuin listatyypeille
				print " " + j + " : " + "",
	print

# json-versiot tietorakenteista
# kelpaavat suoraan javascript-sovellukselle
# jos halutaan muuntaa json-muoto pythonin rakenteeksi niin kaytetaan
# json.loads-funktiota
print json.dumps(henkilot)
print json.dumps(henkilot2)
print json.dumps(jutut1)
print json.dumps(jutut2)
print json.dumps(tiedot)
print json.dumps(tiedot2)
print json.dumps(tiedot3)

