import pandas as pd
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from io import BytesIO
from pptx import Presentation
from pptx.util import Inches, Pt

class CreateDocumentPPT:
    '''
    def __init__(self, df_monograms, df_bigrams, df_trigrams):
        self.df_monograms = df_monograms
        self.df_bigrams = df_bigrams
        self.df_trigrams = df_trigrams
    '''
    def add_wordcloud_to_slide(self, df, word_column='Word'):
        words_freq = dict(zip(df[word_column], df['Frequency']))
        wc = WordCloud(width=800, height=400, background_color='white').generate_from_frequencies(words_freq)
        
        fig = plt.figure(figsize=(5, 5))
        plt.imshow(wc, interpolation='bilinear')
        plt.axis("off")
        img_buffer = BytesIO()
        plt.savefig(img_buffer, format='png')
        plt.close(fig)
        img_buffer.seek(0)
        return img_buffer
        '''
        left = Inches(2)
        top = Inches(3.5)  # Ajuste para dejar espacio a la tabla
        slide.shapes.add_picture(img_buffer, left, top, width=Inches(6), height=Inches(3))
        img_buffer.close()
        '''
    def add_table_to_slide(self, slide, df, word_column, title):
        # Añadir título para la tabla
        txBox = slide.shapes.add_textbox(Inches(0.5), Inches(0.1), Inches(9), Inches(0.5))
        tf = txBox.text_frame
        p = tf.add_paragraph()
        p.text = title  # Título del DataFrame
        p.font.bold = True
        p.font.size = Pt(18)
        
        
        rows, cols = df.shape[0] + 1, 2  # Número de filas + fila de encabezado, y dos columnas (palabra y frecuencia)
        left = Inches(0.5)
        top = Inches(0.5)
        width = Inches(9)
        height = Inches(1.5)  # Ajuste según necesidad
        
        table = slide.shapes.add_table(rows, cols, left, top, width, height).table
        
        # Encabezado de la tabla
        table.cell(0, 0).text = word_column
        table.cell(0, 1).text = "Frequency"
        
        for i, (word, freq) in enumerate(zip(df[word_column], df['Frequency']), start=1):
            table.cell(i, 0).text = str(word)
            table.cell(i, 1).text = str(freq)

    def create_ppt(self, ppt_filename):
        prs = Presentation()
        dfs_titles_columns = [
            (self.df_monograms, "Monogramas", "Word", "Análisis de Monogramas"),
            (self.df_bigrams, "Bigramas", "Bigram", "Análisis de Bigramas"),
            (self.df_trigrams, "Trigramas", "Trigram", "Análisis de Trigramas")
        ]
        
        for df, title, word_column, descr in dfs_titles_columns:
            # Añadir slide para la tabla
            slide_layout = prs.slide_layouts[5]
            slide = prs.slides.add_slide(slide_layout)
            title_placeholder = slide.shapes.title
            title_placeholder.text = f"Tabla de {title}"
            self.add_table_to_slide(slide, df, word_column, title_placeholder.text)
            
            # Añadir slide para la nube de palabras
            slide_layout = prs.slide_layouts[5]
            slide = prs.slides.add_slide(slide_layout)
            title_placeholder = slide.shapes.title
            title_placeholder.text = f"Nube de {title}"
            self.add_wordcloud_to_slide(slide, df, word_column)
        
        # Guardar presentación
        prs.save(ppt_filename)




