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

from PyQt4.QtCore import *
from PyQt4.QtGui import *

from ui.ecran_editionAttaques import Ui_editionAttaques
from Attaque import Attaque
import regles

        
class EcranEditionAttaques(QFrame):
    """interface d'edition des attaques du combattant"""
    def __init__(self, combattant, parent=None):
        """initialisation de la fenetre"""
        super (EcranEditionAttaques, self).__init__()
        self.combattant = combattant
        self.colonnesBase = {}
        self.createWidgets()
        self.majEnCours = False
        
    def createWidgets(self):
        """construction de l'interface"""
        #construction de l'interface
        self.ui = Ui_editionAttaques()
        self.ui.setupUi(self)
        self.connect(self.ui.nouvelleAttaque, SIGNAL("clicked()"), self.nouvelleAttaque)
        self.connect(self.ui.supprimerAttaque, SIGNAL("clicked()"), self.supprimerAttaque)
##        self.connect(SIGNAL("majTypeAttaque()"), self.majTypeAttaque)
        self.initListe()
        self.majListe()
        self.connect(self.ui.editionListeAttaques, SIGNAL("cellChanged(int, int)"), self.celluleModifiee)

    def initListe(self):
        """formate la table des donnees"""
        #mise en forme des colonnes
        #colonnes de base: celles qui ne dependent pas des regles utilisees
        self.colonnesBase = ["numAttaque","Type","Nom","Portee","Forme","Rayon"]
        largeurColonnesBase = {"numAttaque": 0, "Type": 70, "Nom": 100, "Portee": 60, "Forme": 80,"Rayon": 60}

        for i in range(0, 10):
            self.ui.editionListeAttaques.insertColumn(i)
            self.ui.editionListeAttaques.setColumnHidden(i, (i >= len(self.colonnesBase)))
            if i < len(self.colonnesBase):
                self.ui.editionListeAttaques.setHorizontalHeaderItem(i, QTableWidgetItem(self.colonnesBase[i]))
                if self.colonnesBase[i] in largeurColonnesBase:
                    largeur = largeurColonnesBase[self.colonnesBase[i]]
                else:
                    largeur = 60
                if largeur > 0:    
                    self.ui.editionListeAttaques.setColumnWidth(i, largeur)
                else:    
                    self.ui.editionListeAttaques.setColumnHidden(i, True)
                    
        ordre = regles.ordreAttributsAttaques()
        for elt in ordre:
            numCol = 10 + ordre.index(elt)
            self.ui.editionListeAttaques.insertColumn(numCol)
            self.ui.editionListeAttaques.setHorizontalHeaderItem(numCol, QTableWidgetItem(QString.fromUtf8(elt)))
            self.ui.editionListeAttaques.setColumnWidth(numCol, 45)
            self.ui.editionListeAttaques.setColumnHidden(numCol, False)
            
    def majListe(self):
        """met a jour le contenu de la table des donnees"""
        self.majEnCours = True
        while self.ui.editionListeAttaques.rowCount() > 0:
            self.ui.editionListeAttaques.removeRow(0)
        index = 0

        for numAttaque in range(0, len(self.combattant.attaques)):
            self.ui.editionListeAttaques.insertRow(int(index))
            #liste deroulante des types d'attaque
            self.ui.editionListeAttaques.setCellWidget(int(index), self.colonnesBase.index("Type"), self.listeTypesAttaques())
            
            #num du pion (0):   
            self.ui.editionListeAttaques.setItem(int(index),0,QTableWidgetItem(QString.fromUtf8(str(numAttaque))))
            self.majDonneesAttaque(numAttaque)
            index += 1

        self.majEnCours = False

    def majDonneesAttaque(self, numAttaque):
        """met a jour les donnees de l'attaque"""
        index = None
        for i in range(0, self.ui.editionListeAttaques.rowCount()):
            if int(self.ui.editionListeAttaques.item(i, 0).text().toUtf8()) == numAttaque:
                index = i
                break

        if index != None:
            ### parametres de base
            #Type d'attaque
            item = QTableWidgetItem()
            item.setFlags(Qt.NoItemFlags)
            item.setFlags(Qt.ItemIsSelectable)

            if self.combattant.attaques[numAttaque].typ in ["cac", "dist", "zone"]:
                self.ui.editionListeAttaques.cellWidget(index, self.colonnesBase.index("Type")).setCurrentIndex(\
                    self.ui.editionListeAttaques.cellWidget(index, self.colonnesBase.index("Type")).findData(QVariant(self.combattant.attaques[numAttaque].typ)))
                self.afficherDonneesAttaqueZone(index, (self.combattant.attaques[numAttaque].typ == "zone"))
            #Nom de l'attaque
            self.ui.editionListeAttaques.setItem(index, self.colonnesBase.index("Nom"), QTableWidgetItem(QString.fromUtf8(self.combattant.attaques[numAttaque].nom)))
                                    
            #Portee
            self.ui.editionListeAttaques.setItem(index, self.colonnesBase.index("Portee"), QTableWidgetItem(QString.fromUtf8(str(self.combattant.attaques[numAttaque].portee))))
                        
            ### parametres supplementaires (issus des regles)
            for elt in self.combattant.attaques[numAttaque].attributs:
                col = 10 + regles.ordreAttributsAttaques().index(elt)
                self.ui.editionListeAttaques.setItem(index, col , QTableWidgetItem(QString.fromUtf8(str(self.combattant.attaques[numAttaque].attributs[elt]))))
        else:
            print ("Attaque {} introuvable, impossible de maj".format(numPion))
 
        
    def celluleModifiee(self, ligne, colonne):
        """une cellule de la table a ete modifiee"""
        if not self.majEnCours:
            numAttaque = int(self.ui.editionListeAttaques.item(ligne, 0).text().toUtf8())
            if colonne < len(self.colonnesBase):
                if colonne == self.colonnesBase.index("Nom"):
                    nom = str(self.ui.editionListeAttaques.item(ligne, colonne).text().toUtf8())
                    if not len(nom) > 0:
                        nom = "Att. {}".format(numAttaque)
                    self.combattant.attaques[numAttaque].nom = nom
                
                elif colonne == self.colonnesBase.index("Type"):
                    typ = str(self.ui.editionListeAttaques.cellWidget(ligne, colonne).itemData(\
                              self.ui.editionListeAttaques.cellWidget(ligne, colonne).currentIndex()).toString())
                    self.combattant.attaques[numAttaque].typ = typ
                    self.afficherDonneesAttaqueZone(ligne, (typ == "zone"))
                    
                elif colonne == self.colonnesBase.index("Forme"):
                    forme = str(self.ui.editionListeAttaques.cellWidget(ligne, colonne).itemData(\
                              self.ui.editionListeAttaques.cellWidget(ligne, colonne).currentIndex()).toString())
                    self.combattant.attaques[numAttaque].formeZone = forme
                    
                elif colonne == self.colonnesBase.index("Portee"):
                    #doit etre de type numerique
                    try:
                        portee = int(str(self.ui.editionListeAttaques.item(ligne, colonne).text().toUtf8()))
                        valide = True
                    except:
                        valide = False
                    if valide:
                        self.combattant.attaques[numAttaque].portee = portee
                    else:    
                        self.ui.editionListeAttaques.item(ligne, colonne).setText(QString.fromUtf8(self.combattant.attaques[numAttaque].portee))

                elif colonne == self.colonnesBase.index("Rayon"):
                    #doit etre de type numerique
                    try:
                        rayon = int(str(self.ui.editionListeAttaques.item(ligne, colonne).text().toUtf8()))
                        valide = True
                    except:
                        valide = False
                    if valide:
                        self.combattant.attaques[numAttaque].rayon = rayon
                    else:    
                        self.ui.editionListeAttaques.item(ligne, colonne).setText(QString.fromUtf8(str(self.combattant.attaques[numAttaque].rayon)))
                        
            elif colonne >= 10:
                self.majEnCours = True
                index = colonne - 10
                attribut = regles.ordreAttributsAttaques()[index]
                valeurAttribut = regles.listeControleAttaques()[attribut].controler(str(self.ui.editionListeAttaques.item(ligne, colonne).text().toUtf8()))
                if valeurAttribut != None:
                    self.combattant.attaques[numAttaque].attributs[attribut] = valeurAttribut
                else:
                    self.ui.editionListeAttaques.item(ligne, colonne).setText(QString.fromUtf8(str(self.combattant.attaques[numAttaque].attributs[attribut])))
                self.majEnCours = False

    def majTypeAttaque(self):
        """une des liste de type a ete modifiee, on met a jour toute la colonne (en attendant mieux :( )"""
        colonne = self.colonnesBase.index("Type")
        for i in range(0, self.ui.editionListeAttaques.rowCount()):
            if str(self.ui.editionListeAttaques.cellWidget(i, colonne).itemData(\
                   self.ui.editionListeAttaques.cellWidget(i, colonne).currentIndex())) != \
                   self.combattant.attaques[int(self.ui.editionListeAttaques.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.colonnesBase.index("Forme")
        for i in range(0, self.ui.editionListeAttaques.rowCount()):
            if self.ui.editionListeAttaques.cellWidget(i, colonne).__class__.__name__ == "QComboBox":
                if str(self.ui.editionListeAttaques.cellWidget(i, colonne).itemData(\
                       self.ui.editionListeAttaques.cellWidget(i, colonne).currentIndex())) != \
                       self.combattant.attaques[int(self.ui.editionListeAttaques.item(i, 0).text().toUtf8())].formeZone:
                    self.celluleModifiee(i, colonne)
                
    def nouvelleAttaque(self):
        """ajoute une ligne a la table et une attaque au pion"""
        self.combattant.attaques.append(Attaque())
        self.majListe()

    def supprimerAttaque(self):
        """supprime l'attaque selectionnee de la liste des attaques du pion"""
        numAttaque = None

        for i in range(0, self.ui.editionListeAttaques.rowCount()):
            if self.ui.editionListeAttaques.item(i,0).isSelected():
                numAttaque = int(self.ui.editionListeAttaques.item(i,0).text().toUtf8())
        if numAttaque != None:
            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.majListe()
        else:
            print "pas d'attaque selectionnee"

    def listeTypesAttaques(self):
        """retourne la QComboBox qui apparait dans la colonne Type d'attaque"""
        liste = QComboBox()
        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

    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 == True:
            numAttaque = int(self.ui.editionListeAttaques.item(ligne, 0).text().toUtf8())
            if self.ui.editionListeAttaques.cellWidget(ligne, self.colonnesBase.index("Forme")) == None:
                self.ui.editionListeAttaques.setCellWidget(ligne, self.colonnesBase.index("Forme"), self.listeFormesZone())
            if self.combattant.attaques[numAttaque].formeZone in ["ligne", "disque", "cone"]:
                self.ui.editionListeAttaques.cellWidget(ligne, self.colonnesBase.index("Forme")).setCurrentIndex(\
                    self.ui.editionListeAttaques.cellWidget(ligne, self.colonnesBase.index("Forme")).findData(QVariant(self.combattant.attaques[numAttaque].formeZone)))
            item = QTableWidgetItem(QString.fromUtf8(str(self.combattant.attaques[numAttaque].rayon)))
            item.setBackgroundColor(QColor("white"))
            self.ui.editionListeAttaques.setItem(ligne, self.colonnesBase.index("Rayon"), item)
        else:
            if self.ui.editionListeAttaques.cellWidget(ligne, self.colonnesBase.index("Forme")) != None:
                self.ui.editionListeAttaques.removeCellWidget(ligne, self.colonnesBase.index("Forme"))
            item = QTableWidgetItem(QString.fromUtf8(""))
            item.setFlags(Qt.NoItemFlags)
            item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
            item.setBackgroundColor(QColor(200,200,200))
            self.ui.editionListeAttaques.setItem(ligne, self.colonnesBase.index("Forme"), item)    
            item = QTableWidgetItem(QString.fromUtf8(""))
            item.setFlags(Qt.NoItemFlags)
            item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
            item.setBackgroundColor(QColor(200,200,200))
            self.ui.editionListeAttaques.setItem(ligne, self.colonnesBase.index("Rayon"), item)

        self.majEnCours = False
