#!/usr/bin/env python3
"""
Script de nettoyage pour PrivateGPT

Ce script permet de lister et supprimer les documents ingérés dans PrivateGPT.
Options:
- Lister tous les documents
- Supprimer des documents par préfixe (ex: "temp_section_")
- Supprimer des documents par motif
- Supprimer tous les documents
"""

import json
import re
import requests
import time
from typing import List, Dict, Any, Optional

# Configuration de l'API PrivateGPT
PGPT_URL = "http://127.0.0.1:8001"
API_URL = f"{PGPT_URL}/v1"

def list_documents() -> List[Dict[str, Any]]:
    """Liste tous les documents ingérés et renvoie la liste des métadonnées"""
    try:
        # Récupérer la liste des documents
        response = requests.get(f"{API_URL}/ingest/list")
        response.raise_for_status()
        data = response.json()

        # Format de réponse OpenAI
        if "data" in data:
            documents = data.get("data", [])
        # Format alternatif
        else:
            documents = data.get("documents", [])

        # Construire une liste normalisée des documents
        normalized_docs = []
        for doc in documents:
            doc_id = doc.get("doc_id") or doc.get("id")
            metadata = doc.get("doc_metadata", {})
            filename = metadata.get("file_name") or metadata.get("filename", "Inconnu")

            normalized_docs.append({
                "id": doc_id,
                "filename": filename,
                "metadata": metadata
            })

        return normalized_docs

    except Exception as e:
        print(f"❌ Erreur lors de la récupération des documents: {e}")
        return []


def delete_document(doc_id: str) -> bool:
    """Supprime un document par son ID"""
    try:
        response = requests.delete(f"{API_URL}/ingest/{doc_id}")
        if response.status_code == 200:
            return True
        else:
            print(f"⚠️ Échec de la suppression de l'ID {doc_id}: Code {response.status_code}")
            return False
    except Exception as e:
        print(f"❌ Erreur lors de la suppression de l'ID {doc_id}: {e}")
        return False


def delete_documents_by_criteria(pattern) -> int:
    """
    Supprime des documents selon différents critères
    Retourne le nombre de documents supprimés
    """

    documents = list_documents()

    if not documents or not pattern:
        return 0

    # Comptage des suppressions réussies
    success_count = 0

    # Filtrer les documents à supprimer
    docs_to_delete = []
    try:
        regex = re.compile(pattern)
        docs_to_delete = [doc for doc in documents if regex.search(doc["filename"])]
    except re.error as e:
        return 0

    # Supprimer les documents
    for doc in docs_to_delete:
        delete_document(doc["id"])
        # Petite pause pour éviter de surcharger l'API
        time.sleep(0.1)

    return success_count
