#!/usr/bin/python3

import os, re

from flask import render_template, redirect, request, session

from appl import verb
from appl.forms import ConjugationForm, QuizForm

from appl import app, GitRev

@app.route('/hola')
def hola():
    return 'Hola, amigo!'

@app.route('/showverbs')
def showverbs():
    show = []
    for i in range(10):
        show.append(verb.randomverbconj())
    return render_template('simple.html',
                           body='<br>\n'.join(show),
                           title='Ten random verbs',
                           revision=GitRev)

@app.route('/')
def mainmenu():
    return render_template('menu.html',
                           name='Amigo',
                           revision=GitRev)

@app.route('/verbpractice')
def verbpractice():
    mode = request.args['mode']

    rdict = {
        'name' : 'Amigo', 
        'revision' : GitRev,
        'mode' : mode,
    }

    if mode == 'esp2ing':
        rdict['verb'] = verb.randomverb()
        rdict['title'] = 'Practice Spanish verbs'
        return render_template('verbpractice.html', **rdict)
    else:
        rdict['verb'] = verb.eng_randomverb()
        rdict['title'] = 'Practice English verbs'
        return render_template('verbpractice.html', **rdict)

@app.route('/verbpractice/<verbinf>', methods=[ 'POST' ])
def vp_inf(verbinf):
    mode = request.form['mode']

    if mode == 'eng2spa':
        return vp_eng_inf(verbinf)

    if not verb.chkspaverb(verbinf):
        redirect('/')

    rdict = {
        'name' : 'Amigo', 
        'revision' : GitRev,
        'mode' : mode,
        'verb' : verbinf,
    }

    if request.form['next'] == 'Show me':
        rdict['trans'] = verb.spa_trans_str(verbinf)
        rdict['title'] = f'Show verb: {verbinf}'
        return render_template('vp/show.html', **rdict)
    elif verb.matchtranslation(verbinf, request.form['translation']):
        rdict['trans'] = verb.spa_trans_str(verbinf)
        rdict['title'] = f'¡Correcto! — verb: {verbinf}'
        return render_template('vp/correct.html', **rdict)
    else:
        rdict['answer'] = request.form['translation']
        rdict['title'] = f'No correcto — verb: {verbinf}'
        return render_template('vp/incorrect.html', **rdict)

def vp_eng_inf(verbinf):
    mode = request.form['mode']

    if not verb.chkengverb(verbinf):
        redirect('/')

    rdict = {
        'name' : 'Amigo', 
        'revision' : GitRev,
        'mode' : mode,
        'verb' : verbinf,
    }

    if request.form['next'] == 'Show me':
        rdict['trans'] = verb.eng_trans_str(verbinf)
        rdict['title'] = f'Show verb: {verbinf}'
        return render_template('vp/show.html', **rdict)
    elif verb.matchengtranslation(verbinf, request.form['translation']):
        rdict['trans'] = verb.eng_trans_str(verbinf)
        rdict['title'] = f'Show verb: {verbinf}'
        return render_template('vp/correct.html', **rdict)
    else:
        rdict['answer'] = request.form['translation']
        rdict['title'] = f'No correcto — verb: {verbinf}'
        return render_template('vp/incorrect.html', **rdict)

@app.route('/conjpractice')
def conjpractice():
    return render_template('conjpractice.html',
                           name='Amigo',
                           verb='',
                           trans='',
                           title=f'Practice verb conjugation',
                           revision=GitRev)

@app.route('/conjpractice/<verbinf>', methods=[ 'POST' ])
def cp_inf(verbinf):
    if not verb.chkspaverb(verbinf):
        redirect('/')

    form = ConjugationForm()
    if not form.validate_on_submit():
        redirect('/conjpractice')  # no correcto! :)

    rdict = {
        'name' : 'Amigo', 
        'revision' : GitRev,
        'verb' : verbinf,
        'trans' : verb.spa_trans_str(verbinf),
        'form' : form,
    }

    if form.showme.data:
        rdict['pronoun'] = form.pronoun.data
        rdict['tense'] = form.tense.data
        rdict['title'] = \
                f'Show verb conjugation ({form.tense.data} tense): {verbinf}'
        rdict['conjugation'] = verb.conjugate(verbinf, form.tense.data,
                                   verb.pronoun2person(form.pronoun.data))
        return render_template('cp/show.html', **rdict)
    elif not form.pronoun.data:
        pronoun = verb.randompronoun()
        tense = verb.randomtense()
        rdict['pronoun'] = pronoun
        rdict['tense'] = tense
        rdict['title'] = f'Practice verb conjugation ({tense} tense): {verbinf}'
        return render_template('conjpractice.html', **rdict)
    elif form.answer.data and verb.matchconjugation(verbinf, form.tense.data,
                                       form.pronoun.data, form.answer.data):
        rdict['pronoun'] = form.pronoun.data
        rdict['tense'] = form.tense.data
        rdict['title'] = \
                f'Show verb conjugation ({form.tense.data} tense): {verbinf}'
        return render_template('cp/correct.html', **rdict)
    else:
        rdict['pronoun'] = form.pronoun.data
        rdict['tense'] = form.tense.data
        rdict['title'] = \
                f'Show verb conjugation ({form.tense.data} tense): {verbinf}'
        rdict['answer'] = form.answer.data
        form.answer.data = ''
        return render_template('cp/incorrect.html', **rdict)

