import random
import openai
import re
from googlesearch import search
from newspaper import Article, Config
import requests
import mimetypes
import time
import os
import PyPDF2
import docx
import pandas as pd
from youtube_transcript_api import YouTubeTranscriptApi

# Configurări pentru OpenAI (cu modelul LLaMA2)
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 genera o temă de discuție cu AI 1
def generate_theme(prompt):
    messages = [{"role": "user", "content": prompt}]
    return get_response_from_openai(messages)

# Funcție pentru AI 2 pentru a confirma tema
def confirm_theme(theme):
    messages = [{"role": "user", "content": f"Te rog confirmă că vei discuta pe tema: {theme}"}]
    return get_response_from_openai(messages)

# Funcția `get_response_from_openai` pentru a obține răspunsuri de la model
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 scrie logul în fișier
def scrie_in_fisier(log_message):
    with open("aiindependent.txt", "a", encoding="utf-8") as f:
        f.write(log_message + "\n")
    print(f"[LOG] {log_message}")  # Afișăm mesajul și în consolă

# Funcție pentru a fragmenta un text în secțiuni de 700 de cuvinte
def split_text_into_chunks(text, chunk_size=700):
    words = text.split()
    return [' '.join(words[i:i + chunk_size]) for i in range(0, len(words), chunk_size)]

# Funcție pentru a descărca fișiere cu timeout și a gestiona erorile
def download_file_with_timeout(url, timeout=10):
    try:
        response = requests.get(url, timeout=timeout)
        response.raise_for_status()  # Ridică excepții pentru statusuri HTTP eronate
        return response.content
    except requests.exceptions.Timeout:
        print(f"[WARN] Timeout la descărcarea fișierului: {url}")
        return None
    except requests.exceptions.RequestException as e:
        print(f"[WARN] Eroare la descărcarea fișierului: {e}")
        return None

# Funcție pentru a extrage textul din pagini web folosind newspaper3k
def extract_text_from_url(url):
    print(f"[INFO] Extragere text din URL: {url}")
    try:
        article = Article(url)
        article.download()
        article.parse()
        return article.text
    except Exception as e:
        print(f"[WARN] Eroare la extragerea textului din URL: {e}")
        return ""

# Funcție pentru a descărca și extrage textul din fișiere PDF
def extract_text_from_pdf(url):
    print(f"[INFO] Descărcare și extragere text din PDF: {url}")
    content = download_file_with_timeout(url)
    if content:
        try:
            with open("temp.pdf", "wb") as file:
                file.write(content)
            with open("temp.pdf", "rb") as file:
                reader = PyPDF2.PdfReader(file)
                text = ""
                for page in reader.pages:
                    text += page.extract_text()
            os.remove("temp.pdf")
            return text
        except Exception as e:
            print(f"[WARN] Eroare la extragerea textului din PDF: {e}")
            return ""
    else:
        return ""

# Funcție pentru a descărca și extrage textul din fișiere DOCX
def extract_text_from_docx(url):
    print(f"[INFO] Descărcare și extragere text din DOCX: {url}")
    content = download_file_with_timeout(url)
    if content:
        try:
            with open("temp.docx", "wb") as file:
                file.write(content)
            doc = docx.Document("temp.docx")
            text = ""
            for para in doc.paragraphs:
                text += para.text + "\n"
            os.remove("temp.docx")
            return text
        except Exception as e:
            print(f"[WARN] Eroare la extragerea textului din DOCX: {e}")
            return ""
    else:
        return ""

# Funcție pentru a extrage textul din fișiere Excel
def extract_text_from_excel(url):
    print(f"[INFO] Descărcare și extragere text din Excel: {url}")
    content = download_file_with_timeout(url)
    if content:
        try:
            with open("temp.xlsx", "wb") as file:
                file.write(content)
            df = pd.read_excel("temp.xlsx")
            text = df.to_string(index=False)  # Convertim tot conținutul în text
            os.remove("temp.xlsx")
            return text
        except Exception as e:
            print(f"[WARN] Eroare la extragerea textului din Excel: {e}")
            return ""
    else:
        return ""

# Funcție pentru a extrage subtitrări de pe YouTube
def extract_text_from_youtube(url):
    print(f"[INFO] Extragere subtitrări din YouTube: {url}")
    try:
        video_id = url.split("v=")[1]
        transcript_list = YouTubeTranscriptApi.get_transcript(video_id)
        text = " ".join([t['text'] for t in transcript_list])
        return text
    except Exception as e:
        print(f"[WARN] Eroare la extragerea subtitrărilor de pe YouTube: {e}")
        return ""

# Funcția principală pentru căutare și extragere text
def perform_search(query, num_results=5):
    print(f"[INFO] Încep căutarea pentru: {query}")
    results = []
    
    try:
        for url in search(query, num_results=num_results):
            print(f"[INFO] Procesăm URL-ul: {url}")
            
            if "youtube.com" in url:
                text = extract_text_from_youtube(url)
            else:
                mime_type, _ = mimetypes.guess_type(url)
                
                if mime_type == "application/pdf":
                    text = extract_text_from_pdf(url)
                elif mime_type == "application/vnd.openxmlformats-officedocument.wordprocessingml.document":
                    text = extract_text_from_docx(url)
                elif mime_type in ["application/vnd.ms-excel", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"]:
                    text = extract_text_from_excel(url)
                else:
                    text = extract_text_from_url(url)
            
            if text:
                chunks = split_text_into_chunks(text)
                results.extend(chunks)
                print(f"[INFO] Text extras și fragmentat din {url}")
                
            if len(results) >= num_results:
                break
    
    except Exception as e:
        print(f"[ERROR] Eroare în timpul căutării: {e}")
    
    return results

# Funcție pentru AI 1 să aleagă și să execute un script bazat pe un prompt
def alege_si_executa_script(prompt):
    optiuni = {
        1: "perform_search"
    }
    alegere = random.choice(list(optiuni.keys()))  # Alegem o opțiune disponibilă
    script_ales = optiuni[alegere]

    if script_ales == "perform_search":
        print(f"[INFO] AI 1 alege să folosească funcția de căutare pe baza promptului: {prompt}")
        rezultate = perform_search(prompt)  # Asigură-te că această funcție este definită
        scrie_in_fisier(f"AI 1 a realizat o căutare și a obținut următoarele rezultate:\n" + "\n".join(rezultate))

def main():
    # AI 1 generează o temă de discuție folosind modelul real LLaMA2
    prompt_ai1 = "Te rog să generezi o temă de discuție pentru un alt AI."
    tema = generate_theme(prompt_ai1)  # Utilizăm AI 1 pentru a genera tema
    scrie_in_fisier(f"AI 
