#from __future__ import unicode_literals
# -*- coding: utf-8 -*-
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from lib.Actions import *
import lib.regles as regles
from dm import *

#dans une DmTableAttaques, les 10 premieres colonnes sont reservees aux donnees de base
#le reste des colonnes sert aux donnees complementaires issues des regles
colonnesBase= ["numAttaque","Type","Nom","Portee","Forme","Rayon"]
largeurColonnesBase = {"numAttaque": 0, "Type": 70, "Nom": 100, "Portee": 60, "Forme": 80,"Rayon": 60}
        
class DmTableAttaques(DmTableWidget):
    """interface d'edition des attaques du combattant"""
    def __init__(self, parent=None):
        super (DmTableAttaques, self).__init__()
        self.combattant = None
        self.construire()

    def construire(self):
        """cree les colonnes de la table"""
        #colonnes de base: celles qui ne dependent pas des regles utilisees
        for i in range(0, 10):
            self.insertColumn(i)
            #on cache les colonnes qui ne seront pas utilisees
            self.setColumnHidden(i, (i >= len(colonnesBase)))
            if i < len(colonnesBase):
                #la largeur est geree par une variable globale
                self.setHorizontalHeaderItem(i, QTableWidgetItem(colonnesBase[i]))

                if colonnesBase[i] in largeurColonnesBase:
                    largeur = largeurColonnesBase[colonnesBase[i]]
                else:
                    largeur = 60
                if largeur > 0:    
                    self.setColumnWidth(i, largeur)
                else:    
                    self.setColumnHidden(i, True)


##        self.cellWidget(index, self.posColonne("Type")).setEnabled(False)
                    
        #on ajoute maintenant les colonnes issues des regles            
        ordre = regles.ordreAttributsAttaques()
        for elt in ordre:
            numCol = 10 + ordre.index(elt)
            self.insertColumn(numCol)
            self.setHorizontalHeaderItem(numCol, QTableWidgetItem(QString.fromUtf8(elt)))
            self.setColumnWidth(numCol, 45)
            self.setColumnHidden(numCol, False)

        self.connect(self, SIGNAL("cellChanged(int, int)"), self.celluleModifiee)

    def siCombattant(fonction):
        """decorateur: si combattant"""
        
        def _siCombattant(self, *args):
            def fVide(*args):
                pass
            retour = fVide
            if self.combattant:
                retour = fonction
            retour(self)                            
        return _siCombattant  

    def charger(self, combattant):
        self.combattant = combattant
        self.maj()
        self.nouvelle()

    @siCombattant
    def maj(self):
        """met a jour le contenu de la table des donnees"""
        self.vider()
        self.majEnCours = True
        
        index = 0
        for attaque in self.combattant.attaques:
            self.insertRow(int(index))
            #liste deroulante des types d'attaque
            
            
##            #num de l'attaque
##            self.setItem(int(index), 0, QTableWidgetItem(QString.fromUtf8(str(index))))
        
            donneesAttaque = {"NumAttaque": index, "Nom": attaque.nom, "Portee": attaque.portee}
            self.majLigne(index, donneesAttaque)  #[Qt.NoItemFlags, Qt.ItemIsSelectable]

            #met a jour l'index en cours de la liste deroulante des types d'attaque
            widget = self.listeTypesAttaques()
            widget.allerA(attaque.typeAtt())
            self.setCellWidget(int(index), self.posColonne("Type"), widget)
##            self.setCellWidget(int(index), self.posColonne("Type"), self.listeTypesAttaques())
##            self.cellWidget(index, self.posColonne("Type")).allerA(attaque.typ)
            self.afficherDonneesAttaqueZone(index, (attaque.typ == "zone"))            

            ### parametres supplementaires (issus des regles)
            self.majLigne(index, attaque.attributs)
