import pickle
import streamlit as st
import numpy as np

# Load artifacts
model = pickle.load(open('artifacts/model.pkl', 'rb'))
book_names = pickle.load(open('artifacts/book_names.pkl', 'rb'))
final_rating = pickle.load(open('artifacts/final_rating.pkl', 'rb'))
book_pivot = pickle.load(open('artifacts/book_pivot.pkl', 'rb'))

# Function to fetch poster URLs
def fetch_poster(suggestion):
    book_name = []
    ids_index = []
    poster_url = []

    for book_id in suggestion:
        book_name.append(book_pivot.index[book_id])

    for name in book_name[0]:
        ids = np.where(final_rating['title'] == name)[0][0]
        ids_index.append(ids)

    for idx in ids_index:
        url = final_rating.iloc[idx]['image_url']
        poster_url.append(url)

    return poster_url

# Function to recommend books
def recommend_book(book_name):
    books_list = []
    book_id = np.where(book_pivot.index == book_name)[0][0]
    distance, suggestion = model.kneighbors(book_pivot.iloc[book_id, :].values.reshape(1, -1), n_neighbors=4)

    poster_url = fetch_poster(suggestion)
    
    for i in range(len(suggestion[0])):
        book = book_pivot.index[suggestion[0][i]]
        books_list.append(book)
    
    return books_list[1:], poster_url[1:]  # Skip the input book itself

# Apply custom CSS for glassmorphism
def local_css(file_name):
    with open(file_name) as f:
        st.markdown(f'<style>{f.read()}</style>', unsafe_allow_html=True)

# Page configuration
st.set_page_config(page_title='Book Recommendation System', layout='centered')

# Load CSS for styling
local_css("style.css")

# Add a fancy header with emojis
st.markdown("""
    <div class="glass">
        <h1>📚Book Finder📚</h1>
        <p>Let AI find your perfect book match.</p>
    </div>
""", unsafe_allow_html=True)

# Centered dropdown for book selection with glass effect
st.markdown("""
    <div class="glass">
        <p>🔎 Type or select a book from the dropdown</p>
    </div>
""", unsafe_allow_html=True)

# Dropdown for book selection
selected_books = st.selectbox("", book_names)

# Apply custom button styling to Streamlit's default button using CSS
st.markdown("""
    <style>
        .stButton > button {
            background: linear-gradient(135deg, #8B5E3C, #B8860B); /* Warm vintage gold-brown gradient */
            border: none;
            color: white; /* White text */
            padding: 12px 24px;
            text-align: center;
            text-decoration: none;
            display: inline-block;
            font-size: 16px;
            margin: 10px 5px;
            cursor: pointer;
            border-radius: 12px; /* Rounded corners for a soft vintage touch */
            box-shadow: 0 6px 12px rgba(0, 0, 0, 0.25); /* Soft, deep shadow for antique feel */
            font-family: 'Georgia', serif; /* Classic serif font for the button */
            text-transform: uppercase; /* Uppercase text for a formal touch */
        }

        .stButton > button:hover {
            background: linear-gradient(135deg, #704214, #B8860B); /* Slightly darker gold-brown */
            box-shadow: 0 8px 16px rgba(0, 0, 0, 0.3); /* Stronger shadow for depth on hover */
            transform: translateY(-2px); /* Lift effect */
        }
    </style>
""", unsafe_allow_html=True)

# Streamlit button with custom styling applied
if st.button('Show Recommendation', key='show_recommendation_button'):
    recommended_books, poster_url = recommend_book(selected_books)

    # Display recommendations in a grid
    st.markdown("<h3>Recommended Books:</h3>", unsafe_allow_html=True)
    col1, col2, col3 = st.columns(3)
    with col1:
        st.markdown(f"<div class='glass'><p>{recommended_books[0]}</p></div>", unsafe_allow_html=True)
        st.image(poster_url[0])
    with col2:
        st.markdown(f"<div class='glass'><p>{recommended_books[1]}</p></div>", unsafe_allow_html=True)
        st.image(poster_url[1])
    with col3:
        st.markdown(f"<div class='glass'><p>{recommended_books[2]}</p></div>", unsafe_allow_html=True)
        st.image(poster_url[2])