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

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from Combattant import Combattant
from ui.ecran_editionCombattant import Ui_edc_fenetre
from EcranEditionObjet import EcranEditionObjet
from frameAttaque import FrameAttaque
from outilsSvg import *
from VueEditionForme import VueEditionForme
import regles
import Actions
from Objet import Objet
import ui.dm as dm

	
class EcranEditionCombattant(QDialog):
    """interface de creation/edition de terrains"""
    def __init__(self, combattant=None, parent=None):
        """initialisation de la fenetre"""
        super (EcranEditionCombattant, self).__init__()
        self.pixGraphique = None
        self._compteurAttaque = 0
        self.createWidgets()
        
        if combattant == None:
            self.combattant = Combattant()
        else:
            self.combattant = combattant
        self.ouverture()

    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 formeCases(self):
        retour = ""
        if self.ui.edc_casesHexa.isChecked():
            retour = "H"
        else:
            retour = "C"
        return retour

    def createWidgets(self):
        """construction de l'interface"""
        #construction de l'interface
        self.ui = Ui_edc_fenetre()
        self.ui.setupUi(self)
        
        self.connect(self.ui.edc_nom, SIGNAL("textEdited(QString)"), self.majActivationEnregistrer)
        self.connect(self.ui.edc_nom, SIGNAL("textEdited(QString)"), self.majEtiquetteVueForme)

        self.connect(self.ui.edc_enregistrer, SIGNAL("clicked()"), self.enregistrer)
        self.connect(self.ui.edc_annuler, SIGNAL("clicked()"), self.annuler)

        self.connect(self.ui.edc_casesHexa, SIGNAL("clicked()"), self.majFormeCases)
        self.connect(self.ui.edc_casesCarrees, SIGNAL("clicked()"), self.majFormeCases)
        self.connect(self.ui.edc_couleur, SIGNAL("clicked()"), self.selectionCouleur)
        self.connect(self.ui.edc_image, SIGNAL("clicked()"), self.selectionImage)
##        self.connect(self.ui.edc_aideForme, SIGNAL("clicked()"), self.afficherAideForme)

        self.connect(self.ui.edc_logo, SIGNAL("imageModifiee()"), self.logoModifie)
        self.vueForme = VueEditionForme(self)

        self.construireListeAttributs()

        self.construireInventaire()

##        self.connect(self.ui.ajouterInventaireCombattant, SIGNAL("clicked()"), self.ajouterLigneListeInventaire)

    def layoutAtt(self):
        """retourne le layout des attaques"""
        return self.ui.edc_deroulementAttaques_layout

    def layoutCarac(self):
        """retourne le layout des attributs"""
        return self.ui.edc_deroulementAttributs_layout        
        
    def ouverture(self):
        """premier affichage: on met a jour les champs"""
       
        #page_nom
