import pandas as pd
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
import plotly.graph_objects as go

# Read the CSV file into a Pandas DataFrame
file_path = "texts_by_period_and_location_saparated_by_periods_in_columns.csv"
df = pd.read_csv(file_path)

# Initialize the Dash app
app = dash.Dash(__name__)

# Define the columns to summarize
columns_to_summarize = ["ancient", "old", "middle", "new", "late"]

# Create the figure
fig = go.Figure()

# Add an initial trace for demonstration
fig.add_trace(go.Bar(x=["Place 1", "Place 2", "Place 3"],
                     y=[5, 7, 4], name="ancient"))

# Define the app layout
app.layout = html.Div([
    html.H1("Interactive Bar Graph with Filtering"),
    dcc.Checklist(
        id="place-selector",
        options=[{"label": place, "value": place} for place in df["place"].unique()],
        value=df["place"].unique().tolist(),
        labelStyle={'display': 'block'}
    ),
    dcc.Checklist(
        id="column-selector",
        options=[{"label": col, "value": col} for col in columns_to_summarize],
        value=columns_to_summarize,
        labelStyle={'display': 'block'}
    ),
    dcc.Graph(id="bar-graph", figure=fig)
])

# Define callback functions to update the graph
@app.callback(
    Output("bar-graph", "figure"),
    [Input("place-selector", "value"), Input("column-selector", "value")]
)
def update_graph(selected_places, selected_columns):
    filtered_df = df[(df["place"].isin(selected_places)) & (df[selected_columns].sum(axis=1) > 0)]
    grouped = filtered_df.groupby("place")[selected_columns].sum().reset_index()
    fig = go.Figure()
    for col in selected_columns:
        fig.add_trace(go.Bar(x=grouped["place"], y=grouped[col], name=col, text=grouped[col], textposition='auto'))
    fig.update_layout(
        title="Summary of Categories by Place with Selection",
        xaxis_title="Place",
        yaxis_title="Total Count",
        xaxis=dict(categoryorder='total descending'),
        barmode='stack'
    )
    return fig

if __name__ == "__main__":
    app.run_server(debug=True)
