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

from Traducir import tr

import ControlPosicion
import cPickle

class Jugada :
    def __init__( self ) :
        self.analisis = None

    def ponDatos( self, posicionBase, posicion, desde, hasta, coronacion ) :
        self.posicionBase = posicionBase
        self.posicion = posicion
        self.siApertura = False

        self.desde = desde
        self.hasta = hasta
        self.coronacion = coronacion if coronacion else ""
        self.siJaque = self.posicion.siJaque()
        self.siJaqueMate = False # Se determina a posteriori con el motor
        self.siAhogado = False # Se determina a posteriori con el motor
        self.siTablasRepeticion = False # Se determina a posteriori con el motor
        self.siTablas50 = False
        self.siTablasFaltaMaterial = False
        self.siAbandono = False
        self.siDesconocido = False # Si ha sido una terminación de partida, por causas desconocidas
        self.pgnBase = posicionBase.pgn( desde, hasta, coronacion )
        self.liMovs = [ ( "b", hasta ), ( "m", desde, hasta ) ]
        if self.posicion.liExtras :
            self.liMovs.extend( self.posicion.liExtras )

        self.variantes = ""
        self.comentario = ""
        self.critica = ""

    def fenBase( self ) :
        return self.posicion.fen().split(" ")[0]

    def siTablas( self ) :
        return self.siTablasRepeticion or self.siTablas50 or self.siTablasFaltaMaterial

    def pv2dgt( self ) :
        return self.posicionBase.pv2dgt( self.desde, self.hasta, self.coronacion )

    def siCaptura( self ) :
        if self.hasta :
            return self.posicionBase.casillas[self.hasta] is not None
        else :
            return False

    def movimiento( self ) :
        return self.desde + self.hasta + self.coronacion

    def pgnSP( self ) :
        dConv = { "K":tr("PGN_K"), "N":tr("PGN_N"), "B":tr("PGN_B"), "Q":tr("PGN_Q"), "R":tr("PGN_R") }
        resp = self.pgnBase
        for k in dConv.keys() :
            if k in resp :
                resp = resp.replace( k, dConv[k] )
        if self.siJaqueMate :
            resp += "#"
        elif self.siDesconocido :
            resp += "*"
        elif self.siAbandono :
            resp += " 1-0" if self.posicionBase.siBlancas else " 0-1"
        elif self.siJaque :
            resp += "+"
        elif self.siAhogado :
            resp += "-" + tr( "AHOGADO" )
        elif self.siTablasRepeticion :
            resp += "-" + tr( "TABLAS" )
        elif self.siTablas50 :
            resp += "-" + tr( "TABLAS" )
        elif self.siTablasFaltaMaterial :
            resp += "-" + tr( "TABLAS" )
        return resp

    def listaSonidos( self ) :
        pgn = self.pgnBase
        if pgn[0] == "O" :
            liInicial = [pgn]
            liMedio = []
            liFinal = []
        else :
            if "=" in pgn :
                liFinal = [ "=", pgn[-1] ]
                pgn = pgn[:-2]
            elif pgn.endswith("e.p.") :
                # liFinal = [ "e.p." ]
                pgn = pgn[:-4]
            else :
                liFinal = []
            liMedio = [ pgn[-2], pgn[-1] ]
            pgn = pgn[:-2]
            liInicial = list(pgn)
            if liInicial and liInicial[-1] == "x" :
                liInicial.append( self.posicionBase.casillas[self.hasta] )
            if (not liInicial) or ( not liInicial[0].isupper() ) :
                liInicial.insert( 0, "P" )
        if self.siJaqueMate :
            liFinal.append( "#" )
        elif self.siJaque :
            liFinal.append( "+" )
        li = liInicial
        li.extend( liMedio )
        li.extend( liFinal )
        return li

    def pgnEN( self ) :
        resp = self.pgnBase
        if self.siJaqueMate :
            resp += "#"
        elif self.siDesconocido :
            resp += "*"

        if self.critica :
            resp += " $" + self.critica
        if self.comentario :
            resp += " "
            for txt in self.comentario.strip().split("\n") :
                if txt :
                    resp += "{%s}"%txt.strip()
        if self.variantes :
            for x in self.variantes.strip().split("\n") :
                x = x.strip()
                if x :
                    resp += " (%s)"%x.strip()

        if self.siAbandono :
            resp += " 1-0" if self.posicionBase.siBlancas else " 0-1"
        elif self.siJaque and not self.siJaqueMate :
            resp += "+"
        elif self.siAhogado :
            resp += " 1/2-1/2"
        elif self.siTablasRepeticion :
            resp += " 1/2-1/2"
        elif self.siTablas50 :
            resp += " 1/2-1/2"
        elif self.siTablasFaltaMaterial :
            resp += " 1/2-1/2"
        return resp

    def guardaEnTexto( self ) :
        def mas( c ) :
            return c + "·"
        def masL( si ) :
            return ("S" if si else "N") + "·"
        txt = ""
        txt += mas( self.posicionBase.fen() )
        txt += mas( self.posicion.fen() )
        txt += mas( self.desde )
        txt += mas( self.hasta )
        txt += mas( self.coronacion )
        txt += masL( self.siJaque )
        txt += masL( self.siJaqueMate )
        txt += masL( self.siAhogado )
        txt += masL( self.siTablasRepeticion )
        txt += masL( self.siTablasFaltaMaterial )
        txt += masL( self.siTablas50 )
        txt += masL( self.siApertura )
        txt += mas( self.pgnBase )
        txt += masL( self.siAbandono )
        txt += mas( self.variantes )
        txt += mas( self.comentario )
        txt += mas( self.critica )
        txt += masL( self.siDesconocido )

        txt += cPickle.dumps( self.analisis ).replace( "\n", "#&") if self.analisis else ""

        return txt

    def recuperaDeTexto( self, txt ) :
        li = txt.split( "·" )
        self.posicionBase = ControlPosicion.ControlPosicion( )
        self.posicion = ControlPosicion.ControlPosicion( )
        self.posicionBase.leeFen( li[0] )
        self.posicion.leeFen( li[1] )
        self.desde = li[2]
        self.hasta = li[3]
        self.coronacion = li[4]
        self.siJaque = li[5] == "S"
        self.siJaqueMate = li[6] == "S"
        self.siAhogado = li[7] == "S"
        self.siTablasRepeticion = li[8] == "S"
        self.siTablasFaltaMaterial = li[9] == "S"
        self.siTablas50 = li[10] == "S"
        self.siApertura = li[11] == "S"
        self.pgnBase = li[12]
        self.siAbandono = li[13] == "S"
        self.variantes = li[14]
        self.comentario = li[15]
        self.critica = li[16]
        self.siDesconocido = li[17] == "S"

        if len(li) > 18 and li[18] :
            self.analisis = cPickle.loads( str(li[18].replace( "#&", "\n" ))  )

    def __str__( self ) :
        if self.siJaqueMate :
            mas = "Mate"
        elif self.siJaque :
            mas = "Jaque"
        elif self.siAhogado :
            mas = "Ahogado"
        elif self.siTablasRepeticion :
            mas = "Tablas por repetición"
        else :
            mas = ""
        return "%s %s %s: %s"%( self.desde, self.hasta, mas, self.posicion.fen() )

#-------------------------------------------------------------------------------------------------------
def dameJugada( posicionBase, desde, hasta, coronacion ) :

    posicion = posicionBase.copia()
    siBien, mensError = posicion.mover( desde, hasta, coronacion )
    if siBien :
        jg = Jugada()
        jg.ponDatos( posicionBase, posicion, desde, hasta, coronacion )
        return True, None, jg
    else :
        return False, mensError, None
