import os
from io import BytesIO
import streamlit as st
import fitz # PyMuPDF
import requests
from dotenv import load_dotenv
from config import supabase, HF_API_TOKEN, HF_HEADERS, HF_MODELS
from utils import (
evaluate_resumes,
generate_pdf_report,
store_in_supabase,
extract_email,
score_candidate,
parse_resume,
summarize_resume,
extract_keywords,
generate_interview_questions_from_summaries,
)
# ------------------------- Main App Function -------------------------
def main():
st.set_page_config(page_title="TalentLens.AI", layout="centered")
st.markdown("
TalentLens.AI
", unsafe_allow_html=True)
st.divider()
st.markdown("AI-Powered Intelligent Resume Screening
", unsafe_allow_html=True)
# Upload resumes (limit: 10 files)
uploaded_files = st.file_uploader(
"Upload Resumes (PDF Only, Max: 10)",
accept_multiple_files=True,
type=["pdf"]
)
if uploaded_files and len(uploaded_files) > 10:
st.error("⚠️ You can upload a maximum of 10 resumes at a time.")
return
# Input job description
job_description = st.text_area("Enter Job Description")
# Evaluation trigger
if st.button("Evaluate Resumes"):
if not job_description:
st.error("⚠️ Please enter a job description.")
return
if not uploaded_files:
st.error("⚠️ Please upload at least one resume.")
return
st.write("### 📊 Evaluating Resumes...")
# Resume Evaluation
shortlisted, removed_candidates = evaluate_resumes(uploaded_files, job_description)
if not shortlisted:
st.warning("⚠️ No resumes matched the required keywords.")
else:
st.subheader("✅ Shortlisted Candidates:")
for candidate in shortlisted:
st.write(f"**{candidate['name']}**")
# Generate Interview Questions
questions = generate_interview_questions_from_summaries(shortlisted)
st.subheader("🧠 Suggested Interview Questions:")
for idx, q in enumerate(questions, 1):
st.markdown(f"{q}")
# Downloadable PDF Report
pdf_report = generate_pdf_report(shortlisted, questions)
st.download_button("Download Shortlist Report", pdf_report, "shortlist.pdf")
# Removed Candidates Info
if removed_candidates:
st.subheader("❌ Resumes Removed:")
for removed in removed_candidates:
st.write(f"**{removed['name']}** - {removed['reason']}")
# ------------------------- Run the App -------------------------
if __name__ == "__main__":
main()