# -*- coding: latin-1 -*-

#==========================================================================================================================================
import time
import os
import random

from Code.Constantes import *
from Code.Traducir import tr

import Util
import Gestor
import ControlPosicion

import QT.DatosNueva as DatosNueva
import QT.QTUtil2 as QTUtil2

#==========================================================================================================================================
class Control60 :
    def __init__( self, gestor, siJugador ) :

        self.db = Util.recuperaVar( "lista60.dkv" )
        # prnt len(self.db)
        # t = 0
        # b = 0
        # for x in self.db :
            # for y in x :
                # if " b " in y :
                    # b += 1
                # t += 1
        # prnt t, b
        mas = "J" if siJugador else "R"
        self.fichPuntos = "%s/puntos60%s.dkv"%(gestor.configuracion.carpeta,mas)
        if os.path.isfile( self.fichPuntos ) :
            self.liPuntos = Util.recuperaVar( self.fichPuntos )
        else :
            self.liPuntos = [[0,0]]*len(self.db)

    def guardar( self ) :
        Util.guardaVar( self.fichPuntos, self.liPuntos )

    def numDatos( self ) :
        return len(self.db)

    def primeroSinHacer( self ) :
        nd = self.numDatos()
        for i in range(nd) :
            if self.liPuntos[i][0] == 0 :
                return i
        return nd-1

    def analisis(self, fila, clave) : # compatibilidad
        return ""

    def conInformacion(self, fila, clave) : # compatibilidad
        return None

    def mueve(self, fila, clave) : # compatibilidad
        return False

    def dato( self, fila, clave ) :
        if clave == "NIVEL" :
            return str( fila + 1 )
        else  :
            tiempo, errores = self.liPuntos[fila]
            ctiempo = str(tiempo)
            ctiempo = "-" if tiempo == 0 else (ctiempo[:-2]+"."+ctiempo[-2:])
            cerrores = "-" if tiempo == 0 else str(errores)
            return ctiempo if clave == "TIEMPO" else cerrores

    def dame( self, numero ) :
        li = self.db[numero]
        pos = random.randint( 0, len(li)-1 )
        return li[pos] + " 0 1"

    def mensResultado( self, numero, tiempo, errores ) :
        ctiempo = str(tiempo)
        ctiempo = ctiempo[:-2] + "." + ctiempo[-2:]

        if self.liPuntos[numero][0] > 0 :
            t0, e0 = self.liPuntos[numero]
            siRecord = False
            if e0 > errores :
                siRecord = True
            elif e0 == errores :
                siRecord = tiempo < t0
        else :
            siRecord = True

        mensaje = "<b>%s</b> : %d<br><b>%s</b> : %d<br><b>%s</b> : %s"%( tr( "NIVEL" ), numero+1, tr("J60_ERRORES"), errores, tr( "ETI_TIEMPO" ), ctiempo )
        if siRecord :
            mensaje += "<br><br><b>%s</b><br>"%tr("J60_NUEVORECORD" )
            self.liPuntos[numero]= [tiempo,errores]
            self.guardar()

        return mensaje

