# La fin de la question 1 me semble à reporter à plus tard (question 3)

import ascii

#############################################################################
# Question 1 et 2 : Écrire les codes des fonctions bin2dec et qrcode2dec
#              Proposer un test de qrcode2dec    
#############################################################################

def bin2dec(bin_tupl):
    dec = 0
    for bit in bin_tupl:
        dec = dec * 2 + int(bit)
    return dec    

def qrcode2dec(qrcode):
    dec_list = []
    for ligne in qrcode:
        dec_list.append(bin2dec(ligne))
    return dec_list

# implémentation du QR Code de la figure 1:
qrcode_fig1 = ascii.figure1

def test_bin2dec():
    assert bin2dec((0,1,1,0,0,0,0,1)) == 97

def test_qrcode2dec():
    assert qrcode2dec(qrcode_fig1) == [77, 46, 72, 97, 114, 97]

test_bin2dec()
test_qrcode2dec()

#############################################################################
# Question 3 : Fonctions dec2str et test_dec2str                             
#############################################################################
def dec2str(liste_dec):
    """ entrée: liste d'entiers décimaux
        sortie: chaine de caractère formée des caractères correspondant
        de la table ascii """
    table_ascii = ascii.dict_ascii
    chaine = ""
    for entier in liste_dec:
        if entier in table_ascii: # on ne prend en compte que les entiers présents dans la table ascii donnée
            chaine += table_ascii[entier]
        # on peut également lever une erreur si l'entier n'est pas dans la table ascii, ou le remplacer
        else:
            chaine += "?"
        # on a un 233 au lieu d'un 101 dans le test 3
    return chaine

def test_dec2str():
    """ Teste la fonction dec2str avec des données issues du module fourni """
    tests = [ascii.test1, ascii.test2, ascii.test3]
    for test in tests:
        print(dec2str(test))

test_dec2str()

def qrcode2str(qrcode):
    return dec2str(qrcode2dec(qrcode))

print("QR Code de la figure 1 (Créateur du QR Code):", qrcode2str(qrcode_fig1))

#############################################################################
# Question 4 : Fonction str2qrcode déficiente
#############################################################################

def str2qrcode(message):
    """
    Convertit une chaine de caractères en liste de tuples binaires.
    """
    qrcode = []
    table_inverse = {valeur: cle for cle, valeur in ascii.dict_ascii.items()}

    for caractere in message:
        entier = table_inverse.get(caractere, 63)
        binaire_str = bin(entier)[2:]
        if len(binaire_str) < 8: # On rajoute des zéros à gauche pour avoir une représentation sur 8 bits
            binaire_str = "0" * (8 - len(binaire_str)) + binaire_str
        ligne = tuple(int(bit) for bit in binaire_str)
        qrcode.append(ligne)
        
    return qrcode


# print(str2qrcode("M.Hara"))
# On voit qu'un tuple de la liste renvoyée n'a pas la bonne longueur (8 bits)

assert str2qrcode("M.Hara") == qrcode_fig1