import gradio as gr
import pandas as pd
import os
from datetime import datetime

# Attendance Tracker Setup
try:
    if not os.path.exists("attendance_records"):
        os.makedirs("attendance_records")
except error:
    print(error)
     
    

# Helper Functions
def log_attendance(name, day, date, status):
    month = datetime.strptime(date, "%Y-%m-%d").strftime("%Y-%m")
    file_path = f"attendance_records/{month}.csv"

    # Load or create attendance sheet for the month
    if os.path.exists(file_path):
        df = pd.read_csv(file_path)
    else:
        df = pd.DataFrame(columns=["Name", "Day", "Date", "Status"])

    # Add new attendance record
    new_entry = {"Name": name, "Day": day, "Date": date, "Status": status}
    df = pd.concat([df, pd.DataFrame([new_entry])], ignore_index=True)

    # Save back to the file
    df.to_csv(file_path, index=False)
    return "Attendance logged successfully!"

def calculate_fees():
    attendance_summaries = []

    for file in os.listdir("attendance_records"):
        if file.endswith(".csv"):
            file_path = os.path.join("attendance_records", file)
            df = pd.read_csv(file_path)

            # Calculate fees for each candidate
            fees_summary = df[df["Status"] == "Present"].groupby("Name").size() * (1000 / 12)  # Example: Monthly fees divided by 12
            fees_summary.name = "Fees"

            # Merge fees into the attendance sheet
            df = df.merge(fees_summary, on="Name", how="left")

            # Save updated file
            df.to_csv(file_path, index=False)

            # Summarize for all candidates
            attendance_summaries.append(df[["Name", "Fees"]].drop_duplicates())

    if attendance_summaries:
        summary_df = pd.concat(attendance_summaries).drop_duplicates()
        summary_df.to_csv("attendance_records/fees_summary.csv", index=False)
        return "Fees calculated and updated successfully!"

    return "No attendance records found for fees calculation."

# Gradio Interface
def submit_attendance(name, day, date, status):
    return log_attendance(name, day, date, status)

def generate_fees():
    return calculate_fees()

def is_month_end():
    today = datetime.now()
    return (today.day == (pd.Period(today.strftime("%Y-%m")).days_in_month))

# Function to extract data from Excel
def get_dropdown_options(file_path, column_name):
    # Read the Excel file
    df = pd.read_excel(file_path)
    # Extract the unique values from the specified column
    options = df["Name"].dropna().unique().tolist()
    return options

# Define the Gradio interface
def dropdown_demo():
    # File path and column to read
    file_path = "participants_form.xlsx"  # Replace with your Excel file path
    column_name = "your_column"  # Replace with your column name in the Excel file
    
    # Populate dropdown options
    options = get_dropdown_options(file_path, column_name)
    
    # Define a Gradio app
    with gr.Blocks() as demo:
        dropdown = gr.Dropdown(choices=options, label="Select an Option")
        output = gr.Textbox(label="You Selected")

        def show_selection(choice):
            return f"You selected: {choice}"

        dropdown.change(show_selection, inputs=[dropdown], outputs=[output])

with gr.Blocks() as app:
    gr.Markdown("# Attendance Tracker")

    with gr.Row():
        # name = gr.Textbox(label="Name")
        name = dropdown_demo()
        day = gr.Textbox(label="Day")
        date = gr.Textbox(label="Date (YYYY-MM-DD)")
        status = gr.Radio(["Present", "Absent"], label="Status")

    submit_button = gr.Button("Submit Attendance")
    submit_message = gr.Textbox(label="Message", interactive=False)

    calculate_button = gr.Button("Calculate Fees", interactive=is_month_end())
    calculate_message = gr.Textbox(label="Fees Calculation Message", interactive=False)

    submit_button.click(submit_attendance, inputs=[name, day, date, status], outputs=[submit_message])
    calculate_button.click(generate_fees, outputs=[calculate_message])

    def update_calculate_button():
        return gr.update(interactive=is_month_end())

    app.load(update_calculate_button, None, [calculate_button])

app.launch()