import streamlit as st from datetime import datetime from config.settings import settings from models import ChatMessage, ChatSession, User from models.db import get_session_context from services.pdf_report import generate_pdf_report from services.logger import app_logger from services.metrics import log_report_generated st.set_page_config(page_title=f"Reports - {settings.APP_TITLE}", layout="wide") if not st.session_state.get("authenticated_user"): st.warning("Please log in to access reports.") st.switch_page("app.py") current_user: User = st.session_state.authenticated_user st.title("Consultation Reports") st.markdown("View and download your past consultation sessions.") # --- Load User's Chat Sessions --- @st.cache_data(ttl=300) # Cache for 5 minutes def get_user_sessions(user_id: int): with get_session_context() as db: sessions = db.query(ChatSession).filter(ChatSession.user_id == user_id).order_by(ChatSession.start_time.desc()).all() return sessions chat_sessions = get_user_sessions(current_user.id) if not chat_sessions: st.info("You have no past consultation sessions.") st.stop() # --- Display Sessions and Download Option --- selected_session_id_str = st.selectbox( "Select a Consultation Session:", options=[(f"Session ID: {s.id} - Started: {s.start_time.strftime('%Y-%m-%d %H:%M')} - Title: {s.title or 'Untitled'}", str(s.id)) for s in chat_sessions], format_func=lambda x: x[0] # Display the descriptive string ) if selected_session_id_str: selected_session_id = int(selected_session_id_str[1]) # Extract ID from tuple # Find the selected session object selected_session = next((s for s in chat_sessions if s.id == selected_session_id), None) if selected_session: st.subheader(f"Details for Session ID: {selected_session.id}") st.write(f"Started: {selected_session.start_time.strftime('%Y-%m-%d %H:%M:%S UTC')}") st.write(f"Title: {selected_session.title or 'Untitled'}") with get_session_context() as db: messages = db.query(ChatMessage).filter(ChatMessage.session_id == selected_session.id).order_by(ChatMessage.timestamp).all() if messages: with st.expander("View Chat Transcript", expanded=False): for msg in messages: icon = "🧑‍⚕️" if msg.role == "assistant" else "👤" if msg.role == "tool": icon = "🛠️" st.markdown(f"**{icon} {msg.role.capitalize()} ({msg.timestamp.strftime('%H:%M:%S')}):**") st.markdown(f"> {msg.content}\n---") # PDF Download Button try: pdf_bytes = generate_pdf_report(messages, patient_name=current_user.username) # Or a more specific patient name if available st.download_button( label="Download Report as PDF", data=pdf_bytes, file_name=f"consultation_report_{selected_session.id}_{datetime.now().strftime('%Y%m%d')}.pdf", mime="application/pdf", on_click=log_report_generated ) except Exception as e: app_logger.error(f"Error generating PDF for session {selected_session.id}: {e}") st.error(f"Could not generate PDF report: {e}") else: st.info("This session has no messages.")