import sys
import json
import subprocess
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import linear_kernel
import logging

# Configure logging
logging.basicConfig(filename='recommendation.log', level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')

# Function to fetch course data from the API
def get_course_data(api_url, api_key, username, password):
    try:
        process = subprocess.Popen([
            'curl',
            '-X', 'GET',
            api_url,
            '-H', f'x-api-key: {api_key}',
            '-u', f'{username}:{password}'
        ], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        output, error = process.communicate()
        data = json.loads(output.decode())
        if 'status' in data and data['status']:
            return data['data']
        else:
            logging.error(f"Error: {data['message']}")
            return []
    except Exception as e:
        logging.error(f"Error: {e}")
        return []

# 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', [])

    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):
            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(user_id, api_key):
    logging.info("Processing recommendations...")
    api_url = "https://api.edurigo1.com/api/v3/learner/Recommend/getCourseData/"
    username = "lmsdemo"
    password = "indian1361"
    courses_data = get_course_data(api_url, api_key, username, password)

    if courses_data:
        courses_df = pd.DataFrame(courses_data)
        courses_df['combined'] = courses_df['name'] + ' ' + courses_df['short_description'] + ' ' + courses_df['description']
        tfidf = TfidfVectorizer(stop_words='english')
        tfidf_matrix = tfidf.fit_transform(courses_df['combined'])
        cosine_sim = linear_kernel(tfidf_matrix, tfidf_matrix)

        process_user_data = subprocess.Popen([
            'curl',
            '-X', 'GET',
            "https://api.edurigo1.com/api/v3/learner/Recommend/getUserCourseData/",
            '-H', f'x-api-key: {api_key}',
            '-u', f'{username}:{password}'
        ], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        user_data_output, user_data_error = process_user_data.communicate()
        user_data = json.loads(user_data_output.decode())['data'].get(user_id, {})

        process_competency_data = subprocess.Popen([
            'curl',
            '-X', 'GET',
            "https://api.edurigo1.com/api/v3/learner/Recommend/getCompetencyDetail/",
            '-H', f'x-api-key: {api_key}',
            '-u', f'{username}:{password}'
        ], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        competency_data_output, competency_data_error = process_competency_data.communicate()
        competency_data = json.loads(competency_data_output.decode())['data']

        recommendations = recommend_courses(user_data, courses_df, cosine_sim, competency_data)
        return recommendations
    else:
        logging.warning("No course data found")
        return []

if __name__ == "__main__":
    if len(sys.argv) > 2:
        user_id = sys.argv[1]
        api_key = sys.argv[2]
        recommendations = process_recommendations(user_id, api_key)
        print(json.dumps(recommendations))
    else:
        print("Usage: python3 get_recommendation_local_test_with_skills.py <user_id> <api_key>")
