import requests
import openai
import re
from googlesearch import search
from newspaper import Article, Config

# Configurări pentru OpenAI
openai.api_base = "http://localhost:11434/v1"
openai.api_key = "ollama"
model_openai = "llama2"

# Setăm un antet HTTP pentru a evita eroarea 403
user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
config = Config()
config.browser_user_agent = user_agent

# Funcție pentru a fragmenta un text în secțiuni de 120 de cuvinte
def split_text_into_chunks(text, chunk_size=120):
    words = text.split()
    return [' '.join(words[i:i + chunk_size]) for i in range(0, len(words), chunk_size)]

# Funcție pentru a filtra bucățile de text pe baza cuvintelor cheie
def filter_chunks_by_keywords(chunks, keywords):
    filtered_chunks = []
    for chunk in chunks:
        if any(keyword.lower() in chunk.lower() for keyword in keywords):
            filtered_chunks.append(chunk)
    return filtered_chunks

# Funcție pentru a elimina publicitatea din textul extras
def filter_out_advertisements(text):
    lines = text.split('\n')
    filtered_lines = [line for line in lines if 'publicitate' not in line.lower()]
    return '\n'.join(filtered_lines)

# Funcție pentru a căuta și extrage informații de pe web
def search_and_extract_info(query, cycle_number):
    try:
        search_results = list(search(query, stop=cycle_number * 2))  # Căutăm mai multe rezultate pentru a asigura relevanța
        if len(search_results) >= cycle_number:
            url = search_results[cycle_number - 1]
            print(f"Procesăm URL-ul din ciclul {cycle_number}: {url}")
            try:
                article = Article(url, config=config)
                article.download()
                article.parse()
                article_text = filter_out_advertisements(article.text)
                chunks = split_text_into_chunks(article_text)
                return chunks, url
            except Exception as e:
                print(f"Nu s-a putut procesa {url}: {e}")
                return [], url
        else:
            print(f"Nu s-au găsit suficiente rezultate pentru ciclul {cycle_number}")
            return [], None
    except Exception as e:
        print(f"Eroare în timpul căutării: {e}")
        return [], None

# Funcție pentru a obține răspunsul de la modelul compatibil OpenAI
def get_response_from_openai(messages, max_tokens=100):
    try:
        response = openai.ChatCompletion.create(
            model=model_openai,
            messages=messages,
            temperature=0.7,
            max_tokens=max_tokens
        )
        return response['choices'][0]['message']['content'].strip()
    except Exception as e:
        return f"Error: {e}"

# Funcție pentru a simula discuția între doi agenți AI
def agent_conversation_loop(subject, num_cycles, keywords):
    file_name = "rezultat.txt"

    with open(file_name, 'w', encoding='utf-8') as file:
        file.write(f"Subiect: {subject}\n\n")

        for i in range(1, num_cycles + 1):
            print(f"\n=== Ciclul {i}: Căutare și procesare informații... ===")
            file.write(f"\n=== Ciclul {i}: ===\n")  # Marcare clară a fiecărui ciclu în fișier
            chunks, url = search_and_extract_info(subject, i)
            if not chunks:  # Dacă nu sunt bucăți relevante, folosim fallback
                ai1_input = f"Nu am găsit informații relevante pe net pentru {subject}. Poți adăuga perspective bazate pe cunoștințele tale?"
                ai1_response = get_response_from_openai([{"role": "user", "content": ai1_input}], max_tokens=150)
                print(f"Text generat de AI1 (fallback):\n{ai1_response}\n")
            else:
                filtered_chunks = filter_chunks_by_keywords(chunks, keywords)
                if filtered_chunks:
                    chunk = filtered_chunks[0]  # Luăm doar primul chunk relevant
                    file.write(f"Text extras de pe net:\n{chunk}\n\n")  # Salvăm textul extras în fișier
                    ai1_input = f"{subject}\n\nText extras de pe net:\n{chunk}\n\nPoți oferi o perspectivă nouă?"
                    ai1_response = get_response_from_openai([{"role": "user", "content": ai1_input}], max_tokens=150)
                    print(f"Text generat de AI1:\n{ai1_response}\n")
                else:
                    ai1_response = f"Nu s-au găsit bucăți relevante pentru ciclul {i}"

            # AI2 primește un prompt mai specific pentru a adăuga perspective diferite
            ai2_input = f"AI1 a menționat următoarele despre {subject}:\n{ai1_response}\n\nPoți adăuga o perspectivă diferită sau detalii suplimentare despre acest subiect?"
            ai2_response = get_response_from_openai([{"role": "user", "content": ai2_input}], max_tokens=150)
            print(f"Text generat de AI2:\n{ai2_response}\n")
            
            # Salvăm răspunsurile AI în fișier
            file.write(f"Text generat de AI1:\n{ai1_response}\n\n")
            file.write(f"Text generat de AI2:\n{ai2_response}\n\n")

            # Marcare clară la finalizarea ciclului
            print(f"\n=== Ciclul {i} finalizat. ===")
        
        print(f"Conversația a fost salvată în fișierul {file_name}")

if __name__ == "__main__":
    subject = input("Introduceți tema discuției: ")
    num_cycles = int(input("Introduceți numărul de cicluri de căutare: "))
    keywords = input("Introduceți cuvintele cheie (separate prin virgulă): ").split(',')

    agent_conversation_loop(subject, num_cycles, keywords)