def new_quiz():
    randverb = verb.randomverb()
    q = [ 
            { 
                'header' : 'Translate to English', 
                'question' : f'{randverb} in English:',
                'type' : 'trans2eng',
                'verb' : randverb,
            },
        ]

    numconj = 3
    for tn in verb.TenseNames:
        pronouns = verb.randompronouns(numconj)
        for i in range(numconj):
            d = {}
            if not i:
                d['header'] = f'Conjugate {randverb} in {tn} tense'
            d['type'] = 'conj'
            d['verb'] = randverb
            d['tense'] = tn
            pronoun = pronouns.pop()
            d['question'] = f'{pronoun} ({randverb} in {tn}):'
            d['pronoun'] = pronoun
            q.append(d)

    return q

def grade_quiz(quiz, answers, show=False):
    numwrong = 0
    for q in quiz:
        if q.get('correct'):
            if answers:
                answer = answers.pop(0)
            continue
        q['errmsg'] = None
        if q['type'] == 'trans2eng':
            if show:
                q['answer'] = verb.spa_trans_str(q['verb'])
            else:
                answer = answers.pop(0)
                if not answer:
                    numwrong += 1
                    continue
                if verb.matchtranslation(q['verb'], answer):
                    q['correct'] = answer
                else:
                    numwrong += 1
                    q['errmsg'] = f'No, "{answer}" is incorrect'
        else:   # conj
            if show:
                q['answer'] = verb.conjugate(q['verb'], q['tense'], 
                                   verb.pronoun2person(q['pronoun']))
            else:
                answer = answers.pop(0)
                if not answer:
                    numwrong += 1
                    continue
                if verb.matchconjugation(q['verb'], q['tense'], q['pronoun'],
                                                                      answer):
                    q['correct'] = answer
                else:
                    numwrong += 1
                    q['errmsg'] = f'No, "{answer}" is incorrect'

    return numwrong == 0

FormIntRE = re.compile(r'\w*-(\d+)$')
def formans(formanswers, index):
    for fa in formanswers:
        m = FormIntRE.match(fa.name)
        if m and int(m.group(1)) == index:
            return fa
    return None

@app.route('/quiz', methods=[ 'GET', 'POST'])
def quiz():
    form = QuizForm(max_questions=20)

    rdict = {
        'name' : 'Amigo', 
        'revision' : GitRev,
        'form' : form,
    }

    if request.method == 'GET':
        session['quiz'] = quiz = new_quiz()
        for i in range(len(quiz)):
            form.answers.append_entry()
            quiz[i]['formentry'] = form.answers[i](autocomplete='off')
        rdict['quiz'] = quiz
        return render_template('quiz.html', **rdict)

    # POST
    quiz = session['quiz']

    if not form.validate_on_submit():
        redirect('/')   # no

    if form.showme.data:
        grade_quiz(quiz, None, show=True)
        for n, q in enumerate(quiz):
            fa = formans(form.answers, n)
            if fa:
                fa.render_kw = { 'disabled' : True }
                q['formentry'] = fa(autocomplete='off')
        rdict['quiz'] = quiz
        rdict['finished'] = True
        return render_template('quiz.html', **rdict)

    # Submit
    myformanswers = [ None for i in range(len(quiz)) ]
    for fa in form.answers:
        m = FormIntRE.match(fa.name)
        if m:
            myformanswers[int(m.group(1))] = fa.data
        else:
            print('wtf? -- formanswers')
    finished = grade_quiz(quiz, myformanswers)
    for n, q in enumerate(quiz):
        if q.get('correct'):
            fa = formans(form.answers, n)
            if fa:
                fa.render_kw = { 'disabled' : True }
                q['formentry'] = fa(autocomplete='off')
    session['quiz'] = quiz
    rdict['quiz'] = quiz
    rdict['finished'] = finished
    return render_template('quiz.html', **rdict)
