o
    Zph@                     @   s  d dl mZmZ d dlmZ d dlmZmZmZm	Z	 d dl
Z
d dlZd dlmZ d dlmZ d dlmZ d dlmZ ejejd	 eeZed
ddZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZ G dd deZ!G dd deZ"G dd  d eZ#G d!d" d"eZ$G d#d$ d$Z%e% Z&ej'd%ed&d'efd(d)Z(ej'd*e"d&d'e fd+d,Z)e*d-d.d/ Z+e*d0d1d2 Z,d3d4d5d6d7d8d6d9d:d6d;d<d6d=d>d6d?d@d6gdAZ-dBdCd@dDdEdFdGdHgdIdJdKdLdMdNdLdOdPdLdQdEdLdRdSdLgdTdUdUdVg dWdXdYdYdZd[d\gdWd]d^d_d`g dadWgdbZ.edckrId dl/Z/e/j0edddedf dS dS )g    )FastAPIHTTPException)	BaseModel)ListDictOptionalAnyN)asdict)	TNASystem)SkillAnalysisSystem)CourseFieldIdentifier)levelTNA System API1.0.0)titleversionc                   @      e Zd ZU eed< eed< dS )
DepartmentidnameN__name__
__module____qualname__int__annotations__str r   r   J/var/www/eduai.edurigo.com/doc_train/edurigo_ai/Puru/puru_test_fast_api.pyr         
 r   c                   @   s"   e Zd ZU eed< ee ed< dS )DepartmentRequestuser_promptorganization_departmentsN)r   r   r   r   r   r   r   r   r   r   r   r       s   
 r    c                   @   r   )DepartmentResponseidentified_departmentdepartment_idN)r   r   r   r   r   r   r   r   r   r   r#      r   r#   c                   @   s>   e Zd ZU eed< eed< dZee ed< dZee ed< dS )FilteredSkillskill_id
skill_nameNskill_levelskill_count)	r   r   r   r   r   r   r)   r   r*   r   r   r   r   r&   !   s
   
 r&   c                   @   r   )AllSkillDatar'   r(   Nr   r   r   r   r   r+   '   r   r+   c                   @   s:   e Zd ZU eed< eed< eed< eed< ee ed< dS )OfflineCourse	course_idcourse_nameshort_descriptiondescriptionskillsN)r   r   r   r   r   r   r   r   r   r   r,   +   s   
 r,   c                   @   sR   e Zd ZU eed< eed< eed< ee ed< eed< ee ed< ee	 ed< dS )	SkillsCourseRequest
user_query
admin_namedepartment_namefiltered_skillstotal_users_in_departmentall_skills_dataoffline_coursesN)
r   r   r   r   r   r   r&   r   r+   r,   r   r   r   r   r2   2   s   
 r2   c                   @   s.   e Zd ZU eed< eed< eed< eed< dS )CourseRecommendationr-   r   reason
percentageN)r   r   r   r   r   floatr   r   r   r   r:   ;   s
   
 r:   c                   @   2   e Zd ZU eeef ed< ee ed< eed< dS )SkillsCourseResponseskill_analysiscourses_offlinestrategic_presentationN	r   r   r   r   r   r   r   r   r:   r   r   r   r   r?   A      
 r?   c                   @   r>   )!SkillsCourseResponseWithStrategicr@   rA   rB   NrC   r   r   r   r   rE   E   rD   rE   c                   @   s:   e Zd ZU eeef ed< ee ed< dZ	e
e ed< dS )SkillsCourseResponseOptionsr@   rA   NrB   )r   r   r   r   r   r   r   r   r:   rB   r   r   r   r   r   rF   J   s   
 rF   c                	   @   s   e Zd ZdZdd ZdedefddZdee	 d	e	d
e
dee fddZde	dee	 defddZde	de
dede
fddZdS )TNAIntegratedSystemzFIntegrated TNA System combining department, skill, and course analysisc                 C   s&   t  | _t | _t | _td dS )zInitialize all three systemsz!TNA Integrated System initializedN)r
   department_systemr   skill_systemr   course_systemloggerinfo)selfr   r   r   __init__S   s   zTNAIntegratedSystem.__init__requestreturnc           
      C   s  z|j |j|jdd |jD dd |jD d}| jt|}|d }|d }t	
