import streamlit as st
import plotly.express as px
import pandas as pd
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from scrapper_rss import Scrapper
import datetime as dt

st.set_option('deprecation.showPyplotGlobalUse', False)

scrapper = Scrapper()

noticias = pd.read_csv('./diarios_historicos.csv')
noticias=noticias.drop('descripcion' ,axis=1)
fechas = pd.read_csv('./fechas.csv')

diarios = list(noticias.diario.unique())
secciones = list(noticias.seccion.unique())
columna_para_nube = ['titulo', 'descripcion']

st.set_page_config(
        page_title="Observatorio de noticias",        
        initial_sidebar_state="expanded"
    )


with st.sidebar:
    st.write("Creado por [sebasur90](https://www.linkedin.com/in/sebastian-rodriguez-9b417830/)")

    diarios_select = st.multiselect('Selecciona los  diarios',
                                    diarios, default=diarios)
    secciones_select = st.multiselect('Selecciona las secciones',
                                      secciones, default=secciones)
    palabra_buscada = st.text_input('Buscar palabra', 'Ninguna')

    if st.button('Actualizar Diarios'):
        dia_str = str(dt.datetime.today().date())
        if fechas.iloc[-1]['dia'] == dia_str:
            st.success("Las noticias ya estan actualizadas")
            pass
        else:
            with st.spinner('Actualizando los siguientes diarios..'):            
                scrapper.run()
                st.write("Se actualizaron las noticias")

    


if palabra_buscada == "Ninguna" or palabra_buscada == "":
    st.title("Observatorio de Noticias")
    st.write("""            

            Hola! Bienvenido a la aplicación de análisis de sentimientos en las noticias. Esta aplicación extrae las noticias de algunos de los diarios mas
            importantes del país ( a traves del RSS) y realiza un analisis de sentimientos sobre los titulos de cada una.
            La app permite filtrar por palabra clave y generar una nube de palabras con los resultados 

            De acuerdo al sentimiento analizado sobre cada noticia encontraremos 3 grupos: 
            
            **Sentimiento Positivo:** "YPF aumentó la distribución de gasoil y aseguró que el campo tiene garantizado el abastecimiento" 
               *Probabilidades: NEGATIVA=0.008 ---  NEUTRA 0.43  ---    POSITIVA 0.56 (GANADOR --> POSITIVA)* 
               
            
            **Sentimiento Neutro:** "El aeroclub de Comodoro Rivadavia celebró su 87° aniversario"
            *Probabilidades: NEGATIVA=0.02 ---  NEUTRA 0.67  ---    POSITIVA 0.30 (GANADOR --> NEUTRA)* 
            
            **Sentimiento Negativo:** "Crecen las expectativas de inflación del mercado"
            *Probabilidades: NEGATIVA=0.60 ---  NEUTRA 0.37  ---    POSITIVA 0.15 (GANADOR --> NEGATIVA)* 
            
            """)

    

    pass
else:
    #st.title("Observatorio de Noticias")
    st.header(f"Resultados para : {palabra_buscada}")
    
    noticias = noticias[noticias['titulo'].str.contains(palabra_buscada)]

st.session_state['dataframe_filtrado'] = noticias[(noticias.diario.isin(
    diarios_select)) & (noticias.seccion.isin(secciones_select))]

st.subheader("Muestra aleatoria de noticias")
st.dataframe(st.session_state['dataframe_filtrado'].sample(frac=1))
st.session_state['dataframe_agrupado'] = st.session_state['dataframe_filtrado'].groupby(
    'diario')[['pond_negativos', 'pond_neutro', 'pond_positivo']].mean().reset_index()

fig = px.bar(st.session_state['dataframe_agrupado'], x="diario", y=['pond_neutro', "pond_negativos", 'pond_positivo'], text_auto=True,
             title=f"Analisis de sentimientos para las noticias seleccionadas según el diario"
             )

newnames = {'pond_neutro':'NEUTRAL', 'pond_negativos': 'NEGATIVA','pond_positivo': 'POSITIVA'}
fig.for_each_trace(lambda t: t.update(name = newnames[t.name],
                                      legendgroup = newnames[t.name],
                                      hovertemplate = t.hovertemplate.replace(t.name, newnames[t.name])
                                     )
                  )
fig.update_layout(
    xaxis_title="Diarios",
    yaxis_title="Probabilidades (de 0 a 1)",
    
)                  
fig.update_layout(legend_title_text='Probabilidades')

st.plotly_chart(fig)


def transforma_letras_para_wordcloud(dataframe_noticias):
    columna_analizada = list(dataframe_noticias['titulo'])
    acentos = {'á': 'a', 'é': 'e', 'í': 'i', 'ó': 'o', 'ú': 'u',
               'Á': 'A', 'E': 'E', 'Í': 'I', 'Ó': 'O', 'Ú': 'U'}
    lista_palabras_para_wordcloud = []
    for palabras in columna_analizada:
        palabras_div = palabras.split(' ')
        for letras in palabras_div:
            for acen in acentos:
                if acen in letras:
                    letras = letras.replace(acen, acentos[acen])
            lista_palabras_para_wordcloud.append(letras.lower())
    return ' '.join(lista_palabras_para_wordcloud)


def genera_wordcloud(dataframe_noticias):
    palabras_para_wordcloud = transforma_letras_para_wordcloud(
        dataframe_noticias)
    palabras_ignoradas = set(['a', 'ante', 'con', 'contra', 'de', 'desde', 'durante', 'en', 'para', 'por', 'segun', 'sin', 'sobre', 'el', 'la', 'los', 'las',
                              '...', 'y', 'hoy', 'este', 'cuanto',  'un', 'del', 'las',  'que', 'con', 'todos',  'es', '¿qué',  'como', 'cada',
                              'jueves', '¿cuanto', 'hoy', 'al', 'cual', 'se', 'su', 'sus', 'lo', 'una', 'un', 'tiene',
                              'le', 'habia'])

    wordcloud = WordCloud(width=1920, height=1080, stopwords=palabras_ignoradas).generate(
        palabras_para_wordcloud)
    plt.imshow(wordcloud, interpolation='bilinear')
    plt.axis("off")
    st.pyplot()


if st.button('Generar Nube'):
    genera_wordcloud(st.session_state['dataframe_filtrado'])
else:
    pass