import plotly.graph_objects as go
import plotly.express as px
import pandas as pd

from collections import Counter, OrderedDict

def plot_active_users(df):
    dic = df.to_dict()
    k = list(dic.keys())
    v = list(dic.values())

    out_df = pd.DataFrame({'Пользователь': k, 'Число сообщений': v}).head(7)
    fig = px.bar(out_df, x='Пользователь', y='Число сообщений')

    return fig

def plot_active_hours(df):
    hours_dict = {
                '00':0,
                '01':0,
                '02':0,
                '03':0,
                '04':0,
                '05':0,
                '06':0,
                '07':0,
                '08':0,
                '09':0,
                '10':0,
                '11':0,
                '12':0,
                '13':0,
                '14':0,
                '15':0,
                '16':0,
                '17':0,
                '18':0,
                '19':0,
                '20':0,
                '21':0,
                '22':0,
                '23':0
    }

    hours = Counter(df.to_dict())
    hours.update(hours_dict)

    k = list(hours.keys())
    v = list(hours.values())       

    out_df = pd.DataFrame({'Время': k, 'Число сообщений': v}).sort_values(by=['Время'])

    fig = px.area(out_df, x='Время', y='Число сообщений')
    fig.update_xaxes(showgrid=False)
    fig.update_yaxes(showgrid=False)

    return fig

def plot_active_month_year(df):
    monthes = {
        '01':'Январь',
		'02':'Февраль',
		'03':'Март',
		'04':'Апрель',
		'05':'Май',
		'06':'Июнь',
		'07':'Июль',
		'08':'Август',
		'09':'Сентябрь',
		'10':'Октябрь',
		'11':'Ноябрь',
		'12':'Декабрь'
    }

    dates = df['date'].values    
    new_dates = []

    for date in dates:
        splitted = date.split('.')

        month = monthes[splitted[1]]
        year = splitted[2]

        new_dates.append(f'{month}/{year}')

    dates_counter = Counter(new_dates)

    k = list(dates_counter.keys())
    v = list(dates_counter.values())       

    out_df = pd.DataFrame({'Дата': k, 'Число сообщений': v})

    fig = px.area(out_df, x='Дата', y='Число сообщений')
    fig.update_xaxes(showgrid=False)
    fig.update_yaxes(showgrid=False)

    return fig

def plot_week_days(week_days_dict):
    k = list(week_days_dict.keys())
    v = list(week_days_dict.values())

    df = pd.DataFrame({'Дни недели': k,'Кол-во сообщений': v})

    fig = px.line_polar(df, r='Кол-во сообщений', theta='Дни недели', line_close=True)    

    return fig

def plot_pie_users(df):
    fig = px.pie(df, values='Число сообщений', names='Пользователь')

    return fig

def plot_freq_words(words, words_freqs):
    out_df = pd.DataFrame({'Слово': words, 'Частота': words_freqs}).sort_values(by=['Частота'], ascending=False).head(15)
    fig = px.histogram(out_df, x='Слово', y='Частота')

    return fig

def plot_pie_words(words):
    total_words = sum(list(words.values()))
    new_words = {}

    for k, v in words.items():
        new_words[k] = (words[k] / total_words) * 100
    
    df = pd.DataFrame({'Слово': new_words.keys(), 'Частота': new_words.values()}).sort_values(by=['Частота'], ascending=False).head(10)

    fig = px.pie(df, values='Частота', names='Слово')

    return fig

import plotly.graph_objects as go
import plotly.express as px
import pandas as pd

from collections import Counter, OrderedDict

def plot_active_users(df):
    dic = df.to_dict()
    k = list(dic.keys())
    v = list(dic.values())

    out_df = pd.DataFrame({'Пользователь': k, 'Число сообщений': v}).head(7)
    fig = px.bar(out_df, x='Пользователь', y='Число сообщений')

    return fig

def plot_active_hours(df):
    hours_dict = {
                '00':0,
                '01':0,
                '02':0,
                '03':0,
                '04':0,
                '05':0,
                '06':0,
                '07':0,
                '08':0,
                '09':0,
                '10':0,
                '11':0,
                '12':0,
                '13':0,
                '14':0,
                '15':0,
                '16':0,
                '17':0,
                '18':0,
                '19':0,
                '20':0,
                '21':0,
                '22':0,
                '23':0
    }

    hours = Counter(df.to_dict())
    hours.update(hours_dict)

    k = list(hours.keys())
    v = list(hours.values())       

    out_df = pd.DataFrame({'Время': k, 'Число сообщений': v}).sort_values(by=['Время'])

    fig = px.area(out_df, x='Время', y='Число сообщений')
    fig.update_xaxes(showgrid=False)
    fig.update_yaxes(showgrid=False)

    return fig

def plot_active_month_year(df):
    monthes = {
        '01':'Январь',
		'02':'Февраль',
		'03':'Март',
		'04':'Апрель',
		'05':'Май',
		'06':'Июнь',
		'07':'Июль',
		'08':'Август',
		'09':'Сентябрь',
		'10':'Октябрь',
		'11':'Ноябрь',
		'12':'Декабрь'
    }

    dates = df['date'].values    
    new_dates = []

    for date in dates:
        splitted = date.split('.')

        month = monthes[splitted[1]]
        year = splitted[2]

        new_dates.append(f'{month}/{year}')

    dates_counter = Counter(new_dates)

    k = list(dates_counter.keys())
    v = list(dates_counter.values())       

    out_df = pd.DataFrame({'Дата': k, 'Число сообщений': v})

    fig = px.area(out_df, x='Дата', y='Число сообщений')
    fig.update_xaxes(showgrid=False)
    fig.update_yaxes(showgrid=False)

    return fig

def plot_week_days(week_days_dict):
    k = list(week_days_dict.keys())
    v = list(week_days_dict.values())

    df = pd.DataFrame({'Дни недели': k,'Кол-во сообщений': v})

    fig = px.line_polar(df, r='Кол-во сообщений', theta='Дни недели', line_close=True)    

    return fig

def plot_pie_users(df):
    fig = px.pie(df, values='Число сообщений', names='Пользователь')

    return fig

def plot_freq_words(words, words_freqs):
    out_df = pd.DataFrame({'Слово': words, 'Частота': words_freqs}).sort_values(by=['Частота'], ascending=False).head(15)
    fig = px.histogram(out_df, x='Слово', y='Частота')

    return fig

def plot_pie_words(words):
    total_words = sum(list(words.values()))
    new_words = {}

    for k, v in words.items():
        new_words[k] = (words[k] / total_words) * 100
    
    df = pd.DataFrame({'Слово': new_words.keys(), 'Частота': new_words.values()}).sort_values(by=['Частота'], ascending=False).head(10)

    fig = px.pie(df, values='Частота', names='Слово')

    return fig
