from googlesearch import search
import requests
import mimetypes
import time
import os
from newspaper import Article
import random
import PyPDF2
import docx
import pandas as pd
from youtube_transcript_api import YouTubeTranscriptApi

# 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ă
def main():
    query = input("Introdu interogarea de căutare: ")
    num_requests = int(input("Câte linkuri dorești să obții? "))
    keywords = input("Introdu cuvintele cheie, separate prin virgulă: ").split(',')
    output_file = "rezultat.txt"

    # Rescriem fișierul la prima rulare dacă există deja
    with open(output_file, "w", encoding="utf-8") as result_file:
        result_file.write("")

    processed_links = set()  # Set pentru a ține evidența linkurilor deja procesate
    
    with open(output_file, "a", encoding="utf-8") as result_file:  # Adăugare la fișier după rescrierea inițială
        start = 0
        step = 10  # Vom căuta câte 10 linkuri per pagină
        while len(processed_links) < num_requests:
            print(f"\nCerere {len(processed_links)+1}:")
            
            # Căutare Google folosind biblioteca googlesearch
            try:
                found_new_link = False
                for url in search(query, num=step, start=start, stop=start+step, pause=2.0):
                    if url not in processed_links:
                        processed_links.add(url)
                        found_new_link = True
                        print(f"[INFO] Link găsit: {url}")
                        
                        # Determinăm tipul de fișier pe baza extensiei sau a domeniului
                        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)
                            
                            # Verifică dacă vreun chunk conține cuvintele cheie
                            for chunk in chunks:
                                if any(keyword.strip().lower() in chunk.lower() for keyword in keywords):
                                    result_file.write(chunk + "\n\n")
                                    result_file.flush()  # Asigurăm scrierea imediată pe disc
                                    print(f"[INFO] Chunk adăugat în '{output_file}'")
                    
                    break  # Obține un singur link per cerere

                if not found_new_link:
                    print("[WARN] Nu au fost găsite linkuri noi.")
                    break  # Încheie dacă nu se găsesc linkuri noi
                
                # Incrementăm start-ul pentru a căuta în următoarea pagină de rezultate
                start += step
                
                # Pauză aleatoare între 7 și 12 secunde
                sleep_time = random.randint(7, 12)
                print(f"[INFO] Pauză de {sleep_time} secunde înainte de următoarea cerere.")
                time.sleep(sleep_time)

            except Exception as e:
                print(f"[ERROR] Eroare la căutarea pe Google: {e}")
                break

        print("[INFO] Scriptul a terminat execuția. Toate cererile au fost procesate.")

if __name__ == "__main__":
    main()
