def get_recommendations(courses_data, user_data, competency_data):
    try:
        # Extract user ID from user_data
        user_id = list(user_data.keys())[0]  # Assuming there's only one user in the data
        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']}
            # Find skills that need improvement for each course
            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]))  # Only include the first skill to improve

        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)

        recommendations = []
        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.'})

        # Assign scores based on name, short description, and description similarity with 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  # Default score
                # Prioritize courses based on name, short description, and description similarity
                if 'name' in course:
                    if 'Laravel' in course['name']:  # Example condition, you can modify this based on your criteria
                        score += 0.2
                if 'short_description' in course:
                    if 'Laravel' in course['short_description']:  # Example condition, you can modify this based on your criteria
                        score += 0.1
                if 'description' in course:
                    if 'Laravel' in course['description']:  # Example condition, you can modify this based on your criteria
                        score += 0.1
                recommendations.append({'courseId': course_id, 'score': score, 'reason': 'Recommended based on name, short description, and description similarity.'})

        # Sort recommendations by score in descending order
        recommendations.sort(key=lambda x: x['score'], reverse=True)

        # Normalize scores to be between 0 and 1
        max_score = max(recommendations, key=lambda x: x['score'])['score']
        for recommendation in recommendations:
            recommendation['score'] /= max_score

        return recommendations[:10]  # Return up to 10 recommendations

    except Exception as e:
        print("Error:", e)
        raise
