import os
import requests
import string
from newspaper import Article
from urllib.parse import urlparse

def google_search(query, api_key, cse_id):
    url = "https://www.googleapis.com/customsearch/v1"
    params = {
        'q': query,
        'key': api_key,
        'cx': cse_id
    }
    response = requests.get(url, params=params)
    if response.status_code == 200:
        results = response.json()
        print(f"Rezultate primite: {results.get('searchInformation', {}).get('totalResults', '0')} rezultate găsite.")
        return results
    else:
        print(f"Eroare la interogare API: {response.status_code}, {response.text}")
        return None

def sanitize_filename(filename):
    valid_chars = "-_.() %s%s" % (string.ascii_letters, string.digits)
    sanitized = ''.join(c if c in valid_chars else '_' for c in filename)
    return sanitized

def download_file(url, directory):
    try:
        parsed_url = urlparse(url)
        filename = sanitize_filename(os.path.basename(parsed_url.path))
        path = os.path.join(directory, filename)

        response = requests.get(url, stream=True)
        if response.status_code == 200:
            with open(path, 'wb') as f:
                for chunk in response.iter_content(1024):
                    f.write(chunk)
            print(f"Fișier descărcat: {path}")
            return path
        else:
            print(f"Eroare la descărcare {url}: {response.status_code}")
            return None
    except Exception as e:
        print(f"Eroare la procesare {url}: {e}")
        return None

def convert_html_to_text(url):
    try:
        article = Article(url)
        article.download()
        article.parse()
        return article.text
    except Exception as e:
        print(f"Eroare la extragerea textului din {url}: {e}")
        return ""

def clear_directory(directory):
    for filename in os.listdir(directory):
        file_path = os.path.join(directory, filename)
        try:
            if os.path.isfile(file_path) or os.path.islink(file_path):
                os.unlink(file_path)
            print(f"Șters: {file_path}")
        except Exception as e:
            print(f'Eroare la ștergerea {file_path}: {e}')

def main():
    api_key = 'AIzaSyCFdZPnptXLCu8u2t1JnXEd32EpUJAZ3rY'  # Replace with your real API key
    cse_id = '631c704e6cbd944df'    # Replace with your real CSE ID
    directory = 'documente_stiintifice'
    link_file = 'linkuri.txt'
    
    if not os.path.exists(directory):
        os.makedirs(directory)

    clear_files = input("Dorești să ștergi toate documentele și linkurile anterioare? (da/nu): ")
    if clear_files.lower() == 'da':
        clear_directory(directory)
        if os.path.exists(link_file):
            os.remove(link_file)
            print(f"Fișierul {link_file} a fost șters.")

    while True:
        query = input("Ce dorești să cauți? (scrie 'exit' pentru a ieși): ")
        if query.lower() == 'exit':
            break

        results = google_search(query, api_key, cse_id)
        if results and 'items' in results:
            links = [item['link'] for item in results['items']]
            print(f"Procesare {len(links)} link-uri găsite.")
            if links:
                with open(link_file, 'a') as lf:
                    for link in links:
                        lf.write(f"{link}\n")
                        if link.endswith('.pdf'):
                            print(f"Încerc să descarc PDF: {link}")
                            download_file(link, directory)
                        else:  # Tratează orice alt link ca HTML și încearcă să convertești în text
                            print(f"Încerc să convertesc conținutul în text: {link}")
                            text = convert_html_to_text(link)
                            filename = sanitize_filename(os.path.basename(urlparse(link).path)) + '.txt'
                            filepath = os.path.join(directory, filename)
                            with open(filepath, 'w', encoding='utf-8') as f:
                                f.write(text)
                                print(f"Text salvat în {filepath}")
        else:
            print("Nu au fost găsite rezultate sau există o problemă cu interogarea.")

if __name__ == '__main__':
    main()
