#!/usr/bin/python3.10

import sys
import json
import logging
import pandas as pd
import random

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import linear_kernel

# Function to recommend courses for a given user based on course data and user skills
def recommend_courses(user_data, courses_df, cosine_sim, competency_data):
    logging.debug("Generating course recommendations...")
    assigned_courses = user_data.get('assignedCourses', [])
    completed_courses = user_data.get('completedCourses', [])
    user_skills = user_data.get('skills', [])

    if not assigned_courses and not completed_courses and not user_skills:
        logging.warning("No assigned or completed courses and skills found. Recommending random courses.")
        recommended_course_ids = random.sample(list(courses_df['courseId']), 10)
    else:
        child_skills = set()
        for skill in user_skills:
            for competency in competency_data:
                if competency['parent_skill_id'] == skill:
                    child_skills.update(competency['child_skills'])

        recommended_course_ids = []
        for course_index, course_row in courses_df.iterrows():
            course_skills = set(course_row['skills'])
            if (all(skill in user_skills or skill in child_skills for skill in course_skills) and
               (not course_index in assigned_courses or course_index in completed_courses)):
                recommended_course_ids.append(course_row['courseId'])
            if len(recommended_course_ids) >= 10:
                break

    logging.debug(f"Recommended course IDs : {recommended_course_ids}")
    return recommended_course_ids

# Main function to process recommendations
def process_recommendations(courses_data, user_data, competency_data):
    logging.info("Processing recommendations...")

    if courses_data:
        courses_df = pd.DataFrame(courses_data)
        courses_df['combined'] = courses_df['name'] + ' ' + courses_df['short_description'] + ' ' + courses_df['description']

        # Perform TF-IDF vectorization
        tfidf = TfidfVectorizer(stop_words='english')
        tfidf_matrix = tfidf.fit_transform(courses_df['combined'])
        cosine_sim = linear_kernel(tfidf_matrix, tfidf_matrix)

        recommendations = recommend_courses(user_data, courses_df, cosine_sim, competency_data)

        return recommendations
    else:
        logging.warning("No course data found")
        return []

if __name__ == "__main__":
    try:
        courses_data = json.loads(sys.argv[1])
        user_data = json.loads(sys.argv[2])
        competency_data = json.loads(sys.argv[3])

        # Process the data
        # Assuming you have a function named process_recommendations that does the processing
        recommendations = process_recommendations(courses_data, user_data, competency_data)

        print(recommendations)
        
        # Output the recommendations
        print(json.dumps(recommendations))

    except Exception as e:
        logging.error(f"An exception occurred: {str(e)}", exc_info=True)