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

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

from PySide import QtGui

from Code.Traducir import tr
import Code.SQL as SQL
import Code.PGN as PGN
import Code.Tutoriales as Tutoriales

import QTUtil2
import Colocacion
import Iconos
import Controles
import Columnas
import Grid

import PantallaPGN

#==========================================================================================================================================
class WET_Partidas( QtGui.QWidget ):

    def __init__( self, wowner, owner ) :

        QtGui.QWidget.__init__(self,wowner)

        self.owner = owner

        flb = Controles.TipoLetra( puntos=8 )

        self.tutorial = owner.tutorial
        self.configuracion = owner.procesador.configuracion
        self.liPartidas = self.tutorial.liPartidas

        self.liClaves = "EVENT", "SITE", "DATE", "ROUND", "WHITE", "BLACK", "RESULT", "ECO", "FEN"
        self.tamClaves =  200,     150,    80,     70,     140,     140,       65,     65,    200

        # Lista
        oColumnas = Columnas.ListaColumnas()
        oColumnas.nueva( "NUMERO", tr( "AB_NUM" ), 60, siCentrado=True )
        for n, cl in enumerate(self.liClaves) :
            if cl in ( "ECO", "FEN" ) :
                rotulo = cl
            else :
                rotulo = tr( "PGN_" + cl )
            oColumnas.nueva( cl, rotulo, self.tamClaves[n], siCentrado = cl != "EVENT" )

        self.grid = Grid.Grid( self, oColumnas, id = "P", siSelecFilas=True )

        liAcciones = [  ( tr( "NUEVO" ), Iconos.TB_Nuevo(), "mas" ), None,
                        ( tr( "BORRAR" ), Iconos.TB_Borrar(), "borrar" ), None,
                        ( tr( "TB_PGNINICIO" ), Iconos.TB_Inicio(), "inicio" ),
                        ( tr( "TB_PGNFINAL" ), Iconos.TB_Final(), "final" ), None,
                        ( tr( "ARRIBA" ), Iconos.TB_Arriba(), "arribaE" ), None,
                        ( tr( "ABAJO" ), Iconos.TB_Abajo(), "abajoE" ), None,
                        ( tr( "TUT_GENERAR" ), Iconos.TB_Generar(), "generar" ), None,
                    ]
        tb = Controles.TB( self, liAcciones )
        tb.setFont( flb )

        ly = Colocacion.V().control(tb).control(self.grid).margen(10)

        self.setLayout( ly )

    #--------------------------------------------------------------------------------------------------------------------------------
    def gridNumDatos( self, grid ) :
        return len(self.liPartidas)

    #--------------------------------------------------------------------------------------------------------------------------------
    def gridDato( self, grid, fila, oColumna ) :
        clave = oColumna.clave
        if clave == "NUMERO" :
            return str(fila+1)
        return self.liPartidas[fila][clave]

    #--------------------------------------------------------------------------------------------------------------------------------
    def procesarTB( self ) :
        accion = self.sender().clave
        eval( "self.%s()"%accion )

    #--------------------------------------------------------------------------------------------------------------------------------
    def inicio( self ) :
        self.grid.setFocus()
        self.grid.gotop()
        self.grid.refresh()

    #--------------------------------------------------------------------------------------------------------------------------------
    def final( self ) :
        self.grid.setFocus()
        self.grid.gobottom()
        self.grid.refresh()

    #--------------------------------------------------------------------------------------------------------------------------------
    def borrar( self ) :
        if len(self.liPartidas) == 0 :
            return

        menu = Controles.LMenu()

        f = Controles.TipoLetra( puntos=8, peso=75 )
        menu.ponFuente( f )

        menu.opcion( "una", tr( "TUT_BORRAR_ACTUAL" ), Iconos.PuntoAzul() )

        menu.separador()

        menu.opcion( "todas", tr( "TUT_BORRAR_TODOS" ), Iconos.PuntoNaranja() )

        resp = menu.lanza()
        if resp == "una" :
            nPartida = self.grid.recno()
            if nPartida >= 0 :
                del self.liPartidas[nPartida]
            self.grid.goto(nPartida)
        elif resp == "todas" :
            self.liPartidas = []
        self.grid.refresh()

    #--------------------------------------------------------------------------------------------------------------------------------
    def mas( self ) :
        menu = Controles.LMenu()

        f = Controles.TipoLetra( puntos=8, peso=75 )
        menu.ponFuente( f )

        menu.opcion( "una", tr( "TUT_PARTIDAS_UNA" ), Iconos.PuntoAzul() )

        menu.separador()

        menu.opcion( "todas", tr( "TUT_PARTIDAS_TODAS" ), Iconos.PuntoNaranja() )

        resp = menu.lanza()
        if resp :
            self.masPartidas( resp == "una" )
            self.grid.gobottom()
            self.grid.refresh()
    #--------------------------------------------------------------------------------------------------------------------------------
    def masPartidas( self, siUna ) :

        # Elegimos el fichero PGN
        path = QTUtil2.leeFichero( self, self.configuracion.dirPGN, "pgn" )
        if path is None :
            return
        carpeta, fichero = os.path.split(path)
        if self.configuracion.dirPGN != carpeta :
            self.configuracion.dirPGN = carpeta
            self.configuracion.graba()

        # Lo importamos
        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, rotulo,rotulo, 100 ).mostrar()
            self.tmpBP.pon( porcentaje )
            return not self.tmpBP.siCancelado()

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

        # Los datos los tenemos en una BD.sql
        dClaves = dicDB["DICCLAVES"]

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

        dbf = bd.dbf( "JUEGOS", ",".join(dClaves.keys()) +",JUGADAS" )

        def masActual( ) :
            reg = dbf.dicValores()
            dPartida = {}
            for clave in self.liClaves :
                if clave in reg :
                    dPartida[clave] = reg[clave]
                else :
                    dPartida[clave] = ""
            dPartida["JUGADAS"] = reg["JUGADAS"]
            dPartida["ID"] = self.tutorial.idNuevo()
            self.liPartidas.append( dPartida )

        if siUna :
            siSeguir, estadoWpgn, siSeHaBorradoAlgo = PantallaPGN.elegirPGN( self, dbf, dClaves, self, None )
            if siSeguir :
                masActual()

        else :
            dbf.leer()
            num = dbf.reccount()
            rotulo = tr("TUT_PARTIDAS_IMPORTANDO")
            bp = QTUtil2.BarraProgreso( self, rotulo, rotulo, num ).mostrar()
            for recno in range(num) :
                bp.pon(recno)
                dbf.goto( recno )
                masActual()
                if bp.siCancelado() :
                    break
            bp.cerrar()

        dbf.cerrar()

        bd.cerrar()

        self.final()

    #--------------------------------------------------------------------------------------------------------------------------------
    def generar( self ) :
        menu = Controles.LMenu()

        f = Controles.TipoLetra( puntos=8, peso=75 )
        menu.ponFuente( f )

        menu.opcion( "unapartida", tr( "TUT_GENERAR_PARTIDA" ), Iconos.PuntoAzul() )

        menu.separador()

        resp = menu.lanza()
        if resp :
            self.generarActual()

    #--------------------------------------------------------------------------------------------------------------------------------
    def generarActual( self ) :
        nPartida = self.grid.recno()
        if nPartida < 0 :
            return
        dicPartida = self.liPartidas[nPartida]

        pgn = ""
        for k,v in dicPartida.iteritems() :
            if k != "JUGADAS" :
                pgn += '[%s "%s"]\n'%( k, v)
        pgn += dicPartida["JUGADAS"]

        unpgn = PGN.UnPGN()
        unpgn.leeTexto(pgn)

        partida = unpgn.partida

        liEscenas = self.tutorial.liEscenas

        if partida.siEmpiezaConNegras :
            numJugadaActual = 1
        else :
            numJugadaActual = 0

        for nj, jg in enumerate(partida.liJugadas) :
            siNegras = numJugadaActual%2 == 1
            txt = "%d. "%(numJugadaActual/2+1)
            numJugadaActual += 1
            if siNegras :
                txt += "..."
            txt += jg.pgnSP()
            escena = Tutoriales.Escena()
            escena.id = self.tutorial.idNuevo()
            escena.nombre = txt
            escena.partida = partida
            escena.numjugada = nj

            liEscenas.append( escena )

        self.owner.escenas.grid.refresh()
        self.owner.escenas.grid.gotop()

