import json
import os

import numpy as np

from base_de_donnees_vectorielle.modele import ChunkVecteur

def sauvegarder_base(base: list[ChunkVecteur],
                     chemin: str = "db/vector_db.json",
                     ):
    """
    Sauvegarde la base vectorielle sur disque au format JSON.

    :param base: Base vectorielle à sauvegarder.
    :param chemin: Chemin du fichier cible.
    """
    repertoire = os.path.dirname(chemin)
    if repertoire:
        os.makedirs(repertoire, exist_ok=True)
    contenu = []
    for chunk_vecteur in base:
        contenu.append({"ref_document": chunk_vecteur.ref_document,
                        "id_chunk": chunk_vecteur.id_chunk,
                        "texte": chunk_vecteur.texte,
                        "embedding": chunk_vecteur.embedding.tolist(),
                        }
                       )
    with open(chemin, "w", encoding="utf-8") as fichier:
        json.dump(contenu, fichier, ensure_ascii=False, indent=2)


def charger_base(chemin: str = "db/vector_db.json") -> list[ChunkVecteur]:
    """
    Recharge la base vectorielle depuis le disque.

    :param chemin: Chemin du fichier JSON.
    :return: Base vectorielle chargée.
    """
    with open(chemin, "r", encoding="utf-8") as fichier:
        contenu = json.load(fichier)
    base: list[ChunkVecteur] = []
    for element in contenu:
        base.append(ChunkVecteur(ref_document=element["ref_document"],
                                 id_chunk=element["id_chunk"],
                                 texte=element["texte"],
                                 embedding=np.array(element["embedding"], dtype=float),
                                 )
                    )
    return base
