import os
import json

class PersistentStorage:
    def __init__(self, storage_dir="storage"):
        """
        Initialise l'environnement de stockage avec un répertoire dédié.
        :param storage_dir: Chemin du répertoire de stockage.
        """
        self.storage_dir = storage_dir
        if not os.path.exists(storage_dir):
            os.makedirs(storage_dir)

    def _get_file_path(self, filename):
        """Renvoie le chemin complet d'un fichier dans le répertoire de stockage."""
        return os.path.join(self.storage_dir, filename + ".json")

    def read(self, filename):
        """
        Lit et retourne le contenu d'un fichier sous forme de dictionnaire.
        :param filename: Nom du fichier (sans extension).
        :return: Dictionnaire des données du fichier ou {} si le fichier est vide/inexistant.
        """
        file_path = self._get_file_path(filename)
        try:
            with open(file_path, 'r', encoding='utf-8') as file:
                return json.load(file)
        except (FileNotFoundError, json.JSONDecodeError):
            return {}

    def write(self, filename, key, value):
        """
        Ajoute ou met à jour une paire clé-valeur dans un fichier.
        :param filename: Nom du fichier (sans extension).
        :param key: Clé à ajouter ou mettre à jour.
        :param value: Valeur associée.
        """
        data = self.read(filename)
        data[key] = value
        file_path = self._get_file_path(filename)
        with open(file_path, 'w', encoding='utf-8') as file:
            json.dump(data, file, indent=4, ensure_ascii=False)
        return data

    def delete(self, filename, key):
        """
        Supprime une clé d'un fichier si elle existe.
        :param filename: Nom du fichier (sans extension).
        :param key: Clé à supprimer.
        """
        data = self.read(filename)
        if key in data:
            del data[key]
            file_path = self._get_file_path(filename)
            with open(file_path, 'w', encoding='utf-8') as file:
                json.dump(data, file, indent=4, ensure_ascii=False)
        return data

    def list_keys(self, filename):
        """
        Liste toutes les clés présentes dans un fichier.
        :param filename: Nom du fichier (sans extension).
        :return: Liste des clés.
        """
        data = self.read(filename)
        return list(data.keys())

    def query_all(self):
        """
        Interroge tous les fichiers dans le répertoire de stockage et retourne leurs contenus.
        :return: Dictionnaire de tous les fichiers et leurs données.
        """
        all_data = {}
        for file in os.listdir(self.storage_dir):
            if file.endswith(".json"):
                filename = os.path.splitext(file)[0]
                all_data[filename] = self.read(filename)
        return all_data


# Exemple d'utilisation
if __name__ == "__main__":
    # Initialisation de l'environnement
    storage = PersistentStorage()

    # Écriture de données
    storage.write("session1", "key1", "Valeur 1")
    storage.write("session1", "key2", "Valeur 2")
    storage.write("session2", "keyA", "Autre valeur")

    # Lecture des données
    print("Contenu de session1 :", storage.read("session1"))
    print("Contenu de session2 :", storage.read("session2"))

    # Suppression d'une clé
    #storage.delete("session1", "key1")
    print("Après suppression de key1 :", storage.read("session1"))

    # Liste des clés
    print("Clés dans session1 :", storage.list_keys("session1"))

    # Interrogation globale
    print("Contenu global :", storage.query_all())
