# -*- coding: latin-1 -*-
#==========================================================================================================================================
import collections

from PySide import QtCore, QtGui

from Code.Traducir import tr

import Code.Configuracion as Configuracion
import Code.ControlPosicion as ControlPosicion
import Code.Util as Util

import Iconos
import Controles
import Colocacion
import QTUtil2
import Tablero
import PantallaTTFlechas

import FormLayout

#==========================================================================================================================================

#==========================================================================================================================================
class BotonColor(QtGui.QPushButton):
    def __init__(self, parent, nombre, rutina, nfondo, ncolor, ancho, alto ):
        QtGui.QPushButton.__init__(self, parent)

        self.setToolTip( nombre)

        self.setFixedSize(ancho, alto)
        self.qs = QtCore.QSize(ancho*3/4, alto*3/4)
        self.setIconSize(self.qs)

        self.rutina = rutina
        self.connect(self, QtCore.SIGNAL("clicked()"), self.pulsado )

        self.nombre = nombre

        self.ponColor( nfondo, ncolor )

    def ponColor( self, nfondo, ncolor= None ) :
        if ncolor == None :
            ncolor = nfondo
        color = QtGui.QColor()
        color.setRgba( nfondo )
        self.setStyleSheet("QWidget { background-color: %s }" % color.name())

        color.setRgba( ncolor )
        pixmap = QtGui.QPixmap(self.qs)
        pixmap.fill(color)

        self.setIcon(QtGui.QIcon(pixmap))

    def pulsado(self):
        self.rutina( self.nombre )

#==========================================================================================================================================

