import nltk
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
from nltk.stem import WordNetLemmatizer
from src.helpers.processImage import CreateDocumentPPT #esta es la clase que fue importada y creada, está en el archivo processImg en helpers
import pandas as pd
import re
from nltk.util import bigrams
from nltk.util import trigrams 

class NgramAnalysis:

    def __init__(self, list_paragraphs):
        nltk.download('punkt')
        nltk.download('stopwords')
        nltk.download('wordnet')
        nltk.download('omw-1.4')
        self.list_paragraphs = [par for par in list_paragraphs if isinstance(par, str)]
        self.lemmatizer = WordNetLemmatizer()
        
    def preprocess_text(self, paragraph):
        """Preprocesamiento de texto: eliminar signos de puntuación, pasar a minúsculas, filtrar stopwords y lematizar."""
        paragraph_clean = re.sub(r'[^\w\s]', '', paragraph).lower()
        tokens = word_tokenize(paragraph_clean)
        filtered_tokens = [self.lemmatizer.lemmatize(token) for token in tokens if token not in stopwords.words('english') and token.isalpha()]
        return filtered_tokens
        
    def extract_common_words_across_all_texts(self):
        # Preprocesar todos los párrafos primero
        all_text = ' '.join(self.list_paragraphs)
        
        # Preprocesar el texto
        filtered_tokens = self.preprocess_text(all_text)
        
        # Contar frecuencias de las palabras
        frecuencias = nltk.FreqDist(filtered_tokens)
        df_frecuencias = pd.DataFrame(frecuencias.most_common(), columns=['Word', 'Frequency'])
        
        return df_frecuencias

    def extract_common_bigrams_across_all_texts(self):
        # Concatenar todos los comentarios en un solo texto
        all_text = ' '.join(self.list_paragraphs)
        
        # Preprocesar el texto
        filtered_tokens = self.preprocess_text(all_text)
        
        # Extraer bigramas
        all_bigrams = list(bigrams(filtered_tokens))
        
        # Contar frecuencias de los bigramas
        frecuencias_bigramas = nltk.FreqDist(all_bigrams)
        df_frecuencias_bigramas = pd.DataFrame(frecuencias_bigramas.most_common(), columns=['Bigram', 'Frequency'])
        df_frecuencias_bigramas['Bigram'] = df_frecuencias_bigramas['Bigram'].apply(lambda x: ' '.join(x))
        
        return df_frecuencias_bigramas

    def extract_common_trigrams_across_all_texts(self):
        # Concatenar todos los comentarios en un solo texto
        all_text = ' '.join(self.list_paragraphs)
        
        # Preprocesar el texto
        filtered_tokens = self.preprocess_text(all_text)
        
        # Extraer trigramas
        all_trigrams = list(trigrams(filtered_tokens))
        
        # Contar frecuencias de los trigramas
        frecuencias_trigramas = nltk.FreqDist(all_trigrams)
        df_frecuencias_trigramas = pd.DataFrame(frecuencias_trigramas.most_common(), columns=['Trigram', 'Frequency'])
        df_frecuencias_trigramas['Trigram'] = df_frecuencias_trigramas['Trigram'].apply(lambda x: ' '.join(x))

        return df_frecuencias_trigramas

    def extract_words_from_dataFrames(self, dataFrames, nro):

        wordsArray = []

        for dataFrame in dataFrames:
            wordsColumn = dataFrame.values.tolist()
            for index, word in enumerate(wordsColumn, start=1):
                wordsArray.append(word[0])
                if index == nro: break

        return wordsArray