# -*- coding: utf-8 -*-

# Copyright 2009 Manik Bhattacharjee (manik-listes at altern.org)
#
# This file is part of PyVote.
#
# PyVote is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# PyVote is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with PyVote.  If not, see <http://www.gnu.org/licenses/>.


#
# Crée une fenetre de dialogue permettant de voter pour le Vote unique transférable
# Ce programme n'est pas appelé directement en pratique, mais il est appelé par le 
#    programme de vote principal
#
import sys, PyQt4
from PyQt4 import QtGui, QtCore
from VoteUniqueTransferableUI import Ui_VoteUniqueTransferable
from ScrutinIO import Scrutin, Votes, Registre
# Le troisieme exemple montre l'approche par héritage multiple
# unique ou l'on sous classe QMainWindow et configurons
# l'interface utilisateur dans la méthode init() :

class VoteUniqueTransferableDialog(QtGui.QDialog):
    def __init__(self, scrutin):
        QtGui.QDialog.__init__(self)

        # Configure l'interface utilisateur à partir du fichier généré par Qt4 Designer
        self.ui = Ui_VoteUniqueTransferable()
        self.ui.setupUi(self)
        self.scrutin = scrutin
        self.resetVote()
        self.ajouteCandidatOff = False
        self.supprimeCandidatOff = False
        # Connecte les boutons aux fonctions associées.
        #self.connect(self.ui.voterBouton, QtCore.SIGNAL("clicked()"),self.voter)

        # Un clic sur les noms dans une liste doit les faire passer dans l'autre liste
        self.connect(self.ui.candidatList, QtCore.SIGNAL("itemClicked(QListWidgetItem*)"), self.ajouteCandidat)
        self.connect(self.ui.voteList, QtCore.SIGNAL("itemClicked(QListWidgetItem*)"), self.supprimeCandidat)


    # Quand l'utilisateur ferme la fenetre, demander une confirmation : plus que ça, il faut demander un code administrateur
    def closeEvent(self, event):
        reply = QtGui.QMessageBox.question(self, 'Message',u"Voulez-vous vraiment quitter ?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
        if reply == QtGui.QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()

    def resetVote( self ):
        self.ui.voterBouton.setEnabled(False)
        self.ui.candidatList.clear()
        self.ui.voteList.clear()
        self.ui.electeurEdit.setText("")
        self.scrutin["Candidats"].sort()
        for candidat in self.scrutin["Candidats"]:
           self.ui.candidatList.addItem(unicode(candidat))


    #Fonction appelée pour ajouter un candidat (s'il reste des places dans la liste) et l'enlever 
    def ajouteCandidat(self, item):
        index = self.ui.candidatList.row(item)
        #print "Ajout index "+repr(index)+", parmi " + repr(self.ui.candidatList.count()) + " restants"
        if self.ui.voteList.count() >= int(self.scrutin["Parametres Scrutin"]["Sieges a pourvoir"]):
          self.erreur ( u"Impossible d'ajouter un candidat, il y en a déjà un par siège disponible !" )
          return
        self.ui.voteList.addItem(item.text())
        a = self.ui.candidatList.takeItem(index)
        a = None
        if self.ui.voteList.count() == int(self.scrutin["Parametres Scrutin"]["Sieges a pourvoir"]):
          self.ui.voterBouton.setEnabled(True)
        self.ajouteCandidatOff = False

    # Supprime le candidat sélectionné dans la liste (et griser le bouton Voter)
    def supprimeCandidat(self, item):
        index = self.ui.voteList.row(item)
        #print "Suppression index "+repr(index)+", parmi " + repr(self.ui.voteList.count()) + " deja retenus"
        if self.ui.voteList.count() == int(self.scrutin["Parametres Scrutin"]["Sieges a pourvoir"]):
          self.ui.voterBouton.setEnabled(False)
        self.ui.candidatList.addItem(item.text())
        a = self.ui.voteList.takeItem(index)
        self.ui.voterBouton.setEnabled(False)
        a = None


    # Renvoie une table de hachage contenant le vote
    def getVoteHash( self ):
            vHash = {}
            for i in xrange(self.ui.voteList.count()):
              vHash[unicode(self.ui.voteList.item(i).text())] = unicode(i+1)
            return vHash

    # Validation du vote en cours
    def validateVote( self, electeurs, dejavotes ):
      if not(unicode(self.ui.electeurEdit.text()) in electeurs):
        self.erreur(u"L'identifiant de l'électeur est invalide pour cette élection !")
        return False
      elif unicode(self.ui.electeurEdit.text()) in dejavotes:
        self.erreur(u"Vous avez déjà voté !\nVote refusé !")
        return False
      elif self.ui.voteList.count() != int(self.scrutin["Parametres Scrutin"]["Sieges a pourvoir"]):
        return False
      else:
        return True


    # Renvoie l'électeur courant
    def getVotant( self ):
      return unicode(self.ui.electeurEdit.text())


    # Fonction pour afficher une erreur
    def erreur( self, message ):
        QtGui.QMessageBox.warning(self, "Scrutin", message)


if __name__ == "__main__":
   app = QtGui.QApplication(sys.argv)
   window = VoteUniqueTransferableDialog()

   window.show()
   sys.exit(app.exec_())