d|dd	 d
 g }|ddry|dry|d dd |jD d}| jt|}t	
d|dd	 d |ddry| |d ||dd}t|dd|dd	|dg |dd|dd|dd|ddd||dW S  ty }	 zt	d|	  tdd t|	 d!d"}	~	ww )#a>  
        Process skill analysis and course recommendations with strategic presentation
        
        Args:
            request: SkillsCourseRequest with all necessary data
            
        Returns:
            SkillsCourseResponse with skill analysis, course recommendations, and strategic presentation
        c                 S   s"   g | ]}|j |j|j|jd qS )r'   r(   r)   r*   rQ   .0skillr   r   r   
<listcomp>j   s    zBTNAIntegratedSystem.process_skills_and_courses.<locals>.<listcomp>c                 S      g | ]	}|j |jd qS )r'   r(   rW   rR   r   r   r   rU   s   s    )r3   r4   r5   r6   r8   raw_analysisrB   zSkill analysis completed: total_skills_recommendedr   z skillssuccessFidentified_fieldc              	   S   s6   g | ]}|j |j|j|j|jrd |jnddqS ), )r-   r.   course_short_descriptioncourse_descriptionrT   )r-   r.   r/   r0   r1   join)rS   courser   r   r   rU      s    )r[   courseszCourse analysis: total_matching_coursesz courses matchedmatching_coursesfiltering_reasoningr]   Unknownrecommended_skillsanalysis_summarycase_applieddepartment_coverageg        )r[   rY   rg   rh   ri   rj   rZ   )r@   rA   rB   z(Error in skills and courses processing:   z&Skills and courses processing failed: status_codedetailN)r3   r4   r5   r6   r8   rI   process_with_both_formatsjsondumpsrK   rL   getr9   rJ   process_json_request _generate_course_recommendationsr?   	Exceptionerrorr   r   )
rM   rO   skill_requestboth_formatsskill_resultrB   rA   course_requestcourse_resulter   r   r   process_skills_and_coursesZ   sf   
	







	z.TNAIntegratedSystem.process_skills_and_coursesrd   ry   	reasoningc              
   C   s   g }| dd}| dg }t|D ]5\}}td|d  d}	| ||}
t|	|
 d}| |||
dk}|t|d	 |d
 |t|dd q|j	dd dd |S )ac  
        Generate course recommendations with reasons and percentages
        
        Args:
            matching_courses: List of courses that matched the field
            skill_result: Skill analysis result
            reasoning: LLM reasoning for course selection
            
        Returns:
            List of CourseRecommendation objects
        r[   rf   rg   _      <   b   r   r-   r.      )r-   r   r;   r<   c                 S   s   | j S )N)r<   )xr   r   r   <lambda>   s    zFTNAIntegratedSystem._generate_course_recommendations.<locals>.<lambda>T)keyreverse)
rr   	enumeratemax_calculate_skill_match_bonusmin_generate_course_reasonappendr:   roundsort)rM   rd   ry   r~   recommendationsr[   rg   ira   base_percentageskill_match_bonusfinal_percentager;   r   r   r   rt      s    
z4TNAIntegratedSystem._generate_course_recommendationsra   rg   c                 C   s   |sdS | dd d}dd |D }|sdS d}|D ]}| dd }|D ]}||v s4||v r:|d7 } nq*qt|d	 d
S )z1Calculate bonus percentage based on skill matchesr   rT   r]   r\   c                 S   s   g | ]
}|  r|  qS r   )striprR   r   r   r   rU      s    zDTNAIntegratedSystem._calculate_skill_match_bonus.<locals>.<listcomp>r(   r      
   )rr   lowersplitr   )rM   ra   rg   course_skillsmatches	skill_recr(   course_skillr   r   r   r      s    z0TNAIntegratedSystem._calculate_skill_match_bonusr[   has_skill_matchc                 C   s4   | dd}|rd| d| dS d| d| dS )	z8Generate explanation for why this course was recommendedr.   zUnknown CoursezDirectly relevant to z1 field with matching skill requirements. Course 'zB' covers essential technologies and concepts needed for your goal.zRelevant to z8 field based on course content and description. Course 'zI' provides foundational knowledge that supports your learning objectives.)rr   )rM   ra   r[   r   r.   r   r   r   r      s   z+TNAIntegratedSystem._generate_course_reasonN)r   r   r   __doc__rN   r2   r?   r}   r   r   r   r:   rt   r=   r   boolr   r   r   r   r   rG   P   s    
