#from __future__ import unicode_literals
# -*- coding: utf-8 -*-
from __future__ import division

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from Combattant import Combattant
from ui.ecran_editionCombattant import Ui_editionCombattant
from outilsSvg import *
from VueEditionForme import VueEditionForme
from EcranEditionAttaques import EcranEditionAttaques
import regles


class EcranEditionCombattant(QDialog):
    """interface de creation/edition de terrains"""
    def __init__(self, combattant=None, formeCases = "H", parent=None):
        """initialisation de la fenetre"""
        super (EcranEditionCombattant, self).__init__()
        self.pixGraphique = None
        self.formeCases = formeCases
        self.createWidgets()
        
        if combattant == None:
            self.combattant = Combattant()
            self.accesCreation()
        else:
            self.combattant = combattant
            self.accesEdition()
            
        self.majAffichage("")
        self.afficheListeAttaques()
        self.majListeAttributs()
##        self.majListeInventaire()
        
    def createWidgets(self):
        """construction de l'interface"""
        #construction de l'interface
        self.ui = Ui_editionCombattant()
        self.ui.setupUi(self)
        self.connect(self.ui.enregistrerCombattant, SIGNAL("clicked()"), self.enregistrer)
        self.connect(self.ui.annulerCombattant, SIGNAL("clicked()"), self.annuler)
        self.connect(self.ui.supprimerCombattant, SIGNAL("clicked()"), self.supprimer)
        self.connect(self.ui.idCombattant, SIGNAL("textEdited(QString)"), self.majAffichage)
        self.connect(self.ui.nomCombattant, SIGNAL("textEdited(QString)"), self.majAffichage)
        self.connect(self.ui.couleurCombattant, SIGNAL("clicked()"), self.selectionCouleur)

        self.connect(self.ui.imgTextureCombattant, SIGNAL("textEdited(QString)"), self.majApercuImage)
        self.connect(self.ui.imgLogoCombattant, SIGNAL("textEdited(QString)"), self.majApercuImage)
        self.connect(self.ui.imgAfficherCombattant, SIGNAL("stateChanged(int)"), self.majApercuImage)
        self.connect(self.ui.imgPivoteCombattant, SIGNAL("stateChanged(int)"), self.majApercuImage)
        self.connect(self.ui.imgMasqueCombattant, SIGNAL("stateChanged(int)"), self.majApercuImage)
        self.connect(self.ui.imgTailleXCombattant, SIGNAL("valueChanged(int)"), self.majApercuImage)
        self.connect(self.ui.imgTailleYCombattant, SIGNAL("valueChanged(int)"), self.majApercuImage)
        self.connect(self.ui.imgPosXCombattant, SIGNAL("valueChanged(int)"), self.majApercuImage)
        self.connect(self.ui.imgPosYCombattant, SIGNAL("valueChanged(int)"), self.majApercuImage)
        self.connect(self.ui.imgRotationCombattant, SIGNAL("valueChanged(int)"), self.majApercuImage)
        self.connect(self.ui.imgReinitCombattant, SIGNAL("clicked()"), self.reinitImage)

        self.connect(self.ui.nomCombattant, SIGNAL("textEdited(QString)"), self.majApercuTexte)
        self.connect(self.ui.txtAfficherCombattant, SIGNAL("stateChanged(int)"), self.majApercuTexte)
        self.connect(self.ui.txtTaillePoliceCombattant, SIGNAL("valueChanged(int)"), self.majApercuTexte)
        self.connect(self.ui.txtGrasCombattant, SIGNAL("stateChanged(int)"), self.majApercuTexte)
        self.connect(self.ui.txtPosXCombattant, SIGNAL("valueChanged(int)"), self.majApercuTexte)
        self.connect(self.ui.txtPosYCombattant, SIGNAL("valueChanged(int)"), self.majApercuTexte)
        self.connect(self.ui.txtRotationCombattant, SIGNAL("valueChanged(int)"), self.majApercuTexte)
        self.connect(self.ui.txtReinitCombattant, SIGNAL("clicked()"), self.reinitTexte)

        self.vueForme = VueEditionForme(self, self.formeCases)
        self.vueForme.creer()

        self.ui.listeAttributs.setColumnWidth(0, (0.4*self.ui.listeAttributs.width())) 
        self.ui.listeAttributs.setColumnWidth(1, (0.4*self.ui.listeAttributs.width()))
        self.connect(self.ui.listeAttributs, SIGNAL("cellChanged(int,int)"), self.listeAttributCelluleModifiee, Qt.UniqueConnection)

