# -*- coding: utf-8 -*-
from django.template import RequestContext
from django.shortcuts import render_to_response
from django.utils.translation import ugettext as _
from django.http import HttpResponse, Http404

from django import forms
from django.forms.models import formset_factory

from models import Translations2, Word, Tag, Form

from courses.models import UserGrade

from forms import MorfaS, MorfaV, LeksaSettings
from forms import MorfaQuestion, LeksaQuestion

# Some general notes
# 
# TODO: all of the lists and tuples of tuples which are used for conf
#		iguration take up a lot of space, and should be moved elsewhere.


# TODO: MorfaNum, MorfaAdj

# TODO: improve docstrings http://www.learningpython.com/2010/01/08/introducing-docstrings/


ISO = {
	"fi": "fin",
	"ru": "rus",
	"en": "eng",
	"no": "nob",
	"de": "deu",
	"sma": "sma",
}

def switch_language_code(CODE):
	"""
		Switches language codes from ISO 639-1 to ISO 639-2.
		
		>>> switch_language_code("no")
		"nob"
		
	"""
	try:
		return ISO[CODE]
	except:
		# logger.warning("*** Unidentified language code %s." % CODE)
		print >> sys.stdout, "*** Unidentified language code %s." % CODE
		return settings.LANGUAGE_CODE


def Index(request):
	c = {}
	return render_to_response('smaoahpa_base.html', c, 
					context_instance=RequestContext(request))


def Game(request, gametype, question_count=5):
	""" This view renders the forms and handles form post data. Forms are
		validated, but invalid forms do not provide a difference in behavior.
	"""

	settings_objects = {'MORFAS': (MorfaS, MorfaQuestion, 'New Morfa'),
						'MORFAV': (MorfaV, MorfaQuestion, 'New Morfa'),
						'LEKSA': (LeksaSettings, LeksaQuestion, 'New Leksa')}
	
	GameSettings, GameQuestion, GameName = settings_objects[gametype]

	target_language = switch_language_code(request.LANGUAGE_CODE)
	target_language = 'nob'

	if len(request.GET.keys()) > 0:
		settings = GameSettings(request.GET) 
	else:
		settings = GameSettings() 
	
	if settings.is_valid():
		options = settings.cleaned_data
	else:
		options = settings.initial_data
	
	# target_language = options['transtype'][-3::] 
	
	QuestionSet = formset_factory(GameQuestion, extra=0) 

	score = False
	show_correct = False

	if request.method == 'POST':
		formset = QuestionSet(request.POST, request.FILES)

		if formset.is_valid():
			pass

		score = sum([1 for f in formset.forms if f.correct == True])

		if formset.data.get('show_correct'):
			show_correct = True
		elif formset.data.get('test'):
			show_correct = False
	else:
		show_correct = False
		initial_data = settings.getInitialData()
		formset = QuestionSet(initial=initial_data)
	
	if score == len(formset.forms):
		all_correct = True
	else:
		all_correct = False
	
	context = RequestContext(request, {
		'formset': formset,
		'show_correct': show_correct,
		'count': len(formset.forms),
		'score': score,
		'language' :  target_language,
		'settings_form': settings,
		'all_correct': all_correct,
	})


	if context['show_correct']:
		if request.user.is_authenticated:
			points = context['score']
			total = context['count']
			new_grade = UserGrade.objects.create(user=request.user.get_profile(),
												game=GameName, 
												score=points,
												total=total)
	
	return render_to_response('drills/new_form.html', context, 
								context_instance=RequestContext(request))


