#!/usr/bin/env python3

import sys
import json
from joblib import load
import numpy as np
import pandas as pd
from sklearn.metrics.pairwise import cosine_similarity

def load_trained_data(client_id):
    """
    Load the trained TF-IDF vectorizer and course information for the specified client.
    """
    model_path = f'models/{client_id}/'
    vectorizer = load(f'{model_path}tfidf_vectorizer.joblib')
    courses_df = pd.read_csv(f'{model_path}courses_info.csv')
    return vectorizer, courses_df

def generate_user_profile(user_data, vectorizer):
    """
    Generate a user profile vector based on the user's completed courses and skills.
    """
    # Combine user's skills into a single string
    user_skills = " ".join(user_data.get('skills', []))
    user_profile_vector = vectorizer.transform([user_skills])
    return user_profile_vector

def recommend_courses(user_profile_vector, courses_df, vectorizer):
    """
    Recommend courses to the user based on their profile vector and the courses data.
    """
    # Calculate cosine similarity between the user profile and all courses
    course_vectors = vectorizer.transform(courses_df['all_text'])
    cosine_similarities = cosine_similarity(user_profile_vector, course_vectors).flatten()
    
    # Get indices of courses with the highest similarity scores
    top_indices = np.argsort(-cosine_similarities)[:5]  # Recommend top 5 courses
    
    # Fetch recommended course IDs
    recommended_course_ids = courses_df.iloc[top_indices]['courseId'].tolist()
    
    return recommended_course_ids

def main(user_data_json, client_id):
    user_data = json.loads(user_data_json)
    
    # Load the trained model and courses data for the client
    vectorizer, courses_df = load_trained_data(client_id)
    
    # Generate a user profile vector
    user_profile_vector = generate_user_profile(user_data, vectorizer)
    
    # Generate course recommendations
    recommendations = recommend_courses(user_profile_vector, courses_df, vectorizer)
    
    print(json.dumps({"recommended_course_ids": recommendations}))

if __name__ == "__main__":
    if len(sys.argv) != 3:
        print("Usage: python get_recommendation_using_curl_using_local_data.py <user_data_json> <client_id>")
        sys.exit(1)
    
    user_data_json = sys.argv[1]
    client_id = sys.argv[2]
    main(user_data_json, client_id)
