File size: 5,751 Bytes
6145bc0
864b488
0b77233
 
 
 
 
 
864b488
0b77233
 
 
 
 
 
 
864b488
0b77233
 
 
 
 
 
64f8a92
0b77233
0a2437f
0b77233
 
 
 
 
 
 
0a2437f
 
0b77233
 
 
 
 
 
 
64f8a92
0b77233
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64f8a92
0b77233
 
 
 
 
 
 
 
64f8a92
0b77233
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0a2437f
0b77233
 
 
 
 
 
 
 
 
 
 
 
 
 
0a2437f
0b77233
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64f8a92
0b77233
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import streamlit as st
from config.settings import settings
from models import create_db_and_tables, get_session_context, User, ChatMessage, ChatSession
from models.user import UserCreate # For type hinting
from services.auth import create_user_in_db, authenticate_user
from services.logger import app_logger
# Agent will be initialized and used in specific pages like Consult.py
# from agent import get_agent_executor # Import in pages where needed

# --- Page Configuration ---
st.set_page_config(
    page_title=settings.APP_TITLE,
    page_icon="⚕️", # You can use an emoji or a path to an image
    layout="wide",
    initial_sidebar_state="expanded"
)

# --- Database Initialization ---
@st.cache_resource # Ensure this runs only once
def init_db():
    app_logger.info("Initializing database and tables...")
    create_db_and_tables()
    app_logger.info("Database initialized.")

init_db()

# --- Session State Initialization ---
if 'authenticated_user' not in st.session_state:
    st.session_state.authenticated_user = None # Stores User object upon successful login
if 'current_chat_session_id' not in st.session_state:
    st.session_state.current_chat_session_id = None
if 'chat_messages' not in st.session_state: # For the current active chat
    st.session_state.chat_messages = []


# --- Authentication Logic ---
def display_login_form():
    with st.form("login_form"):
        st.subheader("Login")
        username = st.text_input("Username")
        password = st.text_input("Password", type="password")
        submit_button = st.form_submit_button("Login")

        if submit_button:
            user = authenticate_user(username, password)
            if user:
                st.session_state.authenticated_user = user
                st.success(f"Welcome back, {user.username}!")
                # Create a new chat session for the user upon login
                with get_session_context() as db_session:
                    new_chat_session = ChatSession(user_id=user.id, title=f"Session for {user.username}")
                    db_session.add(new_chat_session)
                    db_session.commit()
                    db_session.refresh(new_chat_session)
                    st.session_state.current_chat_session_id = new_chat_session.id
                    st.session_state.chat_messages = [] # Clear previous messages
                st.rerun() # Rerun to reflect login state
            else:
                st.error("Invalid username or password.")

def display_signup_form():
    with st.form("signup_form"):
        st.subheader("Sign Up")
        new_username = st.text_input("Choose a Username")
        new_email = st.text_input("Email (Optional)")
        new_password = st.text_input("Choose a Password", type="password")
        confirm_password = st.text_input("Confirm Password", type="password")
        submit_button = st.form_submit_button("Sign Up")

        if submit_button:
            if not new_username or not new_password:
                st.error("Username and password are required.")
            elif new_password != confirm_password:
                st.error("Passwords do not match.")
            else:
                user_data = UserCreate(
                    username=new_username,
                    password=new_password,
                    email=new_email if new_email else None
                )
                user = create_user_in_db(user_data)
                if user:
                    st.success(f"Account created for {user.username}. Please log in.")
                    # Optionally log them in directly:
                    # st.session_state.authenticated_user = user
                    # st.rerun()
                else:
                    st.error("Username might already be taken or an error occurred.")

# --- Main App Logic ---
if not st.session_state.authenticated_user:
    st.title(f"Welcome to {settings.APP_TITLE}")
    st.markdown("Your AI-powered partner for advanced healthcare insights.")
    
    login_tab, signup_tab = st.tabs(["Login", "Sign Up"])
    with login_tab:
        display_login_form()
    with signup_tab:
        display_signup_form()
else:
    # If authenticated, Streamlit automatically navigates to pages in the `pages/` directory.
    # The content of `app.py` typically acts as the "Home" page if no `1_Home.py` exists,
    # or it can be used for global elements like a custom sidebar if not using Streamlit's default page navigation.

    # Custom Sidebar for logged-in users (Streamlit handles page navigation automatically)
    with st.sidebar:
        st.markdown(f"### Welcome, {st.session_state.authenticated_user.username}!")
        st.image("assets/logo.png", width=100) # Display logo if available
        st.markdown("---")
        
        if st.button("Logout"):
            st.session_state.authenticated_user = None
            st.session_state.current_chat_session_id = None
            st.session_state.chat_messages = []
            st.success("You have been logged out.")
            st.rerun()
    
    # This content will show if no other page is selected, or if you don't have a 1_Home.py
    # If you have 1_Home.py, Streamlit will show that by default after login.
    # So, this part might be redundant if 1_Home.py exists and is the intended landing.
    st.sidebar.success("Select a page above to get started.")
    st.markdown(f"# {settings.APP_TITLE}")
    st.markdown("Navigate using the sidebar to consult with the AI or view your reports.")
    st.markdown("---")
    st.info("This is the main application area. If you see this, ensure you have a `pages/1_Home.py` or that this `app.py` is your intended landing page after login.")

app_logger.info("Streamlit app initialized and running.")