import tkinter as tk
from tkinter import filedialog, ttk
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

class Homepage(tk.Frame):
    def __init__(self, parent, controller):
        super().__init__(parent)
        self.controller = controller

        self.sidebar = tk.Frame(self, bg='#2c3e50', width=220, height=800)
        self.sidebar.pack(side=tk.LEFT, fill=tk.Y)

        self.home_btn = tk.Button(self.sidebar, text="Homepage", command=lambda: controller.show_frame("Homepage"), bg='#3498db', font=("Arial", 12))
        self.home_btn.pack(pady=10, padx=10, fill=tk.X)

        self.upload_btn = tk.Button(self.sidebar, text="Upload CSV", command=lambda: controller.show_frame("UploadPage"), bg='#27ae60', font=("Arial", 12))
        self.upload_btn.pack(pady=10, padx=10, fill=tk.X)

        self.main_frame = tk.Frame(self, bg='white', width=980, height=800)
        self.main_frame.pack(fill="both", expand=True)

        self.data = None
        self.show_homepage()

    def show_homepage(self):
        for widget in self.main_frame.winfo_children():
            widget.destroy()

        tk.Label(self.main_frame, text="Patient Referral Dashboard", font=("Arial", 20), bg='white').pack(pady=10)

        try:
            self.data = pd.read_csv("data.csv")  
            self.generate_charts()
        except (FileNotFoundError, pd.errors.EmptyDataError):
            tk.Label(self.main_frame, text="No data available. Please upload data in the Upload Data page.",
                    font=("Arial", 14), bg='white').pack(pady=20)


    def generate_charts(self):
        """Generate and display charts only if data is available."""
        if self.data is None or self.data.empty:
            return

        total_patients = len(self.data)
        referral_patients = self.data['referral'].sum()
        non_referral_patients = total_patients - referral_patients

        fig, axes = plt.subplots(1, 2, figsize=(14, 6))

        labels = ['Need Referral', 'Do Not Need Referral']
        sizes = [referral_patients, non_referral_patients]
        axes[0].pie(sizes, labels=labels, autopct='%1.1f%%', startangle=100, colors=['#66c2a5', '#fc8d62'])
        axes[0].set_title("Patient Referral Distribution", fontsize=16)

        average_data = self.data.drop(columns=['encounterId', 'referral']).mean()
        axes[1].bar(average_data.index, average_data.values, color='#1f77b4', width=0.4)
        axes[1].set_xticklabels(average_data.index, rotation=45, ha='right', fontsize=10)
        axes[1].set_title("Average Patient Data", fontsize=14)

        plt.tight_layout()

        canvas = FigureCanvasTkAgg(fig, master=self.main_frame)
        canvas.draw()
        canvas.get_tk_widget().pack(pady=10)

    def show_data(self):
        """Display the uploaded CSV data in a table format."""
        for widget in self.main_frame.winfo_children():
            widget.destroy()

        if self.data is not None:
            tree = ttk.Treeview(self.main_frame)
            tree['columns'] = tuple(self.data.columns)

            for col in self.data.columns:
                tree.heading(col, text=col)
                tree.column(col, width=100)

            for index, row in self.data.iterrows():
                tree.insert("", "end", values=tuple(row))

            tree.pack(fill=tk.BOTH, expand=True)
        else:
            tk.Label(self.main_frame, text="No Data Available", font=("Arial", 14), bg='white').pack(pady=20)

    def on_closing(self):
        """Delete data.csv when the dashboard is closed."""
        if os.path.exists("data.csv"):
            os.remove("data.csv")
        self.root.destroy()