^
*rG   z/analyze-department)response_modelrO   c              
      s   z\t d| j  | jdd | jD d}tjt|}t d|  |	ddrA|	ddrA|	d	d
}|	dd}n|	dd
}d}t
||d}t d| d| d |W S  tyy } zt d|  tdt|dd}~ww )zy
    Department Analysis endpoint - FIRST CALL
    
    Identifies the most relevant department based on user prompt
    z$Processing department analysis for: c                 S   rV   )r   r   r   )rS   deptr   r   r   rU     s    z&analyze_department.<locals>.<listcomp>r!   r"   zDepartment analysis result: rZ   Fmatchedr5   rf   r%   r   inferred_department)r$   r%   zDepartment analysis completed: z (ID: )zDepartment analysis failed: rk   rl   N)rK   rL   r!   r"   
tna_systemrH   rs   rp   rq   rr   r#   ru   rv   r   r   )rO   department_requestdepartment_resultr$   r%   resultr|   r   r   r   analyze_department  s8   	r   z/analyze-skills-coursesc              
      sh   zt d| j  t| }t d |W S  ty3 } zt d|  tdt|dd}~ww )z
    Skills and Courses Analysis endpoint - SECOND CALL
    
    Processes skill analysis and course recommendations based on department context
    z,Processing skills and courses analysis for: z2Skills and courses analysis completed successfullyz$Skills and courses analysis failed: rk   rl   N)	rK   rL   r3   r   r}   ru   rv   r   r   )rO   r   r|   r   r   r   analyze_skills_courses5  s   

r   z/healthc                      s   dddS )zHealth check endpointhealthyzTNA System API is running)statusmessager   r   r   r   r   health_checkF  s   
r   /c                      s   ddddddddd	S )
z"Root endpoint with API informationr   r   uI   Two-step process: 1) Department Analysis → 2) Skills & Courses Analysisz@POST /analyze-department - FIRST CALL: Department identificationzVPOST /analyze-skills-courses - SECOND CALL: Skills analysis and course recommendationszGET /health - Health checkzGET /docs - API documentation)zanalyze-departmentzanalyze-skills-courseshealthdocs)r   r   flow	endpointsr   r   r   r   r   rootK  s   r   z&Want to improve my teams sales ability   
Operationsr      HR   Finance   zProduct Management   sales   	Developerr   z$Want to improve my technical abilityAscentx   PythonIntermediate   rQ   r   i_  zcommunication skillrW   i`  ztechnical skillsy   
JavaScriptz   {   Angular32zGeneral Knowledger]   )r-   r.   r/   r0   r1   43z)Python Programming for Complete BeginnerszLearn Python from scratchpythonprogramming63zAngular BasiczAngular framework coursezComplete Angular course)angular
typescript
javascript)r3   r4   r5   r6   r7   r8   r9   __main__z0.0.0.0i@  )hostport)1fastapir   r   pydanticr   typingr   r   r   r   rp   loggingdataclassesr	   tna_depr
   tna_skill_secondr   tna_course_trialr   basicConfigINFO	getLoggerr   rK   appr   r    r#   r&   r+   r,   r2   r:   r?   rE   rF   rG   r   postr   r   rr   r   r   example_department_requestexample_skills_courses_requestuvicornrunr   r   r   r   <module>   s    
	 3.

	
-