##        self.ui.edc_nom.majTexte(self.combattant.nom)
        self.ui.edc_nom.majTexte("test")
        if self.combattant.logo:
            self.ui.edc_logo.chargerImage(self.combattant.logo)
        else:
            self.ui.edc_logo.majTexte("Choisissez \nun fichier\nimage")

        self.vueForme.creer(self.formeCases())
        self.vueForme.majCouleur(self.combattant.couleur)
        self.vueForme.chargerFormeDef(self.combattant.formeDef[self.formeCases()])
        self.vueForme.chargerImageDef(self.combattant.img)
        self.vueForme.chargerEtiquetteDef(self.combattant.etiquette)

        #page deplacements
        self.ui.edc_taille.setValue(self.combattant.taille)
        self.ui.edc_depMarche.setValue(self.combattant.depMarche)
        self.ui.edc_depNage.setValue(self.combattant.depNage)
        self.ui.edc_depEscalade.setValue(self.combattant.depEscalade)
        self.ui.edc_depVol.setValue(self.combattant.depVol)
        self.ui.edc_saut.setValue(self.combattant.saut)      

        #page attributs
        self.majListeAttributs()        

        #page attaques: chargement des attaques du combattant, puis panneau 'nouvelle attaque'
        index = 0
        self.layoutAtt().setAlignment(Qt.AlignTop)
        for attaque in self.combattant.attaques:
            self.attaqueNouvelle(attaque)
        self.attaqueNouvelle()

        #page inventaire
        self.ui.edc_listeInventaire.charger(self.combattant.inventaire)
        self.majTotauxInventaire()

        #page_notes
        for detail in self.combattant.details:
            widget = self.ui.edc_pages.findChild(dm.DmLineEdit, "edc_detail_{}".format(detail))
            if widget:
                widget.majTexte(self.combattant.details[detail])
        self.ui.edc_notes.setText(QString.fromUtf8(self.combattant.notes))

        #autre
        self.majActivationEnregistrer()

    

    ### page apparence
    def majFormeCases(self):
        if self.vueForme.formeCases() != self.formeCases():
            #on enregistre la def de forme, d'image et d'etiquette en cours
            self.combattant.formeDef[self.vueForme.formeCases()] = self.vueForme.formeDef()
            self.combattant.img = self.vueForme.imageDef()
            self.combattant.etiquette = self.vueForme.etiquetteDef()

            #on recree la scene avec la nouvelle forme de cases
            self.vueForme.vider()
            self.vueForme.creer(self.formeCases())

            #on charge les def correspondantes a la nouvelle forme
            self.vueForme.chargerFormeDef(self.combattant.formeDef[self.formeCases()])
            self.vueForme.chargerImageDef(self.combattant.img)
            self.vueForme.chargerEtiquetteDef(self.combattant.etiquette)

    def majEtiquetteVueForme(self):
        self.combattant.etiquette.txt = self.ui.edc_nom.texte()
        self.vueForme.chargerEtiquetteDef(self.combattant.etiquette)

    def logoModifie(self):
        if not len(self.combattant.img.nomFichier) > 0:
            #si pas d'image attribuee au pion, on utilise le logo pour le pion
            self.vueForme.nouvelleImageDef(self.ui.edc_logo.image())

    def selectionImage(self):
        """selectionne le fichier image dans la boite de dialogue dediee"""
        fichier = QFileDialog.getOpenFileName(self, 
                                              "Selectionnez une image", 
                                              "\\img", 
                                              "Images (*.png *.jpg)")
        if len(fichier) > 0:
            pix = QPixmap(fichier)
            if not pix.isNull():
                self.vueForme.nouvelleImageDef(fichier)
            else:    
                dial = QMessageBox(self)
                dial.setText("Format non reconnu")
                dial.setWindowTitle("Erreur")
                dial.setStandardButtons(QMessageBox.Ok)
                dial.exec_()

    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.combattant.couleur = couleur
            self.vueForme.majCouleur(couleur)

    #### page attributs
    def construireListeAttributs(self):
        """construit les champs d'attributs"""
        """cree les champs dedies a la saisie des attributs dans la grille dediee"""
        self.layoutCarac().setSpacing(4)
        self.layoutCarac().setMargin(0)
        self.layoutAtt().setAlignment(Qt.AlignLeft)
        
        for nomAttribut in regles.ordreAttributsFichePerso():
            if len(nomAttribut) > 0:
                lay = QHBoxLayout()
                lay.setMargin(0)
                lay.setSpacing(2)

                etiquette = dm.DmLabel()
                etiquette.majTexte(regles.attribut(nomAttribut).nom)        
                etiquette.setObjectName("{}_etiquette".format(nomAttribut))
                etiquette.setAlignment(Qt.AlignLeft|Qt.AlignVCenter)
                etiquette.setMinimumSize(QSize(110, 24))
                etiquette.setMaximumSize(QSize(110, 24))
                lay.addWidget(etiquette)
                
                champ = dm.DmLineEdit()
                champ.setMinimumSize(QSize(80, 24))
                champ.setMaximumSize(QSize(80, 24))
                champ.setAlignment(Qt.AlignCenter)
                champ.majTexte(regles.listeAttributs()[nomAttribut])
                champ.setObjectName("{}_champ".format(nomAttribut))
    ##            self.connect(champ, SIGNAL("textChanged()"), self.controlerAttribut)
                lay.addWidget(champ)

                self.layoutCarac().addLayout(lay)
            else:
                lay = QHBoxLayout()
                etiquetteVide = dm.DmLabel()
                etiquetteVide.setMinimumHeight(9)
                etiquetteVide.setMaximumHeight(9)
                lay.addWidget(etiquetteVide)
                lay.addWidget(etiquetteVide)
                self.layoutCarac().addLayout(lay)

    def majListeAttributs(self):
        """met a jour la liste des attributs de la Combattant"""
        for i in range(0, self.layoutCarac().count()):
            layout = self.layoutCarac().itemAt(i).layout()
            widget = layout.itemAt(1).widget()
            if widget != 0:
                if str(widget.objectName()[-6:]) == "_champ":
                    attr = str(widget.objectName()[:-6])
                    widget.majTexte(self.combattant.listeAttributs[attr])            

    def listeAttributs(self):
        """renvoie la liste des attributs tels qu'ils
           sont saisis dans la liste des attributs"""
        attributs = regles.listeAttributs()
        for i in range(0, self.layoutCarac().count()):
            layout = self.layoutCarac().itemAt(i).layout()
            widget = layout.itemAt(1).widget()
            if widget != 0 and widget != None:
                if str(widget.objectName()[-6:]) == "_champ":
                    attr = str(widget.objectName()[:-6])
                    attributs[attr] = widget.texte()
        return attributs   

    #### page attaques
    def attaqueNouvelle(self, attaque = None):
        """ajoute une nouvelle ligne a la liste des attaques"""
        #on ajoute de suite un panneau 'nouvelle attaque en dessous'
        self._compteurAttaque += 1
        panneau = FrameAttaque(self._compteurAttaque)
        if attaque:
            panneau.chargerAttaque(attaque)
        panneau.setObjectName(QString("att_frame_{}".format(self._compteurAttaque)))
        self.connect(panneau, SIGNAL("attaqueNouvelle()"), self.attaqueNouvelle)
        self.connect(panneau, SIGNAL("attaqueSupprimer(int)"), self.attaqueSupprimer)
        self.layoutAtt().addWidget(panneau)        

    def attaqueSupprimer(self, index):
        """supprime la ligne selectionnee de la liste des attaques"""
        panneau = self.findChild(QFrame, "att_frame_{}".format(index))
        self.layoutAtt().removeWidget(panneau)

    ### page inventaire
    def construireInventaire(self):
        """construction de la page inventaire"""
        self.ui.edc_listeInventaire.construire()
        self.connect(self.ui.edc_listeInventaire, SIGNAL("objetClique(int)"), self.editerObjet)

    def editerObjet(self, indexObjet):
        if indexObjet < len(self.ui.edc_listeInventaire.inventaire()):
            objet = self.ui.edc_listeInventaire.inventaire()[indexObjet]
        else:
            objet = None
            
        self.fenetreEO = EcranEditionObjet(objet)
        self.fenetreEO.show()
        self.fenetreEO.exec_()
        resultat = self.fenetreEO.resultat()

        if resultat:
            if objet:
                self.ui.edc_listeInventaire.majObjet(objet, resultat)
            else:
                self.ui.edc_listeInventaire.ajouterObjet(resultat)
        else:
            if objet:
                self.ui.edc_listeInventaire.supprimerObjet(objet)
        
        self.fenetreEO = None
        self.majTotauxInventaire()

    def majTotauxInventaire(self):
        inv = self.ui.edc_listeInventaire.inventaire()
        poidsTotal = 0.00
        for obj in inv:
            poidsTotal += obj.poidsTotal()
        self.ui.edc_inventaire_poids.majTexte("{} kg".format(poidsTotal))
        

    #### barre d'outils
    def majActivationEnregistrer(self):
        """verifie la validite des saisies"""
        self.ui.edc_enregistrer.setEnabled(len(self.ui.edc_nom.texte()) > 0) 
    
    def enregistrer(self):
        """enregistre le terrain cree/edite"""
        #identifiant
        if not self.combattant.id:
            self.combattant.id = self.nouvelIdCombattant()

        #page nom
        self.combattant.nom = self.ui.edc_nom.texte()
        self.combattant.logo = self.ui.edc_logo.image()
        
        self.combattant.formeDef[self.vueForme.formeCases()] = self.vueForme.formeDef()
        self.combattant.img = self.vueForme.imageDef()
        self.combattant.etiquette = self.vueForme.etiquetteDef()

        #page dep
        self.combattant.taille = self.ui.edc_taille.value()
        self.combattant.depMarche = self.ui.edc_depMarche.value()
        self.combattant.depNage = self.ui.edc_depNage.value()
        self.combattant.depEscalade = self.ui.edc_depEscalade.value()
        self.combattant.depVol = self.ui.edc_depVol.value()
        self.combattant.saut = self.ui.edc_saut.value()

        #page attributs
        self.combattant.listeAttributs = self.listeAttributs()

        #page attaque
        listeAttaques = []
        for i in range(0, self.layoutAtt().count()):
            panneau = self.layoutAtt().itemAt(i).widget()
            if panneau != 0:
                attaque = panneau.attaque()
                if attaque:
                    listeAttaques.append(attaque)
        self.combattant.attaques = listeAttaques

        #page inventaire
        self.combattant.inventaire = self.ui.edc_listeInventaire.inventaire()

        #page notes
        listeWidget = self.ui.edc_pages.findChildren(dm.DmLineEdit)
        for widget in listeWidget:
            detail = str(widget.objectName()).replace("edc_detail_","")
            txt = widget.texte()
            if len(txt) > 0:
                self.combattant.details[detail] = txt
        
        self.combattant.notes = str(self.ui.edc_notes.toPlainText().toUtf8())

        enregistrer(self.combattant.id, self.combattant, "lib\\biblio\\combattant")
        self.combattant = None
        self.done(1)

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

if __name__ == "__main__":
   app = QApplication(sys.argv)
   ecran = EcranEditionCombattant()
   ecran.show()
   r = app.exec_()
   exit(r)      






