import os

'''
----------------------------------------------------------------------------------------------------
 Classe Node - Permet la construction progressive d'un arbre par ajouts successifs de sous-noeuds
	- Chaque instance représente un noeud dans une arborescence, qui peut être:
		-- le noeud racine d'un arbre (donc l'arbre entier)
		-- un noeud à l'intérieur de l'arbre, lui-même sous-noeud d'un noeud parent
		-- une feuille qui n'a pas de noeud enfant
	- La valeur du noeud peut être de n'importe quel type ex: chaine, entier etc... notamment un
	objet lui-même (qui serait manipulable par une lambda)
----------------------------------------------------------------------------------------------------
'''
class Node:
	
	# Instanciation d'un noeud uniquement avec sa valeur (pas de sous-noeud au départ)
	def __init__(self,nodeValue):
		self.subNodes = []
		self.value = nodeValue

	# Ajoute un sous-noeud à l'instance (enfant direct)
	def addSubNode(self,node):
		self.subNodes.append(node)

	# Affiche l'instance (valeur du noeud) et tous ses sous-noeuds (s'il en est) par récursivité
	# en organisant l'affichage de manière à décaler chaque sous-niveau de deux espaces
	def view(self,depth = 0):
		# Si le noeud contient des sous-noeuds, on affiche son nom entre crochets
		if self.subNodes:
			print( "{}[{}]".format("  " * depth , self.value) )
		else:
			print("  " * depth , self.value)
		# On augmente la profondeur et on passe aux enfants éventuels par récursivité
		depth += 1
		for node in self.subNodes: node.view(depth)
		
'''
----------------------------------------------------------------------------------------------------
 Exemple d'utilisation de la classe Node ci-dessus pour lister les fichiers et sous-répertoires
 d'un repertoire racine
 NB:	on peut tester avec l'exemple d'arborescence jointe : "test_directory" à mettre à la racine du disque dur
----------------------------------------------------------------------------------------------------
'''
# Construit un arbre représentatif de l'architecture des fichiers et réperoires, à partir du chemin
# fourni, en utilisant la classe Node de manière récursive.
# Nécessite l'import du package "os" pour la lecture des noms de fichiers/répertoire sur le disque
def getDirectoryNode(path):
	# On construit le noeud racine (donc l'arbre) en ne conservant que le nom de fichier et pas le
	# chemin complet pour faciliter la lecture in fine
	node = Node(os.path.split(path)[1])
	
	# si le chemin désigne un répertoire, on ajoute un sous-noeud pour chaque fichier/répertoire
	# qu'il contient
	if os.path.isdir(path):
		for itemName in os.listdir(path):
			fullPathName = os.path.join(path,itemName)			# Reconstruction du chemin complet
			node.addSubNode(getDirectoryNode(fullPathName))		# Injection du sous-noeud correspondant
	return node

	
'''
----------------------------------------------------------------------------------------------------
 Test in situe (nécessite l'existence du répertoire de test test_directory) - afiner le chemin
 si besoin
----------------------------------------------------------------------------------------------------
'''
tree = getDirectoryNode("C:\\test_directory")
tree.view()