import streamlit as st
import pandas as pd
from app_config import AppConfig  # Import the configurations class
from data_processor import DataProcessor  # Import the data analysis class
from visualization import Visualization  # Import the data viz class
from ai_analysis import AIAnalysis  # Import the ai analysis class
from sidebar import Sidebar  # Import the Sidebar class
from report import ReportGenerator

def main():
    # Initialize the app configuration
    app_config = AppConfig()

    # Initialize the session state 
    if 'ai_recommendations' not in st.session_state:
        st.session_state.ai_recommendations = None

    # Initialize the sidebar
    sidebar = Sidebar()
    sidebar.display()

    # Initialize the data processor
    data_processor = DataProcessor()

    # Initialize the visualization handler
    visualization = Visualization()

    # Initialize the AI analysis handler
    ai_analysis = AIAnalysis(data_processor.client)

    st.title("Literacy Implementation Record Data Analysis")

    # Add the descriptive text
    st.markdown("""
    This tool summarizes implementation record data for student attendance, engagement, and intervention dosage to address hypothesis #1: Have Students Received Adequate Instruction?
    """)

    # Date selection option
    date_option = st.radio(
        "Select data range:",
        ("All Data", "Date Range")
    )

    # Initialize start and end date variables
    start_date = None
    end_date = None

    if date_option == "Date Range":
        # Prompt user to enter start and end dates
        start_date = st.date_input("Start Date")
        end_date = st.date_input("End Date")

        # Ensure start date is before end date
        if start_date > end_date:
            st.error("Start date must be before end date.")
            return

    # File uploader
    uploaded_file = st.file_uploader("Upload your Excel file", type=["xlsx"])

    if uploaded_file is not None:
        try:
            # Read the Excel file into a DataFrame
            df = data_processor.read_excel(uploaded_file)

            # Format the session data
            df = data_processor.format_session_data(df)

            # Replace student names with initials
            df = data_processor.replace_student_names_with_initials(df)

            # Filter data if date range is selected
            if date_option == "Date Range":
                # Convert start_date and end_date to datetime
                start_date = pd.to_datetime(start_date).date()
                end_date = pd.to_datetime(end_date).date()

                # Identify the date column
                date_column = next((col for col in df.columns if col in ["Date of Session", "Date"]), None)
                if date_column:
                    # Filter the DataFrame based on the selected date range
                    df = df[(df[date_column] >= start_date) & (df[date_column] <= end_date)]
                else:
                    st.error("Date column not found in the data.")
                    return

            st.subheader("Uploaded Data")
            st.write(df)

            # Ensure the intervention column is determined
            intervention_column = data_processor.get_intervention_column(df)
            if intervention_column not in df.columns:
                st.error(f"Expected column '{intervention_column}' not found.")
                return

            # Compute Student Metrics
            student_metrics_df = data_processor.compute_student_metrics(df)
            st.subheader("Student Attendance and Engagement")
            st.write(student_metrics_df)

            # Compute Student Metric Averages
            attendance_avg_stats, engagement_avg_stats = data_processor.compute_average_metrics(student_metrics_df)

            # Plot and download student metrics
            student_metrics_fig = visualization.plot_student_metrics(student_metrics_df, attendance_avg_stats, engagement_avg_stats)
            visualization.download_chart(student_metrics_fig, "student_metrics_chart.png")

            # Compute Intervention Session Statistics
            intervention_stats = data_processor.compute_intervention_statistics(df)
            st.subheader("Intervention Dosage")
            st.write(intervention_stats)

            # Plot and download intervention statistics: Two-column layout for the visualization and intervention frequency
            col1, col2 = st.columns([3, 1])  # Set the column width ratio

            with col1:
                intervention_fig = visualization.plot_intervention_statistics(intervention_stats)

            with col2:
                intervention_frequency = intervention_stats['Intervention Dosage (%)'].values[0]
                # Display the "Intervention Dosage (%)" text
                st.markdown("<h3 style='color: #358E66;'>Intervention Dosage</h3>", unsafe_allow_html=True)
                # Display the frequency value below it
                st.markdown(f"<h1 style='color: #358E66;'>{intervention_frequency}%</h1>", unsafe_allow_html=True)

            visualization.download_chart(intervention_fig, "intervention_statistics_chart.png")

            # Evaluate each student and build decision tree diagrams
            student_metrics_df['Evaluation'] = student_metrics_df.apply(
                lambda row: data_processor.evaluate_student(row), axis=1
            )
            st.subheader("Student Evaluations")
            st.write(student_metrics_df[['Student', 'Evaluation']])

            # Build and display decision tree diagrams for each student
            for index, row in student_metrics_df.iterrows():
                tree_diagram = visualization.build_tree_diagram(row)

                # Get the student's name from the DataFrame
                student_name = row['Student']

                # Use st.expander to wrap the graphviz chart with the student's name
                with st.expander(f"{student_name} Decision Tree", expanded=False):
                    st.graphviz_chart(tree_diagram.source)

            # Generate Notes and Recommendations using LLM
            if st.session_state.ai_recommendations is None:
                with st.spinner("Generating MTSS.ai Analysis..."):
                    llm_input = ai_analysis.prepare_llm_input(student_metrics_df)
                    # recommendations = ai_analysis.prompt_response_from_hf_llm(llm_input)
                    recommendations = ai_analysis.prompt_response_from_mistral_llm(llm_input)
                    st.session_state.ai_recommendations = recommendations
            
            # Display the recommendations
            st.subheader("MTSS.ai Analysis")
            # st.markdown(recommendations)
            st.markdown(st.session_state.ai_recommendations)

            # Download AI output
            # ai_analysis.download_llm_output(recommendations, "MTSSai_Report.txt")
            ai_analysis.download_llm_output(st.session_state.ai_recommendations, "MTSSai_Report.txt")

            # Generate the PDF Report using the stored recommendations
            report_gen = ReportGenerator()
            combined_pdf = report_gen.create_combined_pdf(
                intervention_fig, 
                student_metrics_fig, 
                st.session_state.ai_recommendations
            )
                
            # Add the download button for the PDF
            st.download_button(
                label="Download MTSS.ai Report (PDF)",
                data=combined_pdf,
                file_name="MTSSai_LIR_Report.pdf",
                mime="application/pdf",
                icon="📄", 
                use_container_width=True
            )

        except Exception as e:
            st.error(f"Error processing the file: {str(e)}")

if __name__ == '__main__':
    main()