from utils.layout import render_layout
import streamlit as st
import time
from model.search_script import search_for_recipes # assumed you modularized this logic
import streamlit.components.v1 as components
def recipe_search_page():
st.markdown("""
## 🍽️ Advanced Recipe Recommendation
This module uses a custom-trained BERT model to semantically search recipes
based on your query, ingredients, and tags.
""", unsafe_allow_html=True)
if 'search_system' not in st.session_state:
with st.spinner("🔄 Initializing recipe search system..."):
st.session_state.search_system = search_for_recipes()
search_system = st.session_state.search_system
if not search_system.is_ready:
st.error("❌ System not ready. Please check data files and try again.")
return
query = st.text_input(
"Search for recipes:",
placeholder="e.g., 'chicken pasta', 'vegetarian salad', 'chocolate dessert'"
)
col1, col2 = st.columns(2)
with col1:
num_results = st.slider("Number of results", 1, 15, 5)
with col2:
min_rating = st.slider("Minimum rating", 1.0, 5.0, 3.0, 0.1)
if st.button("🔍 Search Recipes") and query:
with st.spinner(f"Searching for '{query}'..."):
start = time.time()
print(query, num_results, min_rating)
results = search_system.search_recipes(query, num_results, min_rating)
elapsed = time.time() - start
if results:
st.markdown(f"### 🎯 Top {len(results)} recipe recommendations for: *'{query}'*")
st.markdown("📊 Sorted by best match using semantic search and popularity", unsafe_allow_html=True)
st.markdown("
", unsafe_allow_html=True)
for i, recipe in enumerate(results, 1):
steps_html = "".join([f"{step.strip().capitalize()}" for step in recipe.get("steps", [])])
description = recipe.get("description", "").strip().capitalize()
html_code = f"""
🔝 {i}. {recipe['name']}
⏱️ {recipe['minutes']} min | 🔥 {recipe['n_steps']} steps | ⭐ {recipe['avg_rating']:.1f}/5.0
({recipe['num_ratings']} ratings)
🔍 Match Score: {recipe['similarity_score']:.1%}
(query match)
🏆 Overall Score: {recipe['combined_score']:.1%}
(match + popularity)
🏷️ Tags:
{" ".join([f"{tag}" for tag in recipe['tags']])}
🥘 Ingredients:
{', '.join(recipe['ingredients'][:8])}
{'...' if len(recipe['ingredients']) > 8 else ''}
{"
📖 Description:
" + description + "
" if description else ""}
{"
🧑🍳 Steps:" + steps_html + "
" if steps_html else ""}
"""
components.html(html_code, height=360 + len(recipe.get("steps", [])) * 20)
else:
st.warning(f"😔 No recipes found for '{query}' with a minimum rating of {min_rating}/5.0.")
render_layout(recipe_search_page)