#! /usr/bin/python
# coding: latin-1

import sys
import pickle
import re
import os
import random
import time
from PyQt4 import QtCore, QtGui

# Clase grafica
class JuegoInglesQt(QtGui.QWidget):
  # Constructor
  def __init__(self):
    super(JuegoInglesQt, self).__init__()
    # Constantes
    self.NumUlt = 10
    self.MinAciertosUlt = 9
    self.PctViejas = 1
    self.MinNuevas = 50
    # Carga diccionario
    self.mDic = {}
    fr = open("ingToEsp.txt","r")
    for lin in fr:
      vPal = lin.rstrip().split("=")
      if len(vPal)==2:
        palIng = vPal[0]
        vPalEsp = vPal[1].split(",")
        self.mDic[palIng] = vPalEsp
    fr.close()
    # Parte grafica
    grid = QtGui.QVBoxLayout()
    grid.setSpacing(10)
    #
    gUsu = QtGui.QHBoxLayout()
    lUsu = QtGui.QLabel("Usuario: ")
    gUsu.addWidget(lUsu)
    self.cUsu = QtGui.QComboBox()
    self.cUsu.addItem("usu1")
    self.cUsu.addItem("usu2")
    gUsu.addWidget(self.cUsu)
    bUsu = QtGui.QPushButton("Empezar")
    bUsu.clicked.connect( self.eligeUsuario )
    gUsu.addWidget(bUsu)
    grid.addItem(gUsu)
    #
    self.fPreg = QtGui.QGroupBox("Preguntas")
    """
    fPreg = QtGui.QFrame()
    fPreg.setWindowTitle("Preguntas")
    fPreg.setFrameStyle(QtGui.QFrame.Panel + QtGui.QFrame.Sunken)
    fPreg.setLineWidth(3)
    """
    gPreg = QtGui.QFormLayout()
    self.fPreg.setLayout(gPreg)
    fuente = self.fPreg.font()
    fuente.setPointSize(16)
    self.fPreg.setFont(fuente)
    self.lPalIng = QtGui.QLabel("???:")
    self.iPalEsp = QtGui.QLineEdit()
    self.iPalEsp.editingFinished.connect( self.comprobar )
    gPreg.addRow(self.lPalIng, self.iPalEsp)
    #
    self.lInfo = QtGui.QTextBrowser()
    fm = QtGui.QFontMetrics( self.lInfo.font() )
    self.lInfo.setMaximumHeight( 8*fm.height() )
    gPreg.addRow(self.lInfo)
    grid.addWidget(self.fPreg)
    self.fPreg.setVisible(False)
    #
    self.fEstad = QtGui.QGroupBox("Estadísticas")
    self.fEstad.setFont(fuente)
    gEstad = QtGui.QFormLayout()
    self.fEstad.setLayout(gEstad)
    self.lEstadGlobal = QtGui.QLabel("Global: ")
    gEstad.addWidget(self.lEstadGlobal)
    self.lEstadNuevas = QtGui.QLabel("Palabras nuevas: ")
    gEstad.addWidget(self.lEstadNuevas)
    self.lEstadViejas = QtGui.QLabel("Palabras viejas: ")
    gEstad.addWidget(self.lEstadViejas)
    grid.addWidget(self.fEstad)
    self.fEstad.setVisible(False)
    #
    self.setLayout(grid)
    #
    self.setWindowTitle("Traduce la palabra")
    self.setFixedSize(900, 700)
    self.show()
  #
  def eligeUsuario(self):
    self.nomFich = "%s.dat" % self.cUsu.currentText().toLatin1()
    # Carga palabras con las que jugar
    self.mPal = {}
    try:
      fr = open(self.nomFich, "r")
      self.mPal = pickle.load(fr)
      fr.close()
    except:
      pass
    #
    self.fPreg.setVisible(True)
    self.fEstad.setVisible(True)
    self.siguiente()
  #
  def siguiente(self):
    self.calculaEstadisticas()
    #
    self.preparaPalabras()
    while len(self.vNuevas) < self.MinNuevas:
      palIng = random.sample(self.mDic.keys(), 1)[0]
      if palIng not in self.mPal:
        self.mPal[palIng] = { 'total': 0, 'bien': 0, 'ult': {} }
        self.vNuevas.append(palIng)
    #
    palIng = None
    if (random.randint(0, 100) < self.PctViejas) and (len(self.vViejas) > 0):
      palIng = random.sample(self.vViejas, 1)[0]
    else:
      palIng = random.sample(self.vNuevas, 1)[0]
    #
    self.lPalIng.setText(palIng)
    self.iPalEsp.setText("")
  #
  def comprobar(self):
    palIng = str( self.lPalIng.text() )
    palEscrita = self.iPalEsp.text().toLatin1()
    #
    if palEscrita:
      acierto = False;
      for palEsp in self.mDic[palIng]:
        if palEscrita == palEsp:
          acierto = True;
      #
      self.mPal[palIng]['total'] = self.mPal[palIng]['total'] + 1
      if acierto:
        self.mPal[palIng]['bien'] = self.mPal[palIng]['bien'] + 1
        self.lInfo.setText('<b>Bien</b>: la traducción de <font color="blue">%s</font><br> es <font color="blue">%s</font>' % (palIng, ",".join(self.mDic[palIng])))
      else:
        self.lInfo.setText('<b>Mal</b>: la traducción de <font color="blue">%s</font><br> es <font color="blue">%s</font>,<br> no <font color="red">%s</font>' % (palIng, ",".join(self.mDic[palIng]), palEscrita))
      #
      if len(self.mPal[palIng]['ult']) >= self.NumUlt:
        tAntiguo = min( self.mPal[palIng]['ult'].keys() )
        del self.mPal[palIng]['ult'][tAntiguo]
      self.mPal[palIng]['ult'][time.time()] = acierto
      #
      self.siguiente()
  #
  def preparaPalabras(self):
    self.vNuevas = []
    self.vViejas = []
    for palIng in self.mPal:
      if self.esNueva(palIng):
        self.vNuevas.append(palIng)
      else:
        self.vViejas.append(palIng)
  #
  def calculaEstadisticas(self):
    nAciertosTotal = 0
    nTotal = 0
    nAciertosNuevas = 0
    nNuevas = 0
    nAciertosViejas = 0
    nViejas = 0
    for palIng in self.mPal:
      nTotal = nTotal + self.mPal[palIng]['total']
      nAciertosTotal = nAciertosTotal + self.mPal[palIng]['bien']
      if self.esNueva(palIng):
        nNuevas = nNuevas + self.mPal[palIng]['total']
        nAciertosNuevas = nAciertosNuevas + self.mPal[palIng]['bien']
      else:
        nViejas = nViejas + self.mPal[palIng]['total']
        nAciertosViejas = nAciertosViejas + self.mPal[palIng]['bien']
    #
    pct = 100.0 * nAciertosTotal / nTotal if nTotal > 0 else 0.0
    self.lEstadGlobal.setText("Todas las palabras: %d aciertos de %d -> %.1f %%" % (nAciertosTotal, nTotal, pct))
    pct = 100.0 * nAciertosNuevas / nNuevas if nNuevas > 0 else 0.0
    self.lEstadNuevas.setText("Palabras nuevas: %d aciertos de %d -> %.1f %%" % (nAciertosNuevas, nNuevas, pct))
    pct = 100.0 * nAciertosViejas / nViejas if nViejas > 0 else 0.0
    self.lEstadViejas.setText("Palabras viejas: %d aciertos de %d -> %.1f %%" % (nAciertosViejas, nViejas, pct))
  #
  def esNueva(self, palIng):
    nAciertos = 0
    for t in self.mPal[palIng]['ult']:
      if self.mPal[palIng]['ult'][t]:
        nAciertos = nAciertos + 1
    return( nAciertos < self.MinAciertosUlt )
  #
  def closeEvent(self, ev):
    fw = open(self.nomFich, "w")
    pickle.dump(self.mPal, fw)
    fw.close()
    print("%s volcado." % self.nomFich)
#
# Programa principal
#
os.chdir( os.path.dirname(sys.argv[0]) )
apli = QtGui.QApplication(sys.argv)
ventana = JuegoInglesQt()
sys.exit( apli.exec_() )