##        self.ui.listeInventaireCombattant.setColumnWidth(0, (0.2*self.ui.listeInventaireCombattant.width()))
##        self.ui.listeInventaireCombattant.setColumnWidth(1, (0.8*self.ui.listeInventaireCombattant.width()))
##        self.connect(self.ui.listeInventaireCombattant, SIGNAL("clicked()"), self.listeInventaireCelluleModifiee)
##        self.connect(self.ui.supprimerInventaireCombattant, SIGNAL("clicked()"), self.supprimerLigneListeInventaire)
##        self.connect(self.ui.ajouterInventaireCombattant, SIGNAL("clicked()"), self.ajouterLigneListeInventaire)
   
        
    def accesEdition(self):
        """ouverture en mode edition"""
        self.ui.idCombattant.setEnabled(True)
       
        self.ui.idCombattant.setText(QString.fromUtf8(str(self.combattant.id)))
        self.ui.nomCombattant.setText(QString.fromUtf8(str(self.combattant.nom)))
        self.ui.notesCombattant.setText(QString.fromUtf8(str(self.combattant.notes)))
        
        if self.combattant.couleur.isValid():
            self.ui.affichageCouleurCombattant.setStyleSheet("QLabel {backGround:%s}" %(self.combattant.couleur.name()))
        self.ui.imgLogoCombattant.setText(QString.fromUtf8(str(self.combattant.logo)))
        self.ui.imgTextureCombattant.setText(QString.fromUtf8(str(self.combattant.img.nomFichier)))
        self.ui.imgTailleXCombattant.setValue(self.combattant.img.kx)
        self.ui.imgTailleYCombattant.setValue(self.combattant.img.ky)
        self.ui.imgPosXCombattant.setValue(self.combattant.img.dx)
        self.ui.imgPosYCombattant.setValue(self.combattant.img.dy)
        self.ui.imgRotationCombattant.setValue(self.combattant.img.rotation)
        self.ui.imgPivoteCombattant.setChecked(self.combattant.img.pivote)
        self.ui.imgMasqueCombattant.setChecked(self.combattant.img.masqueAuto)

        self.ui.txtTaillePoliceCombattant.setValue(self.combattant.etiquette.taille_police)
        self.ui.txtGrasCombattant.setChecked(self.combattant.etiquette.gras)

        self.ui.txtPosXCombattant.setValue(self.combattant.etiquette.dx)
        self.ui.txtPosYCombattant.setValue(self.combattant.etiquette.dy)
        self.ui.txtRotationCombattant.setValue(self.combattant.etiquette.rotation)
        
        self.ui.deplacementCombattant.setValue(self.combattant.deplacement)
        self.ui.hauteurCombattant.setValue(self.combattant.hauteur)
        self.ui.volCombattant.setChecked(self.combattant.vol)
   
        self.vueForme.majForme(self.combattant.formeDef[self.formeCases])
        self.ui.supprimerCombattant.setEnabled(True)
        self.ui.idCombattant.setEnabled(False)
        self.majApercuImage()
        self.majApercuTexte()

    def accesCreation(self):
        """ouverture en mode creation"""
        self.ui.idCombattant.setEnabled(True)
        self.ui.idCombattant.setText(QString.fromUtf8(str(self.nouvelIdCombattant())))
        self.ui.idCombattant.setEnabled(False)
        self.majApercuImage()
        self.majApercuTexte()

    def majAffichage(self, txt):
        """verifie la validite des saisies"""
        self.ui.enregistrerCombattant.setEnabled(len(self.ui.idCombattant.text().toUtf8()) > 0 and len(self.ui.nomCombattant.text().toUtf8()) > 0)

    def afficheListeAttaques(self):
        """insere la frame d'edition des attaques"""
        tabAttaques = self.ui.ongletsCreation.widget(2)
        editionAttaques = EcranEditionAttaques(self.combattant)
        editionAttaques.setParent(tabAttaques)

    def majListeAttributs(self):
        """met a jour la liste des attributs de la Combattant"""
        """met a jour la liste des attributs dans le panneau de combat"""
        self.disconnect(self.ui.listeAttributs, SIGNAL("cellChanged(int,int)"), self.listeAttributCelluleModifiee)
        
        #on vide la liste
        while self.ui.listeAttributs.rowCount() > 0:
            self.ui.listeAttributs.removeRow(0)
        
        #attributs issus des regles utilisees    
        ordre = regles.ordreAttributs()
        for elt in ordre:
            ligne = ordre.index(elt)
            self.ui.listeAttributs.insertRow(ligne)
            if regles.attribut(elt).combatSeulement == True: self.ui.listeAttributs.setRowHidden(ligne, True)
            item = QTableWidgetItem(QString.fromUtf8(elt))
            item.setFlags(Qt.NoItemFlags)
            self.ui.listeAttributs.setItem(ligne, 0, item)
            self.ui.listeAttributs.setItem(ligne, 1, QTableWidgetItem(QString.fromUtf8(str(self.combattant.listeAttributs[elt]))))
            
        self.connect(self.ui.listeAttributs, SIGNAL("cellChanged(int,int)"), self.listeAttributCelluleModifiee)

    def listeAttributCelluleModifiee(self, ligne, colonne):
        """une cellule de la liste des attributs a ete modifiee"""
        if colonne != 1:
            pass
        else:
            attribut = regles.ordreAttributs()[(ligne)]
            nouvelleVal = str(self.ui.listeAttributs.item(ligne, 1).text().toUtf8())
            valVerifiee = regles.listeControle()[attribut].controler(nouvelleVal)
            if valVerifiee != None:
                self.combattant.listeAttributs[attribut] = valVerifiee
            else:    
                self.ui.listeAttributs.setItem(ligne, 1, QTableWidgetItem(QString.fromUtf8(str(self.combattant.listeAttributs[attribut]))))

