import streamlit as st
import time
from backend import moodle_io
from backend.db import DB, Session
from backend.helpers import update_columns
from backend.his_io import prepare_table, read_excel


def session_ui(db: DB, session: Session | None) -> Session | None:

    with st.sidebar:
        st.title(":blue[Noteneingabetool]")

        st.header("Session :blue[wiederherstellen]", divider='gray')

        # DEBUG (select session)
        selected_session = st.selectbox(":red[DEBUG] Session auswählen", db.list_tokens(), index=None, key='session_select',
                                        format_func=lambda token: f'{token} - {db.get_session(token).table_name}' )
        
        if selected_session:
            token = selected_session
        else:
            token = st.text_input("Session Token", value=session.token if session else '', key='token_input')

        if token:
            if not session or token != session.token:
                try:
                    session = db.get_session(token)
                    st.success("Session gefunden")
                except ValueError:
                    st.error("Session nicht gefunden")
                    session = None
        else:
            session = None


        st.header(":blue Session :blue[verwalten]", divider='gray')
        if st.button("Neue Session"):
            new_session_dialog(db)
        if st.button("Lösche Session", disabled=session is None):
            delete_session_dialog(db, session)
        if st.button("Moodle Ergebnisse importieren", disabled=session is None):
            upload_moodle_results(db, session)

    return session


@st.dialog("Neue Session anlegen")
def new_session_dialog(db: DB):
    upload_file = st.file_uploader("HISinOne Excel Datei hochladen", type=['xlsx'], key='file_uploader')

    if upload_file:
        session = create_new_session(db, upload_file)
        db.save_session(session)
        st.write(":green[Session erstellt.]")
        st.write('Nicht vergessen, den :blue[Token] zu notieren:')
        st.code(session.token)


@st.dialog("Session löschen")
def delete_session_dialog(db: DB, session: Session):
    st.warning("Sind Sie sicher, dass Sie die Session löschen möchten?")
    if st.button(":exclamation: Session löschen :exclamation:"):
        db.delete_session(session)
        del st.session_state.session
        st.success("Session gelöscht")
        st.rerun()

@st.dialog("Moodle Ergebnisse hochladen")
def upload_moodle_results(db: DB, session: Session):
    moodle_file = st.file_uploader("Moodle Ergebnis CSV hochladen", type=['csv'], key='moodle_file_uploader')

    if moodle_file:
        moodle_points_df = moodle_io.read_csv(moodle_file)
        max_points, exercise_columns = moodle_io.parse_header(moodle_points_df)
        st.write(f'Moodle CSV enhält :blue[{len(moodle_points_df.index)}] Einträge')
        st.write(f'Aufgaben: ```{", ".join(exercise_columns)}```')
        st.write(f'Punktzahl: :blue[{max_points}]')
        st.warning("Sind Sie sicher, dass Sie die Ergebnisse importieren möchten? Aktuelle Ergebnisse werden gelöscht!")
        if st.button("Importieren :question:"):
            session.points_df = update_columns(exercise_columns, session.points_df)
            session.points_df, update_count = moodle_io.merge_points(session.points_df, moodle_points_df)
            st.session_state.max_points = max_points
            st.success(f"{update_count} Ergebnisse importiert")
            db.save_session(session)
            time.sleep(1)
            st.rerun()


def create_new_session(db, upload_file) -> Session:
    new_session = db.create_session()
    students_df, his_header = read_excel(upload_file)
    points_df = prepare_table(students_df)
    
    new_session.students_df = students_df
    new_session.his_header = his_header
    new_session.points_df = points_df
    new_session.table_name = upload_file.name
    return new_session