import requests
import gzip
import os

# Funcție pentru a descărca un fișier de la o anumită adresă URL
def download_file(url, local_filename):
    print(f"Se descarcă fișierul de la: {url}")
    with requests.get(url, stream=True) as r:
        r.raise_for_status()
        with open(local_filename, 'wb') as f:
            for chunk in r.iter_content(chunk_size=8192):
                f.write(chunk)
    print(f"Fișierul a fost salvat ca {local_filename}")
    return local_filename

# Pasul 1: Afișarea opțiunilor disponibile din baza de date Common Crawl
def list_available_datasets():
    print("Se obțin datele disponibile de la Common Crawl...")
    url = "https://data.commoncrawl.org/crawl-data/index.html"
    response = requests.get(url)
    response.raise_for_status()

    # Parsează pagina web folosind BeautifulSoup
    from bs4 import BeautifulSoup
    soup = BeautifulSoup(response.text, 'html.parser')
    
    # Găsește toate linkurile către dataset-uri
    datasets = {}
    rows = soup.find_all('tr')
    for row in rows:
        columns = row.find_all('td')
        if len(columns) == 4:
            dataset_id = columns[0].text.strip()
            anunt = columns[1].text.strip()
            miliarde_pag = columns[2].text.strip()
            dim_total = columns[3].text.strip()
            datasets[dataset_id] = (anunt, miliarde_pag, dim_total)

    # Afișează tabelul cu datele disponibile
    print("\nID/Locație\tAnunț\tMiliarde de pagini\tDimensiune totală comprimată")
    for dataset_id, details in datasets.items():
        print(f"{dataset_id}\t{details[0]}\t{details[1]}\t{details[2]}")
    
    return datasets

# Pasul 2: Alegerea dataset-ului și descărcarea fișierului WET
def download_wet_file(datasets):
    selected_id = input("\nIntroduceți ID-ul dataset-ului pe care doriți să-l descărcați: ").strip()
    if selected_id not in datasets:
        print("ID invalid. Ieșire.")
        return None
    
    dataset_url = f"https://data.commoncrawl.org/crawl-data/{selected_id}/wet.paths.gz"
    local_gz_file = f"{selected_id}_wet.paths.gz"
    
    download_file(dataset_url, local_gz_file)
    
    # Dezarhivarea fișierului WET
    with gzip.open(local_gz_file, 'rt') as f:
        wet_file_paths = f.read().splitlines()
    
    os.remove(local_gz_file)
    
    print(f"{len(wet_file_paths)} fișiere WET disponibile.")
    
    return wet_file_paths

# Pasul 3: Alegeți intervalul de linii și descărcați fișierele
def download_selected_wet_files(wet_file_paths):
    num_lines = len(wet_file_paths)
    print(f"Numărul total de linii (fișiere WET): {num_lines}")
    
    interval = input("Introduceți intervalul de linii (ex: 10-20) sau un singur număr pentru o linie: ").strip()
    
    selected_files = []
    if '-' in interval:
        start, end = map(int, interval.split('-'))
        selected_files = wet_file_paths[start-1:end]
    else:
        line_number = int(interval)
        selected_files = [wet_file_paths[line_number-1]]
    
    downloaded_files = []
    for file_path in selected_files:
        wet_file_url = f"https://data.commoncrawl.org/{file_path}"
        local_wet_file = file_path.split('/')[-1]
        download_file(wet_file_url, local_wet_file)
        downloaded_files.append(local_wet_file)
    
    return downloaded_files

# Pasul 4: Procesarea fișierelor WET pentru a filtra conținutul pe baza cuvintelor cheie
def process_wet_files(downloaded_files):
    while True:
        keywords_input = input("Introduceți cuvintele cheie, separate prin virgulă (sau scrieți 'exit' pentru a ieși): ").strip()
        if keywords_input.lower() == "exit":
            break

        keywords = [keyword.strip().lower() for keyword in keywords_input.split(',')] if keywords_input else []
        if keywords:
            keywords_filename = "_".join(keywords) + ".txt"
        else:
            keywords_filename = "all_texts.txt"
        
        with open(keywords_filename, 'w', encoding='utf-8') as output_file:
            for wet_file in downloaded_files:
                # Verificăm dacă fișierul este comprimat GZIP și îl decompresăm dacă este cazul
                if wet_file.endswith('.gz'):
                    with gzip.open(wet_file, 'rt', encoding='utf-8') as f:
                        lines = f.readlines()
                else:
                    with open(wet_file, 'r', encoding='utf-8') as f:
                        lines = f.readlines()
                
                for line in lines:
                    if not keywords or any(keyword in line.lower() for keyword in keywords):
                        output_file.write(line)
                        print(f"Linie potrivită: {line.strip()[:100]}...")  # Afișează primele 100 caractere
            
            print(f"Textele au fost salvate în {keywords_filename}")

    for wet_file in downloaded_files:
        os.remove(wet_file)
    
    print("Fișierele WET temporare au fost șterse.")

# Funcție principală pentru a executa toate etapele
def main():
    datasets = list_available_datasets()
    if datasets:
        wet_file_paths = download_wet_file(datasets)
        if wet_file_paths:
            downloaded_files = download_selected_wet_files(wet_file_paths)
            if downloaded_files:
                process_wet_files(downloaded_files)
    
    print("Operațiunea s-a terminat cu succes!")

if __name__ == "__main__":
    main()
