import pickle
import logging

logging.basicConfig(level=logging.DEBUG)

def get_recommendations(client_id, user_data):
    try:
        with open(f"trained_models/model_{client_id}.pkl", "rb") as file:
            trained_model = pickle.load(file)

        user_id = list(user_data.keys())[0]
        logging.debug(f"User ID: {user_id}")
        courses_data = trained_model['courses_data']
        logging.debug(f"Courses Data: {courses_data}")
        competency_data = trained_model['competency_data']

        recommendations = []

        user_id = list(user_data.keys())[0]
        assigned_courses = set(user_data[user_id]['assignedCourses'])
        completed_courses = set(user_data[user_id]['completedCourses'])
        user_skills = {skill['skill_id']: int(skill['skill_type']) for skill in user_data[user_id]['skills']}

        similar_courses_based_on_skills = set()
        for course in courses_data:
            course_skills = {skill['skill_id']: int(skill['skill_type']) for skill in course['skills']}
            skills_to_improve = [skill_id for skill_id in course_skills if course_skills.get(skill_id, 0) > user_skills.get(skill_id, 0)]
            if skills_to_improve:
                similar_courses_based_on_skills.add((course['courseId'], skills_to_improve[0]))

        similar_courses_based_on_assigned_completed = set()
        for course in courses_data:
            course_id = course['courseId']
            if course_id not in assigned_courses and course_id not in completed_courses:
                similar_courses_based_on_assigned_completed.add(course_id)

        for course_id, skill_id in similar_courses_based_on_skills:
            recommendations.append({
                'courseId': course_id,
                'score': 1,
                'reason': f"Recommended for upgrading existing user skills. Skill to improve: {skill_id}"
            })

        num_similar_courses = len(similar_courses_based_on_assigned_completed)
        if num_similar_courses > 0:
            score_increment = 1 / num_similar_courses
            for course_id in similar_courses_based_on_assigned_completed:
                recommendations.append({'courseId': course_id, 'score': score_increment, 'reason': 'Recommended based on similar courses to assigned and completed courses.'})

        for course in courses_data:
            course_id = course['courseId']
            if course_id not in assigned_courses and course_id not in completed_courses and course_id not in similar_courses_based_on_skills:
                score = 0.5
                if 'name' in course and 'Laravel' in course['name']:
                    score += 0.2
                if 'short_description' in course and 'Laravel' in course['short_description']:
                    score += 0.1
                if 'description' in course and 'Laravel' in course['description']:
                    score += 0.1
                recommendations.append({'courseId': course_id, 'score': score, 'reason': 'Recommended based on name, short description, and description similarity.'})

        recommendations.sort(key=lambda x: x['score'], reverse=True)

        if recommendations:
            max_score = max(recommendations, key=lambda x: x['score'])['score']
            for recommendation in recommendations:
                recommendation['score'] /= max_score

        return recommendations[:10]

    except Exception as e:
        logging.error(f"Error: {e}")
        return []
