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

class ExtAttr(object):
    """classe pour l'accès à un attribut stocké dans une source de données externe
    """

    def __init__(self, attr_name):
        """initialise le connecteur vers la source de données
        attr_name est calculé automatiquement lors du chargement de ce module
        """
        self.attr_name = attr_name
        self.db_path = '/usr/share/sso/reverseTeleservice.db'

    def get_local_attr(self, attr_values):
        """
        retourne l'identifiant ENT d'un responsable ou élève en fonction
        du vecteur de fédération FrEfuVecteur transmis par le guichet ATEN.
        La correspondance est calculée en amont et stocké dans une base locale.
        Renvoie également une liste des établissement communiqués dans le vecteur (il peut
        être multivalué dans le cas d'un responsable).
        """
        import shelve
        from os.path import isfile
        import unicodedata

        def enleve_accents(val):
            if type(val) == str:
                print "** CONVERTED VAL TO UTF8 **"
                val = unicode(val, 'UTF-8')
            val = ''.join((c for c in unicodedata.normalize('NFD', val) if unicodedata.category(c) != 'Mn'))
            return val.encode('UTF-8')

        user_attrs = {}
        if not isfile(self.db_path):
            return values
        # recherche du dn de l'utilisateur
        if attr_values:
            liste_rne = user_attrs.get('ENTEleveStructRattachId', [])
            db = shelve.open(self.db_path, 'r')
            # traitement des valeurs envoyées dans le vecteur FrEduVecteur (un par élève pour les parents)
            for clerecherche in attr_values:
                # suppression des éventuels accents dans le vecteur
                clerecherche = enleve_accents(clerecherche)
                # calcul des attributs à renvoyer si le vecteur est trouvé
                try:
                    typevect = clerecherche.split('|')[0]
                    cleidstruct = clerecherche.split('|')[3]
                    etabe = clerecherche.split('|')[4]
                except:
                    print('Mauvais format de données pour la clé de fédération %s : %s' % (self.attr_name, clerecherche.encode('utf-8')))
                    # si un vecteur est mal formé, on essaye quand même d'évaluer les autres
                    continue
                # Pour les parents et élèves, on récupère ENTEleveStructRattachId dans le vecteur
                if etabe not in liste_rne:
                    liste_rne.append(etabe)
                if typevect in ("1", "2") and clerecherche in db:
                    # dans le cas des parents, on renvoie 'ENTPersonJointure' qui est stocké dans la base
                    intid = db[clerecherche]
                    if user_attrs.get('intid', intid) != intid:
                        print "ATTENTION, ATTRIBUT INTID NON UNIQUE (%s : %s != %s)" % (clerecherche, user_attrs.get('intid', intid), intid)
                    user_attrs['intid'] = [intid]
                elif typevect in ("3", "4"):
                    # cas d'un élève connecté depuis le guichet ATEN, son identifiant ENT est présent dans le vecteur
                    user_attrs['intid'] = cleidstruct
            db.close()
            user_attrs['ENTStructRattachId'] = liste_rne
        return user_attrs
