# !attention! Les "fonctions" du sujet sont des méthodes
# !attention! Vu la méthode decoder, les méthodes à compléter de la question 1 doivent aussi mettre à jour les attributs de l'objet

class Transmission:

	def __init__(self, trame):
		self._id = None
		self._temperature = None
		self._humidite = None
		self._trame = trame
		
		self.decoder()
		
	def __repr__(self):
		""" Méthode magique pour affichage """
		return f"ID : {self._id} / Temp. : {self._temperature}°C / Hum. : {self._humidite}%"
		
	def decoder(self):
		self.decoder_id()
		self.decoder_temperature()
		self.decoder_humidite()
		
	def decoder_id(self):
		self._id = int(self._trame[0:8], 2) # int(s, 2) : conversion binaire -> décimal
		
	def decoder_temperature(self):
		self._temperature = (int(self._trame[16:28], 2) - 900 ) / 10
		return self._temperature
		
	def decoder_humidite(self):
		self._humidite = int(self._trame[28:32], 2) * 10 + int(self._trame[32:36], 2) # cohérent avec 100% également
		return self._humidite
		
	def get_id(self):
		return self._id
		
	def get_temperature(self):
		return self._temperature
		
	def get_humidite(self):
		return self._humidite
		
	def est_valide(self):
		def nb_uns(ch):
			total = 0
			for bit in ch:
				if bit == '1':
					total += 1
			return total

		# Question 4 : à placer avant les tests de parité, pour éviter un "out of range"
		test_longueur = len(self._trame) == 40
		if not test_longueur:
			return False

		test_id = nb_uns(self._trame[0:8]) % 2 == int(self._trame[36])
		test_cle = nb_uns(self._trame[8:16]) % 2 == int(self._trame[37])
		test_temperature = nb_uns(self._trame[16:28]) % 2 == int(self._trame[38])
		test_humidite = nb_uns(self._trame[28:36]) % 2 == int(self._trame[39])
  
		return test_id and test_cle and test_temperature and test_humidite


def test_Transmission():
	t = Transmission("0010101011001000010010001100011000101101")
	t.decoder() # pas pratique pour tester individuellement les méthodes si vous avez une erreur d'execution, mais rapide à écrire
	assert t.get_temperature() == 26.4
	assert t.get_humidite() == 62
 
	# tests de la question 2
	assert t.est_valide()
	t = Transmission("0010101011001000010010001100011000101100") # dernier bit modifié
	assert not t.est_valide()

test_Transmission()