import os
os.environ["HF_HOME"] = r"D:\__sistem__\Masaustu\Python Yapay Zeka\Denemeler\modeller"

from pymongo import MongoClient
from transformers import AutoModelForSeq2SeqLM, AutoTokenizer


# MongoDB'ye bağlanma
client = MongoClient('mongodb://localhost:27017/')
db = client['example_db']
collection = db['employees']

# Hugging Face modelini ve tokenizer'ı yükleme
model_name = "t5-small"
model = AutoModelForSeq2SeqLM.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)

def generate_mongo_query(natural_language_query):
    # Sorguyu hazırlama
    input_text = f"Translate this to MongoDB query: {natural_language_query}"
    inputs = tokenizer.encode("translate English to SQL: " + input_text, return_tensors="pt", max_length=512, truncation=True)
    
    # Modelden yanıt alma
    outputs = model.generate(inputs, max_length=150, num_beams=4, early_stopping=True)
    mongo_query = tokenizer.decode(outputs[0], skip_special_tokens=True)
    
    return mongo_query

def query_database(query):
    results = collection.find(query)
    return list(results)

# Sonsuz döngüde kullanıcıdan sorgu alma ve işleme
while True:
    user_query = input("Sorgunuzu girin veya çıkmak için 'exit' yazın: ")
    
    if user_query.lower() == 'exit':
        print("Programdan çıkılıyor...")
        break
    
    # Kullanıcı sorgusunu analiz etme ve uygun MongoDB sorgusu oluşturma
    mongo_query_text = generate_mongo_query(user_query)
    mongo_query = eval(mongo_query_text)  # Elde edilen sorguyu Python dict'e çevirme
    
    # Veritabanını sorgulama
    results = query_database(mongo_query)
    
    # Sorgu sonucunu bir metin olarak hazırlama
    if results:
        context = "\n".join([f"{employee['name']} is an {employee['position']} earning {employee['salary']}" for employee in results])
        print(context)
    else:
        print("Sonuç bulunamadı.")
    
    print()  # Boş satır ekleyerek sorguları ayırma

# Veritabanı bağlantısını kapatma
client.close()
