from base_de_donnees_vectorielle.modele import Document

TAILLE_CHUNK = 30
RECOUVREMENT = 10

def decouper_en_chunks(texte: str,
                       taille_chunk: int = TAILLE_CHUNK,
                       recouvrement: int = RECOUVREMENT,
                       ) -> list[str]:
    """
    Découpe un texte en chunks de taille fixe avec recouvrement.

    Le découpage est réalisé en nombre de mots.

    :param texte: Texte à découper.
    :param taille_chunk: Nombre maximal de mots par chunk.
    :param recouvrement: Nombre de mots partagés entre deux chunks successifs.
    :return: Liste des chunks.
    :raises ValueError: Si les paramètres sont incohérents.
    """
    if taille_chunk <= 0:
        raise ValueError("La taille des chunks doit être strictement positive.")
    if recouvrement < 0:
        raise ValueError("Le recouvrement ne peut pas être négatif.")
    if recouvrement >= taille_chunk:
        raise ValueError("Le recouvrement doit être strictement inférieur à la taille du chunk.")
    mots = texte.split()
    if not mots:
        return []
    chunks: list[str] = []
    pas = taille_chunk - recouvrement
    for debut in range(0, len(mots), pas):
        fin = debut + taille_chunk
        morceau = mots[debut:fin]
        if morceau:
            chunks.append(" ".join(morceau))
            if fin >= len(mots):
                break
    return chunks


def decouper_document(document: Document,
                      taille_chunk: int = TAILLE_CHUNK,
                      recouvrement: int = RECOUVREMENT,
                      ) -> list[tuple[int, str]]:
    """
    Découpe un document en chunks numérotés.

    :param document: Document à découper.
    :param taille_chunk: Nombre maximal de mots par chunk.
    :param recouvrement: Nombre de mots partagés entre deux chunks successifs.
    :return: Liste de couples (id_chunk, texte_chunk).
    """
    chunks = decouper_en_chunks(texte=document.texte,
                                taille_chunk=taille_chunk,
                                recouvrement=recouvrement,
                                )

    return list(enumerate(chunks))
