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

#==========================================================================================================================================
import os

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

import PGN
import SQL
import Util

import Gestor

import QT.QTUtil as QTUtil
import QT.QTUtil2 as QTUtil2
import QT.Controles as Controles
import QT.Iconos as Iconos
import QT.PantallaPGN as PantallaPGN

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

    #--------------------------------------------------------------------------------------------------------------------------------
    def inicio( self ) :
        self.tipoJuego = kJugPGN
        self.estado = kFinJuego
        self.nuestroFichero = self.configuracion.salvarFichero
        self.siNuestroFichero = self.nuestroFichero and os.path.isfile( self.nuestroFichero )

        liOpciones = [ k_pgnFin,k_pgnPaste,k_pgnFichero,k_jugadadia ]

        if self.configuracion.liTrasteros :
            liOpciones.append( k_trasteros )

        if self.siNuestroFichero :
            liOpciones.append( k_pgnNuestroFichero )

        self.tablero.ponPosicion( self.procesador.posicionInicial )
        self.mostrarIndicador( False )
        self.pantalla.ponToolBar( liOpciones )
        self.pantalla.activaJuego( False, False )
        self.quitaCapturas()
        self.refresh()
    #--------------------------------------------------------------------------------------------------------------------------------
    def procesarAccion( self, clave ) :

        if clave == k_pgnFin :
            self.finPartida()

        elif clave == k_pgnPaste :
            self.paste()

        elif clave == k_pgnFichero :
            self.fichero(siBuscar = True)

        elif clave == k_pgnNuestroFichero :
            self.fichero(siNuestro = True)

        elif clave == k_trasteros :
            self.trasterosMenu()

        elif clave == k_pgnInformacion :
            self.informacion()

        elif clave == k_otros :
            liMasOpciones = (( "libros", tr( "LIBRO_CONSULTA" ), Iconos.TB_Libros() ), )
            resp = self.otros(liMasOpciones)
            if resp == "libros" :
                self.libros( "P" ) # gestor

        elif clave == k_pgnFicheroRepite :
            self.ficheroRepite()

        elif clave == k_jugadadia :
            self.jugadaDia()

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

    #--------------------------------------------------------------------------------------------------------------------------------
    def finPartida( self ) :
        self.quitaCapturas()
        self.procesador.inicio()

    #--------------------------------------------------------------------------------------------------------------------------------
    def finalX( self ) :
        self.finPartida()
        return False

    #--------------------------------------------------------------------------------------------------------------------------------
    def trasterosMenu( self ) :
        menu = Controles.LMenu(puntos=10)

        icoTras = Iconos.Trastero()
        liTras = self.configuracion.liTrasteros
        for ntras, uno in enumerate(liTras) :
            carpeta, trastero = uno
            menu.opcion( ntras, "%s  (%s)"%(trastero,carpeta), icoTras )
            menu.separador()

        icoTras = Iconos.Trastero()
        resp = menu.lanza()
        if resp is not None:
            carpeta, trastero = liTras[resp]
            path = os.path.join( carpeta, trastero )
            self.fichero( path = path )

    #-----------------------------------------------------------------------------------
    def paste( self ) :
        texto = QTUtil.traePortapapeles()
        if texto :
            pgn = PGN.UnPGN()
            pgn.leeTexto( str(texto) )
            if pgn.siError :
                QTUtil2.mensError( self.pantalla, tr( "PGN_PEGADOERRONEO" ) )
                return
            self.pgnPaste = texto
            self.mostrar( pgn, False )

    #-----------------------------------------------------------------------------------
    def jugadaDia( self ) :
        me = self.unMomento()
        dia = Util.hoy().day
        lid = Util.LIdisk( "Openings/31.pkl" )
        dic = lid[dia]
        lid.close()
        txt = dic["PGN"]
        pgn = PGN.UnPGN()
        pgn.leeTexto( txt )
        me.final()
        if pgn.siError :
            return
        self.pgnPaste = txt
        self.mostrar( pgn, False )

    #-----------------------------------------------------------------------------------
    def mostrar( self, pgn, siRepiteFichero, siBlancas = None ) :

        me = self.unMomento()
        self.partida.leeOtra( pgn.partida )
        self.listaAperturasStd.asignaApertura( self.partida )
        blancas = pgn.variable( "WHITE" )
        negras = pgn.variable( "BLACK" )
        resultado = pgn.variable( "RESULT" )

        if siBlancas is None :
            siBlancas = not self.partida.siEmpiezaConNegras
        self.siJugamosConBlancas = siBlancas
        self.tablero.ponerPiezasAbajo( siBlancas )

        self.pantalla.activaJuego(True,False)
        self.quitaAyudas()
        self.ponRotulo1( "%s : <b>%s</b><br>%s : <b>%s</b>"%(tr("PGN_WHITE"),blancas,tr("PGN_BLACK"),negras) )
        self.ponRotulo2( "%s : <b>%s</b>"%( tr( "GM_RESULTADO" ), resultado ) )

        self.tablero.desactivaTodas()

        self.pgnRefresh(siBlancas)
        self.pgnMueve( 0, siBlancas )
        self.pantalla.pgnColocate( 0, 2 if self.partida.siEmpiezaConNegras else 1 )
        self.ponCapturasPorDefecto()

        self.ponVista()
        me.final()

        liOpciones = [  k_pgnFin,k_pgnInformacion,k_pgnPaste,k_pgnFichero,k_jugadadia ]
        if siRepiteFichero :
            liOpciones.insert( 2, k_pgnFicheroRepite )
        if self.siNuestroFichero :
            liOpciones.append( k_pgnNuestroFichero )
        liOpciones.append( k_otros )
        self.pantalla.ponToolBar( liOpciones )

    #-----------------------------------------------------------------------------------
    def fichero( self, siNuestro = False, siBuscar = False, path = "" ) :
        self.siFicheroNuestro = siNuestro
        if siNuestro :
            path = self.nuestroFichero
        elif siBuscar :
            # Elegimos el fichero
            path = QTUtil2.leeFichero( self.pantalla, self.configuracion.dirPGN, "pgn" )
            if not path :
                return
            carpeta, fichero = os.path.split(path)
            if self.configuracion.dirPGN != carpeta :
                self.configuracion.dirPGN = carpeta
                self.configuracion.graba()
        #~ else ya está el nombre

        fpgn = PGN.PGN()

        self.tmpProceso = 0
        self.tmpBP = None

        def control( proceso, porcentaje ) :
            if proceso != self.tmpProceso :
                if self.tmpProceso > 0 :
                    self.tmpBP.cerrar()
                    if proceso == 3 : #Nos ha mandado la señal de final
                        return True
                self.tmpProceso = proceso
                rotulo = tr( "PGN_F1LEYENDO", path ) if proceso == 1 else tr( "PGN_F2CONVIRTIENDO", path )
                self.tmpBP = QTUtil2.BarraProgreso( self.pantalla, rotulo,rotulo, 100 ).mostrar()
            self.tmpBP.pon( porcentaje )
            return not self.tmpBP.siCancelado()

        dicDB = fpgn.leeFichero( path, control )
        if dicDB is None :
            return

        self.ficheroMostrar( dicDB, False )

    #-----------------------------------------------------------------------------------
    def ficheroRepite( self ) :
        self.ficheroMostrar( self.dicDB, True )

    #-----------------------------------------------------------------------------------
    def ficheroMostrar( self, dicDB, siRepite ) :

        dClaves = dicDB["DICCLAVES"]

        bd = SQL.Base.DBBase( dicDB["PATHDB"] )

        if (not siRepite) and self.siFicheroNuestro :
            orden = "ROWID DESC"
        else :
            orden = ""
        dbf = bd.dbf( "JUEGOS", ",".join(dClaves.keys()), orden = orden ) # La lectura se hace en la pantalla, para que la haga en el mismo sitio tanto siRepite como si no

        estadoWpgn = dicDB["ESTADOWPGN"] if siRepite else None

        siSeguir, estadoWpgn, siSeHaBorradoAlgo = PantallaPGN.elegirPGN( self.pantalla, dbf, dClaves, self, estadoWpgn )
        if siSeguir :
            me = self.unMomento()
            rid = dbf.rowid( dbf.recno )
            self.dicDB = dicDB
            dicDB["ESTADOWPGN"] = estadoWpgn
            dbf.cerrar()
            dbf = bd.dbfT( "JUEGOS", ",".join(dClaves.keys())+",JUGADAS", condicion="ROWID=%d"%rid )
            dbf.leer()
            dbf.gotop()
            dicDatos = dbf.dicValores()
            texto = ""
            for clave in estadoWpgn.liOrdenClaves :
                valor = dicDatos[clave]
                if valor :
                    texto += '[%s "%s"]\n'%( clave[0]+clave[1:].lower(), valor )
            self.pgnPaste = texto + dicDatos["JUGADAS"]
            texto += dicDatos["JUGADAS"]
            dbf.cerrar()
            pgn = PGN.UnPGN()
            pgn.leeTexto( texto )
            siMostrar = not pgn.siError
            me.final()
            if not siMostrar :
                QTUtil2.mensError( self.pantalla, tr( "PGN_JUGADAERRONEA" ) )

        else :
            siMostrar = False

        bd.cerrar()

        if siSeHaBorradoAlgo :
            fpgn = PGN.PGN()
            fpgn.borraReferenciaA( dicDB["FICHERO"] )

        if siMostrar :
            self.mostrar( pgn, True )

    #--------------------------------------------------------------------------------------------------------------------------------
    def informacion( self ) :
        li = self.pgnPaste.split( "\n" )

        menu = Controles.LMenu(puntos=10)

        clave = ""

        for linea in li :
            if linea.startswith( "[" ) :
                ti = linea.split( '"' )
                if len(ti) == 3 :
                    clave = ti[0][1:].strip()
                    siFecha = clave.upper().endswith("DATE")
                    if clave.upper() == "OPENING" :
                        continue
                    ctra = "PGN_" + clave.upper()
                    trad = tr( ctra )
                    if trad != ctra :
                        clave = trad
                    else :
                        clave = clave[0].upper()+clave[1:].lower()
                    valor = ti[1].strip()
                    if siFecha :
                        valor = valor.replace( ".??", "" )
                    menu.opcion( clave, "%s : %s"%(clave,valor), Iconos.PuntoAzul() )

        apertura = self.partida.apertura
        if apertura :
            menu.separador()
            nom = tr( apertura.nombre )
            ape = tr("PGN_OPENING")
            rotulo = nom if ape.upper() in nom.upper() else ("%s : %s"%(ape,nom))
            menu.opcion( clave, rotulo, Iconos.PuntoNaranja() )

        menu.lanza()

    #-----------------------------------------------------------------------------------
    def actualPGN( self ) :

        # cabecera será el inicio de pgnpaste
        txt = self.pgnPaste.strip()
        cab = ""
        for linea in txt.split( "\n" ) :
            if linea.startswith( "[" ) :
                cab += linea.strip() + "\r\n"
            else :
                break
        return cab + self.partida.pgnBase()

