from django.template import Context, RequestContext, loader
from django.db.models import Q
from django.http import HttpResponse, Http404
from django.shortcuts import get_list_or_404, render_to_response
from django.utils.translation import ugettext as _

from random import randint

#from django.contrib.admin.views.decorators import _encode_post_data, _decode_post_data

from game import *
from forms import *
from qagame import *

# comment this out
# DEBUG = open('/dev/ttys001', 'w')

from courses.models import UserGrade

class Gameview:
	def init_settings(self):

		show_data=0
		self.settings = {}

		self.gamenames = {
			'ATTR' :  _('Practise attributes'),
			'ATTRPOS' :  _('Practise attributes in positive'),
			'ATTRCOMP' :  _('Practise attributes in comparative'),
			'ATTRSUP' :  _('Practise attributes in superlative'),
			'PREDPOS' :  _('Practise predicative in positive'),
			'PREDCOMP' :  _('Practise predicative in comparative'),
			'PREDSUP' :  _('Practise predicative in superlative'),
			'NUM-ATTR' :  _('Practise numeral attributes'),
			'NOMPL' :  _('Practise plural'),
			'N-ILL' :  _('Practise illative'),
			'N-ACC' :  _('Practise accusative'),
			'N-COM' :  _('Practise comitative'),
			'N-ESS' :  _('Practise essive'),
			'N-GEN' :  _('Practise genitive'),
			'N-NOM-PL' :  _('Practise plural'),
			'N-INE' :  _('Practise inessive'),
			'N-ELA' :  _('Practise elative'),
			'NUM-ILL' :  _('Practise numerals in illative'),
			'NUM-ACC' :  _('Practise numerals in accusative'),
			'NUM-COM' :  _('Practise numerals in comitative'),
			'NUM-ESS' :  _('Practise numerals in essive'),
			'NUM-GEN' :  _('Practise numerals in genitive'),
			'NUM-NOM-PL' :  _('Practise numerals in plural'),
			'NUM-LOC' :  _('Practise numerals in locative'),
			'COLL-NUM' :  _('Practise collective numerals'),
			'ORD-NUM' :  _('Practise ordinal numbers'),
			'PRS'   :  _('Practise present'),
			'PRT'   : _('Practise past'),
			'COND'  : _('Practise conditional'),
			'IMPRT' : _('Practise imperative'),
			'POT'   : _('Practise potential'),
			'V-COND'  : _('Practise conditional'),
			'V-IMPRT' : _('Practise imperative'),
			'V-POT'   : _('Practise potential') }

	
	def syll_settings(self,settings_form):
		self.settings['syll'] = []
		if 'bisyllabic' in settings_form.data:
			self.settings['syll'].append('bisyllabic')
		if 'trisyllabic' in settings_form.data:
			self.settings['syll'].append('trisyllabic')
		if 'contracted' in settings_form.data:
			self.settings['syll'].append('contracted')
		if len(self.settings['syll']) == 0:
			self.settings['syll'].append('bisyllabic')		
	
	
	def create_morfagame(self, request):
		count, correct = 0, 0
				
		if request.method == 'POST':
			data = request.POST.copy()
			
			# Settings form is checked and handled.
			settings_form = MorfaSettings(request.POST)
			
			for k in settings_form.data.keys():
				self.settings[k] = settings_form.data[k]
				
			if request.session.has_key('dialect'):
				self.settings['dialect'] = request.session['dialect']

			if hasattr(request, 'LANGUAGE_CODE'):
				self.settings['language'] = request.LANGUAGE_CODE
				
			self.syll_settings(settings_form)
			# if settings_form.data.has_key('level'):
			# 				self.settings['level'] = settings_form.levels[settings_form.data['level']]
			if settings_form.data.has_key('source'):
							self.settings['source'] = settings_form.source[settings_form.data['source']]
			
			self.settings['allcase'] = settings_form.allcase
			
			# Create game
			if self.settings['gametype'] == "bare":
				game = BareGame(self.settings)
			else:
				# Contextual morfa
				game = QAGame(self.settings)
				game.init_tags()
			
			# If settings are changed, a new game is created
			# Otherwise the game is created using the user input.
			
			# TODO: this doesn't seem to be working. no settings in data, 
			# even when settings are changed.
			
			if "settings" in data:
				game.new_game()
			else:
				game.check_game(data)
				game.get_score(data)

			if 'test' in data:
				game.count = 1
			if "show_correct" in data:
				show_correct = 1
		
		# If there is no POST data, default settings are applied
		else:
			settings_form = MorfaSettings()

			# Find out the default data for this form.
			for k in settings_form.default_data.keys():
				if not self.settings.has_key(k):
					self.settings[k] = settings_form.default_data[k]
			# self.settings['level'] = settings_form.levels[settings_form.default_data['level']]
			self.settings['source'] = settings_form.default_data['source']
			if request.session.has_key('dialect'):
				self.settings['dialect'] = request.session['dialect']
			
			if hasattr(request, 'LANGUAGE_CODE'):
				self.settings['language'] = request.LANGUAGE_CODE
			
			if self.settings['gametype'] == "bare":
				game = BareGame(self.settings)		
			else:
				# Contextual morfa
				game = QAGame(self.settings)
				game.init_tags()
			game.new_game()
		if self.settings['pos'] == "N":
			if self.settings['gametype'] == "bare":
				
				self.settings['gamename'] = self.gamenames[self.settings['case']]
			else:
				self.settings['gamename'] = self.gamenames[self.settings['case_context']]
		if self.settings['pos'] == "Num":
			if self.settings['gametype'] == "bare":
				self.settings['gamename'] = self.gamenames[self.settings['num_bare']]
			else:
				self.settings['gamename'] = self.gamenames[self.settings['num_context']]				
		if self.settings['pos'] == "V":
			if self.settings['gametype'] == "bare":
				self.settings['gamename'] = self.gamenames[self.settings['vtype']]
			else:
				self.settings['gamename'] = self.gamenames[self.settings['vtype_context']]
		if self.settings['pos'] == "A":
			if self.settings['gametype'] == "bare":
				self.settings['gamename'] = self.gamenames[self.settings['adjcase']]
			else:
				self.settings['gamename'] = self.gamenames[self.settings['adj_context']]
		c = RequestContext(request, {
			'settingsform': settings_form,
			'settings' : self.settings,
			'forms': game.form_list,
			'count': game.count,
			'score': game.score,
			'comment': game.comment,
			'all_correct': game.all_correct,
			'show_correct': game.show_correct,
			'language' : self.settings['language'],
			})
		return c