##            for elt in attaque.attributs:
##                col = 10 + regles.ordreAttributsAttaques().index(elt)
##                self.setItem(index, col , QTableWidgetItem(QString.fromUtf8(str(attaque.attributs[elt]))))
          
            index += 1

        self.majEnCours = False

    def posColonne(self, nom):
        """renvoie la position de la colonne demandee"""
        retour = None
        if nom in colonnesBase:
            retour = colonnesBase.index(nom)
        elif nom in regles.ordreAttributsAttaques():
            retour = 10 + regles.ordreAttributsAttaques().index(nom)
        return retour
    
    @siCombattant
    def celluleModifiee(self, ligne, colonne):
        """une cellule de la table a ete modifiee par l'utilisateur"""
        if not self.majEnCours:
            numAttaque = int(self.val(ligne, 0))
            attaque = self.combattant.attaques[numAttaque]
            
            if colonne < len(colonnesBase):
                if colonne == self.posColonne("Nom"):
                    #maj du nom de l'attaque
                    nom = self.texte(ligne, colonne)
                    if not len(nom) > 0:
                        nom = "Att. {}".format(numAttaque)
                    attaque.nom = nom
                
                elif colonne == self.posColonne("Type"):
                    #maj du type de l'attaque
                    typ = str(self.cellWidget(ligne, colonne).valeurActuelle().toString())
                    attaque.typ = typ
                    self.afficherDonneesAttaqueZone(ligne, (typ == "zone"))
                    
                elif colonne == self.posColonne("Forme"):
                    #maj de la forme de l'attaque
                    forme = str(self.cellWidget(ligne, colonne).valeurActuelle().toString())
                    attaque.formeZone = forme
                    
                elif colonne == self.posColonne("Portee"):
                    #maj de la portee de l'attaque
                    #doit etre de type numerique
                    try:
                        portee = int(self.data(ligne, colonne))
                        if portee < 1000:
                            attaque.portee = portee
                        else:
                            self.majEnt(ligne, colonne, attaque.portee)
                    except:
                        #sinon, on restaure l'ancienne valeur
                        self.majEnt(ligne, colonne, attaque.portee)

                elif colonne == self.posColonne("Rayon"):
                    #doit etre de type numerique
                    try:
                        rayon = int(self.data(ligne, colonne))
                        if rayon < 100:
                            self.combattant.attaques[numAttaque].rayon = rayon
                        else:
                            self.majEnt(ligne, colonne, attaque.rayon)         
                    except:
                        self.majEnt(ligne, colonne, attaque.rayon) 
    
            elif colonne >= 10:
                #colonnes issues des regles
                index = colonne - 10
                attribut = regles.ordreAttributsAttaques()[index]
                valeurAttribut = regles.listeControleAttaques()[attribut].controler(str(self.data(ligne, colonne).toString()))
                if valeurAttribut != None:
                    attaque.attributs[attribut] = valeurAttribut
                else:
                    self.majData(ligne, colonne, attaque.attributs[attribut])

    @siCombattant
    def nouvelle(self):
        """ajoute une ligne a la table et une attaque au pion"""
        self.combattant.attaques.append(Cac())
        self.maj()

    @siCombattant
    def supprimer(self):
        """supprime l'attaque selectionnee de la liste des attaques du pion"""
        select = self.ligneSelectionnee()
        if select:
            numAttaque = int(self.data(sel,0))
            reponse = QMessageBox.question(self, 'Message',
                           "Etes vous sûr de vouloir supprimer cette attaque?", QMessageBox.Yes | 
                           QMessageBox.No, QMessageBox.No)
            if reponse == QMessageBox.Yes:   
                del self.combattant.attaques[numAttaque]
                self.maj()

    def majTypeAttaque(self):
        """une des liste de type a ete modifiee, on met a jour toute la colonne (en attendant mieux :( )"""
        colonne = self.posColonne("Type")
        for i in range(0, self.rowCount()):
            if str(self.cellWidget(i, colonne).itemData(\
                   self.cellWidget(i, colonne).currentIndex())) != \
                   self.combattant.attaques[int(self.item(i, 0).text().toUtf8())].typ:
                self.celluleModifiee(i, colonne)

    def majFormeZone(self):
        """une des liste de type a ete modifiee, on met a jour toute la colonne (en attendant mieux :( )"""
        colonne = self.posColonne("Forme")
        for i in range(0, self.rowCount()):
            if self.cellWidget(i, colonne).__class__.__name__ == "QComboBox":
                if str(self.cellWidget(i, colonne).itemData(\
                       self.cellWidget(i, colonne).currentIndex())) != \
                       self.combattant.attaques[int(self.item(i, 0).text().toUtf8())].formeZone:
                    self.celluleModifiee(i, colonne)
                
    def listeTypesAttaques(self):
        """retourne la DmComboBox qui apparait dans la colonne Type d'attaque"""
        liste = DmComboBox()
        liste.addItem(QIcon("img\\curseurEpee.png"), QString.fromUtf8("C.à.C"), "cac")
        liste.addItem(QIcon("img\\arc.png"), QString.fromUtf8("Dist."), "dist")
        liste.addItem(QIcon("img\\baguette.png"), QString.fromUtf8("Zone"), "zone")
        self.connect(liste, SIGNAL("currentIndexChanged(int)"), self.majTypeAttaque)
        return liste
    
    def listeFormesZone(self):
        """retourne la QComboBox qui apparait dans la colonne forme de zone"""
        liste = QComboBox()
        liste.addItem(QIcon("img\\formeLigne.png"), QString.fromUtf8("Ligne"), "ligne")
        liste.addItem(QIcon("img\\formeEllipsePlein.png"), QString.fromUtf8("Disque"), "disque")
        liste.addItem(QIcon("img\\cone.png"), QString.fromUtf8("Cone"), "cone")
        self.connect(liste, SIGNAL("currentIndexChanged(int)"), self.majFormeZone)
        return liste

    @siCombattant
    def afficherDonneesAttaqueZone(self, ligne, afficher):
        """rend modifiables ou non les donnees de base liees aux attaques de zone et modifie l'affichage en consequence"""
        self.majEnCours = True
        
        if afficher:
            numAttaque = int(self.data(ligne, 0))
            attaque = self.combattant.attaques[numAttaque]
            
            if self.cellWidget(ligne, self.posColonne("Forme")) == None:
                self.setCellWidget(ligne, self.posColonne("Forme"), self.listeFormesZone())
                
            if attaque.formeZone in ["ligne", "disque", "cone"]:
                self.cellWidget(ligne, self.posColonne("Forme")).allerA(attaque.formeZone)

            item = QTableWidgetItem()
            item.setData(0, attaque.rayon)
            item.setBackgroundColor(QColor("white"))
            self.setItem(ligne, self.posColonne("Rayon"), item)
            
        else:
            if self.cellWidget(ligne, self.posColonne("Forme")) != None:
                self.removeCellWidget(ligne, self.posColonne("Forme"))
                
            item = QTableWidgetItem(QString.fromUtf8(""))
            item.setFlags(Qt.NoItemFlags)
            item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
            item.setBackgroundColor(QColor(200,200,200))
            self.setItem(ligne, self.posColonne("Forme"), item)
            
            item = QTableWidgetItem(QString.fromUtf8(""))
            item.setFlags(Qt.NoItemFlags)
            item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
            item.setBackgroundColor(QColor(200,200,200))
            self.setItem(ligne, self.posColonne("Rayon"), item)

        self.majEnCours = False





