import os
import glob
import lancedb
from PyPDF2 import PdfReader
import openai
import tkinter as tk
from tkinter import filedialog
from config import OPENAI_API_KEY

# Setze deinen OpenAI API-Schlüssel
openai.api_key = OPENAI_API_KEY

def extract_text_from_pdf(file_path):
    reader = PdfReader(file_path)
    text = ""
    for page in reader.pages:
        page_text = page.extract_text()
        if page_text:
            text += page_text
    return text

def get_embedding(text):
    # OpenAI Embeddings API verwenden
    response = openai.Embedding.create(
        input=text,
        model="text-embedding-ada-002"
    )
    embedding = response['data'][0]['embedding']
    return embedding

def load_pdfs_to_lancedb(directory, db_path):
    # Verbindung zur LanceDB herstellen (synchroner Client)
    db = lancedb.connect(db_path)
    table_name = 'pdf_embeddings'
    data = []
    # Über alle PDFs im Verzeichnis iterieren
    for pdf_file in glob.glob(os.path.join(directory, "*.pdf")):
        text = extract_text_from_pdf(pdf_file)
        if not text:
            continue
        embedding = get_embedding(text)
        # Daten zum Einfügen vorbereiten
        data.append({
            'vector': embedding,
            'file_link': pdf_file,
            'text': text  # Optional, könnte hilfreich sein
        })
    # Tabelle erstellen oder öffnen
    if table_name in db.table_names():
        table = db.open_table(table_name)
        table.add(data)
    else:
        table = db.create_table(table_name, data=data)

def semantic_search(query, db_path, top_k=5):
    db = lancedb.connect(db_path)
    table = db.open_table('pdf_embeddings')
    query_embedding = get_embedding(query)
    # Suche in der Tabelle durchführen
    results = table.search(query_embedding).limit(top_k).to_df()
    # Dateilinks aus den Ergebnissen extrahieren
    file_links = results['file_link'].tolist()
    return file_links

if __name__ == "__main__":
    import sys
    import argparse

    # Argument Parser für Kommandozeilenargumente
    parser = argparse.ArgumentParser(description='PDF-Semantische Suche mit LanceDB')
    parser.add_argument('--db_dir', type=str, help='Pfad zum LanceDB-Verzeichnis', default='lancedb_data')
    args = parser.parse_args()

    lancedb_path = args.db_dir

    # Tkinter GUI initialisieren
    root = tk.Tk()
    root.withdraw()  # Hauptfenster ausblenden

    # Ordnerauswahl-Dialog öffnen
    pdf_directory = filedialog.askdirectory(title="Bitte wählen Sie das PDF-Verzeichnis aus")

    # Überprüfen, ob das Verzeichnis existiert
    if not pdf_directory or not os.path.isdir(pdf_directory):
        print("Kein gültiges Verzeichnis ausgewählt. Das Programm wird beendet.")
        sys.exit(1)

    # PDFs in LanceDB laden
    load_pdfs_to_lancedb(pdf_directory, lancedb_path)

    # Semantische Suche durchführen
    while True:
        query = input("Gib deine Suchanfrage ein (oder 'exit' zum Beenden): ")
        if query.lower() == 'exit':
            break
        results = semantic_search(query, lancedb_path)
        print("Passende Dateien:")
        for file_link in results:
            print(file_link)
