File size: 3,467 Bytes
0bff4c5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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.")