#! /usr/bin/env python
# -*- coding: UTF-8 -*-
import matplotlib.pyplot as plt
from statistikkHelpers import *
import matplotlib.dates as mdates

def getInputType():
	inp = 0
	while not (inp == '1' or inp == '2' or inp == '3' or inp == '4'):
		print 'type 1 for user-statistics'
		print 'type 2 for product-statistics'
		print 'type 3 for global-statistics'
		print 'type 4 to enter loop-mode'
		inp = raw_input('')
	return int(inp)

def getDateFile(date, n):
	try:
		if n==0:
			inp = raw_input('start date? (yyyy-mm-dd) ')
		elif n==-1:
			inp = raw_input('end date? (yyyy-mm-dd) ')	
		year = inp.partition('-')
		month = year[2].partition('-')
		return datetime.date(int(year[0]), int(month[0]), int(month[2]))	
	except:
		print 'invalid date, setting start start date'
		if n==0:
			print 'to date found on first line'
		elif n==-1:
			print 'to date found on last line'
		print date
		return datetime.date(int(date.partition('-')[0]), int(date.partition('-')[2].partition('-')[0]), int(date.partition('-')[2].partition('-')[2]))

def dateToDateNumFile(date, startDate):
	year = date.partition('-')
	month = year[2].partition('-')
	day =  datetime.date(int(year[0]), int(month[0]), int(month[2]))
	deltaDays = day-startDate
	return int(deltaDays.days), day.weekday()

def getProducts(products):
	product = []
	products = products.partition('¤')
	product.append(products[0])
	while (products[1]=='¤'):
		products = products[2].partition('¤')
		product.append(products[0])
	return product


def piePlot(dictionary, n):
	keys = []
	values = []
	i=0
	for key in sorted(dictionary, key=dictionary.get, reverse=True):
		values.append(dictionary[key])
		if i<n:
			keys.append(key)
			i += 1
		else:
			keys.append('')
	plt.pie(values, labels=keys)


def datePlot(array, dateLine):
	if (not array == []):
		plt.bar(dateLine, array)
		plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%b'))

def dayPlot(array, days):
	if (not array == []):
		for i in range(7):
			array[i]=array[i]*7.0/days
		plt.bar(range(7), array)
		plt.xticks(range(7),['      mon','      tue','      wed','      thu','      fri','      sat','      sun'])

def graphPlot(array, dateLine):
	if (not array == []):
		plt.plot(dateLine, array)
		plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%b'))


def plotUser(database, dateLine, user, n):
	printUser(database, dateLine, user, n)
	plt.subplot(221)
	piePlot(database.personVareAntall[user], n)
	plt.xlabel('antall varer kjøpt gjengitt i antall')
	plt.subplot(222)
	datePlot(database.personDatoVerdi[user], dateLine)
	plt.xlabel('penger brukt over dato')
	plt.subplot(223)
	piePlot(database.personVareVerdi[user], n)	
	plt.xlabel('antall varer kjøpt gjengitt i verdi')
	plt.subplot(224)
	dayPlot(database.personUkedagVerdi[user], len(dateLine))
	plt.xlabel('forbruk over ukedager')
	plt.show()


def plotProduct(database, dateLine, product, n):
	printProduct(database, dateLine, product, n)
	plt.subplot(221)
	piePlot(database.varePersonAntall[product], n)
	plt.xlabel('personer som har handler produktet')
	plt.subplot(222)
	datePlot(database.vareDatoAntall[product], dateLine)
	plt.xlabel('antall produkter handlet per dag')
	#plt.subplot(223)
	plt.subplot(224)
	dayPlot(database.vareUkedagAntall[product], len(dateLine))
	plt.xlabel('antall over ukedager')	
	plt.show()

def plotGlobal(database, dateLine, n):
	printGlobal(database, dateLine, n)
	plt.subplot(231)
	piePlot(database.globalVareVerdi, n)
	plt.xlabel('varer kjøpt gjengitt som verdi')
	plt.subplot(232)
	datePlot(database.globalDatoForbruk, dateLine)
	plt.xlabel('forbruk over dato')
	plt.subplot(233)
	graphPlot(database.pengebeholdning, dateLine)
	plt.xlabel('pengebeholdning over tid (negativ verdi utgjør samlet kreditt)')
	plt.subplot(234)
	piePlot(database.globalPersonForbruk, n)
	plt.xlabel('penger brukt av personer')
	plt.subplot(235)
	dayPlot(database.globalUkedagForbruk, len(dateLine))
	plt.xlabel('forbruk over ukedager')
	plt.show()


def alt4menu(database, dateLine, useDatabase):
	n=10
	while 1:
		print '\n1: user-statistics, 2: product-statistics, 3:global-statistics, n: adjust amount of data shown q:quit'
		try:
			inp = raw_input('')
		except:
			continue	
		if inp == 'q':
			break
		elif inp == '1':
			if i=='0':
				user = raw_input('input full username: ')
			else:
				user = getUser()
			plotUser(database, dateLine, user, n)
		elif inp == '2':
			if i=='0':
				product = raw_input('input full product name: ')
			else:
				product = getProduct()
			plotProduct(database, dateLine, product, n)
		elif inp == '3':
			plotGlobal(database, dateLine, n)
		elif inp == 'n':
			try:			
				n=int(raw_input('set number to show '));
			except:
				pass
#---------------------------------------MAIN-------------------------------------
inputType=getInputType()
i = raw_input('0:fil, 1:database \n? ')
if (inputType == 1):
	if i=='0':
		user = raw_input('input full username: ')
	else:
		user = getUser()
	product = ''
elif (inputType == 2):
	if i=='0':
		product = raw_input('input full product name: ')
	else:
		product = getProduct()
	user = ''
else :
	product = ''
	user = ''
if i=='0':
	inputFile=raw_input('logfil? ')
	if inputFile=='':
		inputFile='default.dibblerlog'
	database, dateLine = buildDatabaseFromFile(inputFile, inputType, product, user)
else:
	database, dateLine = buildDatabaseFromDb(inputType, product, user)

if (inputType==1):
	plotUser(database, dateLine, user, 10)	
if (inputType==2):
	plotProduct(database, dateLine, product, 10)
if (inputType==3):
	plotGlobal(database, dateLine, 10)
if (inputType==4):
	alt4menu(database, dateLine, i)