def oahpa(request):
	c = RequestContext(request, {
		'jee': "joku arvo",
		})
	return render_to_response('oahpa_base.html', c, context_instance=RequestContext(request))

def updating(request):
	c = RequestContext(request, {
		'jee': "joku arvo",
		})
	return render_to_response('drills/updating.html', c, context_instance=RequestContext(request))

class Quizzview(Gameview):	
	def placename_settings(self, settings_form):
		
		self.settings['frequency'] = []
		self.settings['geography']= []
		
		if 'common' in settings_form.data:
			self.settings['frequency'].append('common')
		if 'rare' in settings_form.data:
			self.settings['frequency'].append('rare')
		if 'world' in settings_form.data:
			self.settings['geography'].append('world')
		if 'sapmi' in settings_form.data:
			self.settings['geography'].append('sapmi')
		if 'suopma' in settings_form.data:
			self.settings['geography'].append('suopma')
		
		if len(self.settings['frequency']) == 0:
			self.settings['frequency'].append('common')		
		if len(self.settings['geography']) == 0:
			self.settings['geography'].append('sapmi')		
	
	def create_leksagame(self, request):
		if request.method == 'POST':
			data = request.POST.copy()
			
			# Settings form is checked and handled.
			settings_form = LeksaSettings(data)
			# Possible old form should be passed here
			for k in settings_form.data.keys():
				if not self.settings.has_key(k):
					self.settings[k] = settings_form.data[k]

			if request.session.has_key('dialect'):
				self.settings['dialect'] = request.session['dialect']
			
			if hasattr(request, 'LANGUAGE_CODE'):
				self.settings['language'] = request.LANGUAGE_CODE
			
			self.placename_settings(settings_form)
			self.settings['allsem'] = settings_form.allsem
			# self.settings['level'] = settings_form.levels[settings_form.data['level']]
			
			game = QuizzGame(self.settings)
				
			if "settings" in data:
				game.new_game()
			else:
				game.check_game(data)
				game.get_score(data)

			if 'test' in data:
				game.count = 1
			if "show_correct" in data:
				game.show_correct = 1
		
		# If there is no POST data, default settings are applied
		else:
			settings_form = LeksaSettings()
			self.placename_settings(settings_form)
			
			for k in settings_form.default_data.keys():
				if not self.settings.has_key(k):
					self.settings[k] = settings_form.default_data[k]

			if request.session.has_key('dialect'):
				self.settings['dialect'] = request.session['dialect']
			
			if hasattr(request, 'LANGUAGE_CODE'):
				self.settings['language'] = request.LANGUAGE_CODE
			
			game = QuizzGame(self.settings)
			game.new_game()
		
		
		c = Context({
			'settingsform': settings_form,
			'forms': game.form_list,
			'count': game.count,
			'score': game.score,
			'comment': game.comment,
			'all_correct': game.all_correct,
			'show_correct': game.show_correct,
			})
		
		return c
	


