#-*- coding:utf-8 -*-
from math import log
from random import randint
import Image as im
from outilsBase import getBit, setBit
from BitVector import BitVector

class Coefficients:

    def __init__(self):
        '''
        Constructeur.
        '''
        pass

    
    def bit2coef(self, generateurOuBitVector, limite):
        ''' Transforme une suite de bits en suite de nombres.
            On fixe la limite, ie le plus grand nombre accepté, et la méthode
            retourne des entiers inférieurs à limite, obtenus en concaténant le
            bon nombre de bits.
            '''
        assert isinstance(limite, int)
        if isinstance(generateurOuBitVector, BitVector) :
            nbBits = int(log(limite,2))
            compteur = 0
            motBits = ''
            while True:
                motBits += str(generateurOuBitVector[compteur %\
                               len(generateurOuBitVector)])
                compteur += 1
                if compteur % nbBits == 0:
                    yield int(motBits, 2)
                    motBits = ''

        else :
            assert isinstance(generateurOuBitVector, object)
            nbBits = int(log(limite,2))
            compteur = 0
            motBits = ''
            while True:
                motBits += str(generateurOuBitVector.next())
                compteur += 1
                if compteur % nbBits == 0:
                    yield int(motBits, 2)
                    motBits = ''

    
    def getCoef(self, fichier = '', positionsBits = []):
        '''
        Retourne les bits de poids forts de l'image.
        
        On boucle indéfiniment.
        '''
        image = im.open(fichier)
        x, y = 0, 0
        while True:
            coef = image.getpixel((x,y))
            for k in positionsBits:
                yield getBit(coef, k)
            x += 1
            if x == image.size[0]:
                x = 0
                y += 1
                if y == image.size[1]:
                    y = 0
                

    def getAllCoefs(self, fichier = '', positionsBits = [], nombre = 0):
        '''
        Retourne un BitVector des bits de positionsBits de l'image.
        '''
        # IMPROVE Ce qui suit ne colle que pour des images
        image = im.open(fichier)
        x, y = 0, 0
        L = []
        compteur = 1
        while True :
            coef = image.getpixel((x,y))
            for k in positionsBits:
                L.append(getBit(coef, k))
                compteur += 1
            x += 1
            if x == image.size[0]:
                x = 0
                y += 1
                if y == image.size[1]:
                    #if y == image.size[1] or (nombre != 0 and compteur > nombre) :
                    break
                
        return BitVector(bitlist = L)


    def putAllCoefs(self, fichier = '', vecteur = None, positionBits = []):
        '''
        Remplace, dans fichier, les bits correspondant à la position
        prositionBits par ceux de vecteur.
        
        Le retour est un objet Image.
        '''
        image = im.open(fichier)
        retour = im.new(image.mode, image.size)
        assert image.size[0]*image.size[1]*len(positionBits) == len(vecteur)
        compteur = 0
        for x in range(image.size[0]):
            for y in range(image.size[1]):
                coef = image.getpixel((y,x))
                for k in positionBits:
                    coef = setBit(coef, k, vecteur[compteur])
                    compteur += 1
                retour.putpixel((y,x), coef)
        return retour