#==========================================================================================================================================
class WColores( QtGui.QDialog ) :
    #--------------------------------------------------------------------------------------------------------------------------------
    def __init__( self, wParent, configuracion ) :
        super(WColores, self).__init__(wParent)

        self.setWindowFlags( QtCore.Qt.Dialog | QtCore.Qt.WindowTitleHint )

        self.configuracion = configuracion

        self.setWindowTitle( tr( "COLORES" ) )
        self.setWindowIcon( Iconos.Colores() )

        # Donde aplicar
        liOpciones = ( ( tr("TABLERO_NORMAL"), "N" ), ( tr("TABLERO_TUTOR"), "T" ), ( tr("AMBOS_TABLEROS"), "A" ) )
        self.cbTablero = QTUtil2.comboBoxLB( liOpciones, "N" )

        ly = Colocacion.H().control( self.cbTablero )
        gbO = Controles.GB(self,tr("CAMBIAR_COLOR_A"),ly)

        self.sinElegir = True
        self.connect( self.cbTablero, QtCore.SIGNAL("currentIndexChanged(int)"), self.cambiadoComboTablero )

        # Colores actuales
        cTableroN = self.configuracion.cTableroN
        btTableroN = BotonColor( self, "N", self.ponTablero, cTableroN.colorExterior, cTableroN.colorNegras, 48, 36 )
        btxTableroN = Controles.PB( self, tr("TABLERO_NORMAL")+"->", self.ponTableroNormal ).ponPlano( False )

        cTableroT = self.configuracion.cTableroT
        btTableroT = BotonColor( self, "T", self.ponTablero, cTableroT.colorExterior, cTableroT.colorNegras, 48, 36 )
        btxTableroT = Controles.PB( self, tr("TABLERO_TUTOR")+"->", self.ponTableroTutor ).ponPlano( False )

        ly = Colocacion.G().control(btxTableroN, 0, 0 ).control( btxTableroT, 0, 2 )
        ly.control(btTableroN, 0, 1).control( btTableroT, 0, 3 )
        gbA = Controles.GB(self,tr("COLORES_ORIGINALES"),ly)

        # Temas
        self.dicTemas = self.temasBasicos()
        nTemas = len(self.dicTemas)
        maxcols = nTemas/2
        if nTemas%2 == 1 :
            maxcols += 1
        maxcols = min( maxcols,6)
        fila = 1
        columna = 0
        lyTemas = Colocacion.G()
        for k in self.dicTemas.iterkeys() :
            exterior, blancas, negras, flecha, texto = self.dicTemas[k]
            bt = BotonColor( self, k, self.ponTema, exterior, negras, 64, 64 )
            lyTemas.control( bt, fila, columna )
            columna += 1
            if columna == maxcols :
                columna = 0
                fila += 1
        gbTemas = Controles.GB(self,tr("TEMAS"),lyTemas)

        # Actual
        #Exterior
        lbExterior = Controles.LB( tr( "COLOR_FONDO" ) + ": ").alinDerecha()
        self.btExterior = BotonColor( self, "E", self.ponActual, cTableroN.colorExterior, cTableroN.colorExterior, 164, 24 )
        #Blancas
        lbBlancas = Controles.LB( tr( "COLOR_BLANCAS" ) + ": ").alinDerecha()
        self.btBlancas = BotonColor( self, "B", self.ponActual, cTableroN.colorBlancas, cTableroN.colorBlancas, 164, 24 )
        #Negras
        lbNegras = Controles.LB( tr( "COLOR_NEGRAS" ) + ": ").alinDerecha()
        self.btNegras = BotonColor( self, "N", self.ponActual, cTableroN.colorNegras, cTableroN.colorNegras, 164, 24 )
        #Flecha
        lbFlecha = Controles.LB( tr( "COLOR_INDICADOR" ) + ": ").alinDerecha()
        btFlecha = Controles.PB( self, "--->", self.cambiaFlecha, plano = False )
        btFlechaDefecto = Controles.PB( self, "", self.flechaDefecto ).ponIcono( Iconos.Motor_No() )
        #Texto
        lbTexto = Controles.LB( tr( "COLOR_COORDENADAS" ) + ": ").alinDerecha()
        self.btTexto = BotonColor( self, "T", self.ponActual, cTableroN.colorTexto, cTableroN.colorTexto, 164, 24 )

        lyF = Colocacion.H().control(btFlecha).control(btFlechaDefecto).relleno(1)

        lyActual = Colocacion.G()
        lyActual.control( lbExterior, 0, 0, alineacion = "d" ).control( self.btExterior, 0, 1 )
        lyActual.control( lbBlancas, 1, 0, alineacion = "d" ).control( self.btBlancas, 1, 1 )
        lyActual.control( lbNegras, 2, 0, alineacion = "d" ).control( self.btNegras, 2, 1 )
        lyActual.control( lbTexto, 3, 0, alineacion = "d" ).control( self.btTexto, 3, 1 )
        lyActual.control( lbFlecha, 4, 0, alineacion = "d" ).otro( lyF, 4, 1 )
        gbActual = Controles.GB(self,tr("TEMA_ACTIVO"),lyActual)

        # Tablero
        self.confTablero = Configuracion.ConfigTablero()
        self.confTablero.lee( cTableroN.graba() )
        self.confTablero.anchoPieza = 32
        cp = ControlPosicion.ControlPosicion().leeFen( "2kr1b1r/2p1pppp/p7/3pPb2/1q3P2/2N1P3/PPP3PP/R1BQK2R w KQ - 0 1" )
        self.tablero = Tablero.Tablero(self, self.confTablero)
        self.tablero.crea()
        self.tablero.ponPosicion( cp )
        self.tablero.ponFlechaSC( "b7", "b4" )

        # tb = QTUtil2.creaTBAceptarCancelar( self )
        liAcciones = [  ( tr( "ACEPTAR" ), Iconos.TB_Aceptar(), "aceptar" ),
                        None,
                        ( tr( "CANCELAR" ), Iconos.TB_Cancelar(), "cancelar" ),
                        None,
                        ( tr( "TEMAS" ), Iconos.Temas(), "temas" ),
                        ]
        tb = Controles.TB( self, liAcciones )

        # Juntamos
        lyT = Colocacion.V().control( tb ).control( gbO ).control( self.tablero ).relleno(1)
        lyV = Colocacion.V().control( gbA ).relleno(1).control( gbTemas ).relleno(1).control( gbActual )
        ly = Colocacion.H().otro( lyT ).otro( lyV )

        self.setLayout( ly )

        self.elegido = None

        self.liTemas = self.leeTemas()
        self.temaActual = None
        if self.liTemas :
            txt = self.confTablero.graba()
            for tema in self.liTemas :
                if tema["CONFIG"] == txt :
                    self.temaActual = tema
                    break

    #--------------------------------------------------------------------------------------------------------------------------------
    def temasBasicos( self ) :

        dicTemas = collections.OrderedDict()
        def mas( nombre, lista ) :
            dicTemas[nombre] = lista

                              #  Exterior,   Blancas,       Negras,     Flecha        Texto
        mas( "Lucas", ( 4280690214, 4294243572, 4289509046, 4289374847, 4294243572 ) )
        mas( "LucasT", ( 4278206043, 4294243572, 4288588449, 4289374847, 4294243572 ) )
        mas( "Olive GB", ( 4281413888, 4294836181, 4289966452, 4283058480, 4294836181 ) )
        mas( "Wood GB", ( 4285018142, 4294497714, 4291528795, 4285286448, 4294497714 ) )
        mas( "Internet GB", ( 4280829012, 4294967295, 4286173439, 4280829012, 4294967295 ) )
        mas( "Mahnmut", ( 4279841860, 4293717228, 4282484141, 4292447851, 4293717228 ) )
        mas( "Harman", ( 4280427008, 4293717228, 4285229824, 4280427008, 4293717228 ) )
        mas( "Orphu", ( 4281676849, 4294242784, 4290689717, 4283848015, 4294242784 ) )
        return dicTemas

    #--------------------------------------------------------------------------------------------------------------------------------
    def procesarTB( self ) :
        accion = self.sender().clave
        if accion == "aceptar" :
            resp = self.cbTablero.resultado()
            siN = resp in "NA"
            siT = resp in "TA"

            if siN :
                anchoPieza = self.configuracion.cTableroN.anchoPieza
                self.configuracion.cTableroN.lee( self.confTablero.graba() )
                self.configuracion.cTableroN.anchoPieza = anchoPieza
            if siT :
                anchoPieza = self.configuracion.cTableroT.anchoPieza
                self.configuracion.cTableroT.lee( self.confTablero.graba() )
                self.configuracion.cTableroT.anchoPieza = anchoPieza

            self.accept()
        elif accion == "cancelar" :
            self.reject()

        elif accion == "temas" :
            self.temas()

    #--------------------------------------------------------------------------------------------------------------------------------
    def cambiadoComboTablero( self, num ) :
        if self.sinElegir :
            if num == 0 :
                self.ponTablero( "N" )
            elif num == 1 :
                self.ponTablero( "T" )

    #--------------------------------------------------------------------------------------------------------------------------------
    def ponTablero( self, nombre ) :
        if nombre == "N" :
            self.confTablero.lee( self.configuracion.cTableroN.graba() )
        else :
            self.confTablero.lee( self.configuracion.cTableroT.graba() )
        self.actualizaTablero()
    #--------------------------------------------------------------------------------------------------------------------------------
    def ponTableroNormal( self ) :
        self.ponTablero( "N" )
    #--------------------------------------------------------------------------------------------------------------------------------
    def ponTableroTutor( self ) :
        self.ponTablero( "T" )
    #--------------------------------------------------------------------------------------------------------------------------------
    def ponActual( self, clave ) :
        dic = { "E":"Exterior", "B":"Blancas", "N":"Negras", "T":"Texto" }
        rgba_color = getattr( self.confTablero, "color"+dic[clave] )
        color = QtGui.QColor(rgba_color)
        color = QtGui.QColorDialog.getColor(color, self, tr( "SELECCIONAR_COLOR" ) )
        if color.isValid() :
            self.sinElegir = False
            setattr( self.confTablero, "color"+dic[clave], color.rgba() )
            self.actualizaTablero()
    #--------------------------------------------------------------------------------------------------------------------------------
    def cambiaFlecha( self ) :
        w = PantallaTTFlechas.WET_Flecha( self, 0, [self.confTablero.fTransicion], 32, confTablero = self.confTablero, siControlNombre = False )
        if w.exec_() :
            self.confTablero.fTransicion = w.regFlecha
            self.actualizaTablero()

    #--------------------------------------------------------------------------------------------------------------------------------
    def flechaDefecto( self ) :
        self.confTablero.fTransicion = self.confTablero.flechaDefecto()
        self.actualizaTablero()

    # --------------------------------------------------------------------------------------------------------------------------------
    def ponTema( self, nombre ) :
        self.sinElegir = False
        ct = self.confTablero
        ct.colorExterior, ct.colorBlancas, ct.colorNegras, ct.colorFlecha, ct.colorTexto = self.dicTemas[nombre]
        self.actualizaTablero()

    #--------------------------------------------------------------------------------------------------------------------------------
    def actualizaTablero( self ) :
        ct = self.confTablero
        self.tablero.cambiaColores( ct )
        self.btExterior.ponColor( ct.colorExterior )
        self.btBlancas.ponColor( ct.colorBlancas )
        self.btNegras.ponColor( ct.colorNegras )
        self.btTexto.ponColor( ct.colorTexto )

    #--------------------------------------------------------------------------------------------------------------------------------
    def leeTemas( self ) :
        fichero = self.configuracion.ficheroTemas
        liTemas = Util.recuperaVar( fichero )
        return [] if liTemas is None else liTemas

    #--------------------------------------------------------------------------------------------------------------------------------
    def temas( self ) :
        siHay = len(self.liTemas) > 0
        menu = Controles.LMenu(puntos=10)

        if siHay :
            mr = menu.submenu( tr( "TB_RECUPERAR" ), Iconos.TB_Recuperar() )
            ico = Iconos.PuntoVerde()
            for n,uno in enumerate(self.liTemas) :
                mr.opcion( "r%d"%n, uno["NOMBRE"], ico )
                mr.separador()
            menu.separador()

        if self.temaActual :
            menu.opcion( "grabar", tr( "TB_GUARDAR" ) + " " + self.temaActual["NOMBRE"], Iconos.TB_Grabar() )
            menu.separador()

        menu.opcion( "grabarComo", tr( "TB_GUARDARCOMO" ), Iconos.TB_GrabarComo() )
        menu.separador()

        if siHay :
            mr = menu.submenu( tr( "BORRAR" ), Iconos.TB_Borrar() )
            ico = Iconos.PuntoNegro()
            for n,uno in enumerate(self.liTemas) :
                mr.opcion( "b%d"%n, uno["NOMBRE"], ico )
                mr.separador()

        resp = menu.lanza()
        if resp is None :
            return

        elif resp == "grabar" :
            self.grabarTema(self.temaActual)

        elif resp == "grabarComo" :
            tema = self.grabarTema(None)
            self.liTemas.append(tema)

        elif resp.startswith( "r" ) :
            num = int(resp[1:])
            tema = self.liTemas[num]
            self.temaActual = tema
            self.confTablero.lee( tema["CONFIG"] )
            self.actualizaTablero()

        elif resp.startswith( "b" ) :
            num = int(resp[1:])
            tema = self.liTemas[num]
            if QTUtil2.pregunta( self, tr( "PREGUNTA_BORRAMOS", tema["NOMBRE"] ) ) :
                if self.temaActual == tema :
                    self.temaActual = None
                del self.liTemas[num]

        fichero = self.configuracion.ficheroTemas
        Util.guardaVar( fichero, self.liTemas )

    #--------------------------------------------------------------------------------------------------------------------------------
    def grabarTema( self, tema ) :

        liGen = [(None,None)]

        nombre = tema["NOMBRE"] if tema else ""
        config = FormLayout.Editbox( tr( "TIT_NOMBRE" ), ancho=160 )
        liGen.append( (config, nombre ) )

        ico = Iconos.TB_Grabar() if tema else Iconos.TB_GrabarComo()

        resultado = FormLayout.fedit( liGen, title= tr( "TIT_NOMBRE" ), parent = self, icon = ico, siDefecto = False )
        if resultado :
            accion, liResp = resultado
            nombre = liResp[0]

            if nombre :
                if not tema :
                    tema = {}
                tema["NOMBRE"] = nombre
                tema["CONFIG"] = self.confTablero.graba()
                self.temaActual = tema
                return tema

#==========================================================================================================================================