def leksa_game(request):
	leksagame = Quizzview()
	leksagame.init_settings()

	c = leksagame.create_leksagame(request)
	# Not true or false
	if c['show_correct'] == 1:
		if request.user.is_authenticated:
			points, _, total = c['score'].partition('/')
			new_grade = UserGrade.objects.create(user=request.user.get_profile(),
												game='Leksa',
												score=points,
												total=total)
	return render_to_response('drills/quizz.html', c, context_instance=RequestContext(request))


class Numview(Gameview):
	def create_numgame(self,request):
		if request.method == 'POST':
			data = request.POST.copy()
			
			# Settings form is checked and handled.
			settings_form = NumSettings(data)
			
			for k in settings_form.data.keys():
				if not self.settings.has_key(k):
					self.settings[k] = settings_form.data[k]
				
			if request.session.has_key('dialect'):
				self.settings['dialect'] = request.session['dialect']
				
			if hasattr(request, 'LANGUAGE_CODE'):
				self.settings['language'] = request.LANGUAGE_CODE
			
			game = NumGame(self.settings)
				
			if "settings" in data:
				game.new_game()
			else:
				game.check_game(data)
				game.get_score(data)
			
			if 'test' in data:
				game.count=1
			if "show_correct" in data:
				game.show_correct = 1
            
		
		# If there is no POST data, default settings are applied
		else:
			settings_form = NumSettings()
		
			for k in settings_form.default_data.keys():
				if not self.settings.has_key(k):
					self.settings[k] = settings_form.default_data[k]

			game = NumGame(self.settings)
			game.new_game()

		#numstring=0
		#if game.form_list[0].has_key('numstring'):
		#	numstring=1
		
		c = Context({
			'settingsform': settings_form,
			'forms': game.form_list,
			'count': game.count,
			'score': game.score,
			'comment': game.comment,
			'all_correct': game.all_correct,
			'show_correct': game.show_correct,
		 #   'numstring': numstring,
			})
		return c


def num(request):
	numgame = Numview()
	numgame.init_settings()
	numgame.settings['gametype'] = "card"
	
	c = numgame.create_numgame(request)
	return render_to_response('drills/num.html', c, 
								context_instance=RequestContext(request))


def morfa_game(request, pos):
	"""
		View for Morfa game. Requires pos argument, ['N', 'V', 'A', 'Num']
	"""
	mgame = Gameview()
	mgame.init_settings()
	mgame.settings['pos'] = pos.upper()
	mgame.settings['gametype'] = "bare"
	
	template = 'drills/mgame_%s.html' % pos.lower()
	c = mgame.create_morfagame(request)
	
	if c['show_correct'] == 1:
		if request.user.is_authenticated and not request.user.is_anonymous:
			points, _, total = c['score'].partition('/')
			new_grade = UserGrade.objects.create(user=request.user.get_profile(),
												game='Morfa',
												score=points,
												total=total)
	
	return render_to_response(template, c, 
								context_instance=RequestContext(request))