#==========================================================================================================================================
class Gestor60( Gestor.Gestor ) :

    #--------------------------------------------------------------------------------------------------------------------------------
    def inicio( self, siJugador ) :

        self.siJugador = siJugador

        self.pgn = Control60( self, siJugador )

        self.pantalla.columnas60( True )

        self.finJuego()

        self.pantalla.activaJuego(True, False)
        self.quitaAyudas(True, False)
        self.pantalla.ponRotulo1( None )
        self.pantalla.ponRotulo2( None )
        self.mostrarIndicador( False )
        self.ponPiezasAbajo( True )
        self.ponMensajero( self.mueveHumano )
        self.pgnRefresh( True )
        self.pantalla.base.pgn.gotop()
        self.pantalla.tablero.siPosibleRotarTablero = False

        self.tablero.exePulsadoNum = None
        self.refresh()

    #--------------------------------------------------------------------------------------------------------------------------------
    def numDatos( self ) :
        return self.pgn.numDatos()

    #--------------------------------------------------------------------------------------------------------------------------------
    def procesarAccion( self, clave ) :

        if clave == k_finpartida :
            self.fin60()

        elif clave == k_jugar :
            self.jugar()

        elif clave == k_abandonar :
            self.finJuego()

        else :
            Gestor.Gestor.rutinaAccionDef( self, clave )

    #--------------------------------------------------------------------------------------------------------------------------------
    def fin60( self ) :
        self.pantalla.tablero.siPosibleRotarTablero = True
        self.tablero.quitaFlechas()
        self.pantalla.columnas60( False )
        self.procesador.inicio()

    #--------------------------------------------------------------------------------------------------------------------------------
    def finJuego( self ) :
        self.pantalla.ponToolBar( ( k_finpartida, k_jugar ) )
        self.desactivaTodas( )
        self.estado = kFinJuego

    #--------------------------------------------------------------------------------------------------------------------------------
    def jugar( self, numero=None ) :

        if self.estado == kJugando :
            self.estado = kFinJuego
            self.desactivaTodas()

        if numero == None :
            pos = self.pgn.primeroSinHacer()+1
            numero = DatosNueva.numEntrenamiento( self.pantalla, tr( "J60" ), \
                    pos, etiqueta=tr("NIVEL"), pos=pos, mensAdicional="<b>"+tr("J60_ORDENADO")+"</b>")
            if numero is None :
                return
            numero -= 1

        fen = self.pgn.dame( numero )
        self.numero = numero
        cp = ControlPosicion.ControlPosicion()
        cp.leeFen( fen )
        self.siBlancas = cp.siBlancas
        if self.siBlancas :
            siP = self.siJugador
        else :
            siP = not self.siJugador
        self.ponPiezasAbajo( siP )
        self.ponPosicion( cp )
        self.cp = cp
        self.refresh()
        self.ml.ponFen(fen)
        self.liMovs = self.ml.dameMovimientos()

        # Creamos un avariable para controlar que se mueven en orden
        d = {}
        fchs = "KQRBNP"
        if not cp.siBlancas :
            fchs = fchs.lower()
        for k in fchs :
            d[k] = ""
        for mov in self.liMovs :
            mov.pon_a1h8()
            mov.siElegido = False
            pz = mov.pz
            d[pz] += pz
        self.ordenPZ = ""
        for k in fchs :
            self.ordenPZ += d[k]

        self.errores = 0
        self.iniTiempo = time.clock()
        self.pendientes = len(self.liMovs)
        self.estado = kJugando

        self.tablero.quitaFlechas()

        mens = ""
        if cp.enroques :
            if ("K" if cp.siBlancas else "k" )in cp.enroques :
                mens = "O-O"
            if ("Q" if cp.siBlancas else "q" )in cp.enroques :
                if mens :
                    mens += " + "
                mens += "O-O-O"
            if mens :
                mens = tr( "ENROQUES_POSIBLES" ) + ": " + mens
        if cp.alPaso != "-" :
            mens += " " + tr( "PEON_AL_PASO" ) + " : " + cp.alPaso

        self.pantalla.ponRotulo1( mens )

        self.nivel = numero
        self.siBlancas = cp.siBlancas
        self.ponRotulo2n()

        self.pantalla.ponToolBar( ( k_abandonar, ) )
        self.pantalla.base.pgn.goto( numero, 0 )
        self.activaColor( self.siBlancas )

    #--------------------------------------------------------------------------------------------------------------------------------
    def ponRotulo2n( self ) :
        self.pantalla.ponRotulo2( "<h3>%s - %s %d - %s : %d</h3>"%( tr( "PGN_WHITE" if self.siBlancas else "PGN_BLACK" ), \
            tr( "NIVEL" ), self.nivel+1, tr( "J60_ERRORES" ), self.errores  ) )

    #--------------------------------------------------------------------------------------------------------------------------------
    def finalX( self ) :
        self.procesador.inicio()
        return False

    #--------------------------------------------------------------------------------------------------------------------------------
    def mueveHumano( self, desde, hasta, coronacion = None ) :
        #coronacion = None por compatibilidad
        if desde == hasta :
            return
        a1h8 = desde + hasta
        for mov in self.liMovs :
            if mov.a1h8 == a1h8 :
                if not mov.siElegido :
                    if mov.pz == self.ordenPZ[0] :
                        self.tablero.creaFlechaMov( desde, hasta, "m" )
                        mov.siElegido = True
                        self.ordenPZ = self.ordenPZ[1:]
                        if len(self.ordenPZ) == 0 :
                            self.ponResultado()
                    else :
                        break
                return
        self.errores += 1
        self.ponRotulo2n()

    #--------------------------------------------------------------------------------------------------------------------------------
    def ponResultado( self ) :
        tiempo = int((time.clock() - self.iniTiempo)*100.0)
        self.finJuego()
        self.ponPosicion( self.cp )

        self.refresh()

        QTUtil2.mensaje( self.pantalla, self.pgn.mensResultado( self.numero, tiempo, self.errores ) )

    #--------------------------------------------------------------------------------------------------------------------------------
    def analizaPosicion( self, fila, clave ) :
        if self.estado == kJugando :
            self.finJuego()
            return
        if fila <= self.pgn.primeroSinHacer() :
            self.jugar( fila )

    #--------------------------------------------------------------------------------------------------------------------------------
    def mueveJugada( self, tipo ) :
        fila, col = self.pantalla.pgnPosActual( )
        if tipo == "+" :
            if fila > 0 :
                fila = fila -1
        elif tipo == "-" :
            if fila < (self.pgn.numDatos()-1) :
                fila = fila +1
        elif tipo == "p" :
            fila = 0
        elif tipo == "f" :
            fila = self.pgn.numDatos()-1

        self.pantalla.base.pgn.goto(fila,0)

    #--------------------------------------------------------------------------------------------------------------------------------
    def pgnInformacion( self, fila, clave ) :
        pass # Para anular el efecto del botón derecho
