from pydantic import BaseModel
from typing import List, Dict, Any, Optional

class Skill(BaseModel):
    skill_id: str
    skill_type: str
    skill_name: str

class JobProfile(BaseModel):
    job_profile_name: Optional[str] = None
    job_profile_skills: Optional[List[Skill]] = None

class UserInfo(BaseModel):
    user_name: str
    managerId: str
    designation: Optional[str] = ""
    jobProfile: Optional[JobProfile] = None
    assignedCourses: List[str] = []
    completedCourses: List[str] = []
    skills: List[Skill] = []

class Course(BaseModel):
    courseId: str
    name: str
    short_description: str
    description: str
    skills: List[Skill] = []

class UsersUnderManager(BaseModel):
    users: Dict[str, UserInfo]

class CourseRecommendationRequest(BaseModel):
    client_id: str
    user_data: Dict[str, UserInfo]
    users_under_manager_data: UsersUnderManager
    client_all_courses_data: Dict[str, List[Course]]

class RelevanceFactors(BaseModel):
    skill_alignment: str
    team_relevance: str
    career_progression: str
    priority: str

class RecommendedCourse(BaseModel):
    courseId: str
    courseName: str
    matchScore: str
    reason: str
    relevance_factors: RelevanceFactors

class CourseRecommendationResponse(BaseModel):
    recommendations: List[RecommendedCourse]
    total_count: int
    message: str
    token_count: int