##    def majListeInventaire(self):
##        """met a jour la liste de l'inventaire de la Combattant"""
##        self.disconnect(self.ui.listeInventaireCombattant, SIGNAL("cellChanged(int,int)"), self.listeInventaireCelluleModifiee)
##        
##        #on vide la liste
##        while self.ui.listeInventaireCombattant.rowCount() > 0:
##            self.ui.listeInventaireCombattant.removeRow(0)
##        ligne = 0
##        #attributs issus des regles utilisees
##        for objet in self.combattant.inventaire:
##            self.ui.listeInventaireCombattant.insertRow(ligne)
##            self.ui.listeInventaireCombattant.setItem(ligne, 0, QTableWidgetItem(QString.fromUtf8(self.combattant.inventaire[objet])))
##            self.ui.listeInventaireCombattant.setItem(ligne, 1, QTableWidgetItem(QString.fromUtf8(objet)))
##            ligne += 1
##        self.connect(self.ui.listeInventaireCombattant, SIGNAL("cellChanged(int,int)"), self.listeInventaireCelluleModifiee)
##
##    def listeInventaireCelluleModifiee(self, ligne, colonne):
##        """une cellule de la liste des attributs a ete modifiee"""
##        nouvelleVal = str(self.ui.listeInventaireCombattant.item(ligne, colonne).text().toUtf8())
##        val = None
##        if colonne == 0:
##            try:
##                nbre = int(nouvelleVal)
##            except:
##                nbre = -1
##            if nbre >= 0: val = str(nbre)
##        else:
##            val = str(nouvelleVal)
##            if val in self.combattant.inventaire or len(val) == 0:
##                print("cet objet existe deja ou a un nom invalide")
##                val = None
##
##        if colonne == 0:    
##            if val != None:
##                self.combattant.inventaire[str(self.ui.listeInventaireCombattant.item(ligne, 1).text().toUtf8())] = val
##            else:
##                self.ui.listeInventaireCombattant.setItem(ligne, 0, QTableWidgetItem(QString.fromUtf8(\
##                                                        str(self.combattant.inventaire[str(self.ui.listeInventaireCombattant.item(ligne, 1).text().toUtf8())]))))
##        else:
##            txt = str(self.ui.listeInventaireCombattant.item(ligne, 1).text().toUtf8())
##            if txt in self.combattant.inventaire:
##                del self.combattant.inventaire[txt]
##            if val != None:
##                self.combattant.inventaire[val] = txt
##            else:    
##                self.ui.listeInventaireCombattant.removeRow(ligne)
##
##    def ajouterLigneListeInventaire(self, objet=""):
##        num = -1
##        for i in range(0, self.ui.listeInventaireCombattant.rowCount()):   #si un objet de la liste a deja un nom vide, on ne cree pas de nouvelle ligne
##            if len(str(self.ui.listeInventaireCombattant.item(i, 0).text().toUtf8())) == 0:
##                num = i
##                break 
##        if num < 0:           
##            self.disconnect(self.ui.listeInventaireCombattant, SIGNAL("cellChanged(int,int)"), self.listeInventaireCelluleModifiee)
##            ligne = self.ui.listeInventaireCombattant.rowCount()
##            self.ui.listeInventaireCombattant.insertRow(ligne)
##            self.ui.listeInventaireCombattant.setItem(ligne, 0, QTableWidgetItem(QString.fromUtf8("0")))
##            self.ui.listeInventaireCombattant.setItem(ligne, 1, QTableWidgetItem(QString.fromUtf8(objet)))
##            self.connect(self.ui.listeInventaireCombattant, SIGNAL("cellChanged(int,int)"), self.listeInventaireCelluleModifiee)
##        else:
##            self.ui.listeInventaireCombattant.setCurrentRow(num)
##            
##    def supprimerLigneListeInventaire(self):
##        self.disconnect(self.ui.listeInventaireCombattant, SIGNAL("cellChanged(int,int)"), self.listeInventaireCelluleModifiee)
##        ligne = self.ui.listeInventaireCombattant.currentRow()
##        del self.combattant.inventaire[str(self.ui.listeInventaireCombattant.item(ligne, 1).text().toUtf8())]
##        self.ui.listeInventaireCombattant.removeRow(ligne)
##        self.connect(self.ui.listeInventaireCombattant, SIGNAL("cellChanged(int,int)"), self.listeInventaireCelluleModifiee)        

    def majApercuImage(self):
        """met a jour l'image sur l'apercu du pion"""
        if self.ui.imgAfficherCombattant.isChecked():
            if len(str(self.ui.imgTextureCombattant.text().toUtf8())) > 0:
                img = str(self.ui.imgTextureCombattant.text().toUtf8())
                self.vueForme.majImage(img, self.ui.imgTailleXCombattant.value() \
                                          , self.ui.imgTailleYCombattant.value() \
                                          , self.ui.imgPosXCombattant.value() \
                                          , self.ui.imgPosYCombattant.value() \
                                          , self.ui.imgRotationCombattant.value() \
                                          , self.ui.imgPivoteCombattant.isChecked() \
                                          , self.ui.imgMasqueCombattant.isChecked() )
            else:
                img = str(self.ui.imgLogoCombattant.text().toUtf8())
                self.vueForme.majImage(img)
        else:
            img = ""
            self.vueForme.majImage(img)

    def majApercuTexte(self):
        """met a jour l'etiquette sur l'apercu du pion"""
        if self.ui.txtAfficherCombattant.isChecked():
            txt = str(self.ui.nomCombattant.text().toUtf8())
        else:
            txt = "Pion"   
        self.vueForme.majTexte(txt, self.ui.txtTaillePoliceCombattant.value() \
                                  , self.ui.txtGrasCombattant.isChecked() \
                                  , self.ui.txtPosXCombattant.value() \
                                  , self.ui.txtPosYCombattant.value() \
                                  , self.ui.txtRotationCombattant.value())

    def reinitImage(self):
        self.ui.imgTailleXCombattant.setValue(10)
        self.ui.imgTailleYCombattant.setValue(10)
        self.ui.imgPosXCombattant.setValue(0)
        self.ui.imgPosYCombattant.setValue(0)
        self.ui.imgRotationCombattant.setValue(0)
        self.ui.imgPivoteCombattant.setChecked(False)
        self.ui.imgMasqueCombattant.setChecked(False)
        self.majApercuImage()

    def reinitTexte(self):
        self.ui.txtTaillePoliceCombattant.setValue(21)
        self.ui.txtGrasCombattant.setCheckState(0)
        self.ui.txtPosXCombattant.setValue(0)
        self.ui.txtPosYCombattant.setValue(0)
        self.ui.txtRotationCombattant.setValue(0)
        self.majApercuTexte()        

    def nouvelIdCombattant(self):
        """renvoie un identifiant pour un nouveau terrain"""
        dicoSvg = afficheSvg("lib\\biblio\\Combattant")
        nouvelId = 1
        while str(nouvelId) in dicoSvg.keys():
            nouvelId += 1
        return str(nouvelId)

    def selectionCouleur(self):
        """selectionne la couleur dans la boite de dialogue dediee"""
        couleur = QColorDialog(self).getColor(QColor("white"), self)
        if couleur.isValid():
            nomCouleur = couleur.name()
            self.ui.affichageCouleurCombattant.setStyleSheet("QLabel {backGround:%s}" %(nomCouleur))
            self.combattant.couleur = couleur    
            
    def enregistrer(self):
        """enregistre le terrain cree/edite"""
        self.combattant.id = str(self.ui.idCombattant.text().toUtf8())
        self.combattant.nom = str(self.ui.nomCombattant.text().toUtf8())
        self.combattant.logo = str(self.ui.imgLogoCombattant.text().toUtf8())
        if len(str(self.ui.imgTextureCombattant.text().toUtf8())) > 0:
            self.combattant.img.nomFichier = str(self.ui.imgTextureCombattant.text().toUtf8())
            self.combattant.img.kx = self.ui.imgTailleXCombattant.value()
            self.combattant.img.ky = self.ui.imgTailleYCombattant.value()
            self.combattant.img.dx = self.ui.imgPosXCombattant.value()
            self.combattant.img.dy = self.ui.imgPosYCombattant.value()
            self.combattant.img.rotation = self.ui.imgRotationCombattant.value()
            self.combattant.img.pivote = self.ui.imgPivoteCombattant.isChecked()
            self.combattant.img.masqueAuto = self.ui.imgMasqueCombattant.isChecked()
        else:
            self.combattant.img.nomFichier = str(self.ui.imgLogoCombattant.text().toUtf8())
            self.combattant.img.kx = 10
            self.combattant.img.ky = 10
            self.combattant.img.dx = 0
            self.combattant.img.dy = 0
            self.combattant.img.rotation = 0
            self.combattant.img.pivote = False
            self.combattant.img.masqueAuto = False

        self.combattant.etiquette.taille_police = self.ui.txtTaillePoliceCombattant.value()
        self.combattant.etiquette.gras = bool(self.ui.txtGrasCombattant.checkState())
        self.combattant.etiquette.dx = self.ui.txtPosXCombattant.value()
        self.combattant.etiquette.dy = self.ui.txtPosYCombattant.value()
        self.combattant.etiquette.rotation = self.ui.txtRotationCombattant.value()

        self.combattant.deplacement = int(self.ui.deplacementCombattant.value())
        self.combattant.hauteur = int(self.ui.hauteurCombattant.value())
        self.combattant.vol = self.ui.volCombattant.isChecked()

        self.combattant.formeDef[self.formeCases] = self.vueForme.formeDef()

        self.combattant.notes = str(self.ui.notesCombattant.toPlainText())

        #attributs, attaques et inventaire enregistres lors de la modif des listes
        enregistrer(self.combattant.id, self.combattant, "lib\\biblio\\combattant")
        self.combattant = None
        self.done(1)

    def supprimer(self):
        """supprimer l'enregistrement de ce terrain"""
        supprSvg("lib\\biblio\\combattant", self.combattant.id)
        self.done(1)

    def annuler(self):
        """annule la creation/edition"""
        self.combattant = None
        self.done(0)
