Ë
    øŒj•i  ã                   ó6  — d Z ddlZddlZddlZddlmZmZmZmZ ddl	m	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mZ dd	lmZ  e«         G d
„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ d«      Zdedefd„Zdedefd„Zdedefd„Z y)zI
workout_list.py - Workout database, PDF parsing, and LLM planning logic
é    N)ÚDictÚListÚOptionalÚAny)Údatetime)Ú
ChatOpenAI)ÚChatPromptTemplate)ÚBaseOutputParser)Ú	BaseModelÚField)Úload_dotenvc                   óÒ   — e Zd ZU dZ edd¬«      Zeed<    edd¬«      Zeed<    edd¬«      Z	eed	<    edd
¬«      Z
eed<    edd¬«      Zee   ed<    edd¬«      Zee   ed<   y)Ú
ExerciseUIzExercise format for UI display.zExercise name©ÚdescriptionÚnamezDuration (e.g., '03 Min')ÚdurationzNumber of sets (e.g., '3 Sets')ÚsetszCalories (e.g., '30 Calories')ÚcaloriesNzURL to exercise videoÚ	video_urlÚpendingz)Status: cached, generated, pending, errorÚvideo_status)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   ÚstrÚ__annotations__r   r   r   r   r   r   © ó    ú@/var/www/html/Fitness-lenito-AI-main/workout_app/workout_list.pyr   r      sx   … Ù(Ù�c Ô7€Dˆ#Ó7Ù˜#Ð+FÔG€HˆcÓGÙ�cÐ'HÔI€Dˆ#ÓIÙ˜#Ð+KÔL€HˆcÓLÙ$ TÐ7NÔO€Iˆx˜‰}ÓOÙ"'¨	Ð?jÔ"k€L�(˜3‘-Ôkr    r   c                   ó2  — e Zd ZU dZ edd¬«      Zeed<    edd¬«      Zeed<    edd¬«      Z	eed	<    edd
¬«      Z
eed<    edd¬«      Zeed<    edd¬«      Zeed<    eed¬«      Zee   ed<    eed¬«      Zee   ed<    eed¬«      Zee   ed<   y)ÚWorkoutDayUIzDaily workout format for UI.zDay name (e.g., 'Monday')r   ÚdayzWorkout titleÚtitlezTotal duration (e.g., '40 Min')r   zIntensity levelÚ	intensityz%Total calories (e.g., '500 Calories')Útotal_calorieszWorkout categoryÚcategoryzWarm-up exercises©Údefault_factoryr   Úwarmup_exerciseszMain workout exercisesÚmain_exerciseszCool-down exercisesÚcooldown_exercisesN)r   r   r   r   r   r$   r   r   r%   r   r&   r'   r(   Úlistr+   r   r   r,   r-   r   r    r!   r#   r#      s·   … Ù%Ù�SÐ&AÔB€CˆÓBÙ�s¨Ô8€Eˆ3Ó8Ù˜#Ð+LÔM€HˆcÓMÙ˜3Ð,=Ô>€IˆsÓ>Ù Ð1XÔY€N�CÓYÙ˜#Ð+=Ô>€HˆcÓ>Ù).¸tÐQdÔ)eÐ�d˜:Ñ&ÓeÙ',¸TÐOgÔ'h€N�D˜Ñ$ÓhÙ+0ÀÐShÔ+iÐ˜˜ZÑ(Ôir    r#   c                   ó>  — e Zd ZU dZeed<   eed<   dZee   ed<   dZ	ee
   ed<   dZee   ed<   dZee   ed<   dZee   ed	<   dZee   ed
<   dZee   ed<   dZeee      ed<    ee¬«      Zeeef   ed<   ee   ed<    edd¬«      Zeed<    edd¬«      Zeed<   y)ÚWeeklyPlanUIzComplete 7-day plan for UIÚuser_idÚ
blood_typeNÚageÚbmiÚbmi_categoryÚ
body_shapeÚactivity_levelÚ	main_goalÚworkout_levelÚfocus_areas)r*   Úplan_summaryÚweekly_workoutsr   zNumber of videos generatedr   Úvideos_generatedzNumber of videos from cacheÚvideos_cached)r   r   r   r   r   r   r3   r   Úintr4   Úfloatr5   r6   r7   r8   r9   r:   r   r   Údictr;   r   r   r#   r=   r>   r   r    r!   r0   r0   *   sË   … Ù$ØƒLØƒOØ€Cˆ�#‰ÓØ€Cˆ�%‰ÓØ"&€L�(˜3‘-Ó&Ø $€J�˜‘Ó$Ø$(€N�H˜S‘MÓ(Ø#€Iˆx˜‰}Ó#Ø#'€M�8˜C‘=Ó'Ø'+€K�˜$˜s™)Ñ$Ó+Ù#(¸Ô#>€L�$�s˜C�x‘.Ó>Ø˜,Ñ'Ó'Ù! !Ð1MÔNÐ�cÓNÙ˜qÐ.KÔL€M�3ÔLr    r0   c                   óÂ  — e Zd ZU dZeed<   eed<   dZee   ed<   dZ	ee
   ed<   dZee
   ed<    edd¬	«      Zee   ed
<    edd¬	«      Zee   ed<    edd¬	«      Zee   ed<    edd¬	«      Zee   ed<    edd¬	«      Zee
   ed<    eed¬«      Zeee      ed<    edd¬	«      Zeed<   dee
   fd„Zdee   fd„Zdee   fd„Zde
fd„Zdefd„Zdeeef   fd„Zy) ÚUserProfilez0User profile for personalized workout generationr1   r2   Nr3   ÚweightÚheightz,Body shape: Medium, Flabby, Skinny, Muscularr   r6   zIActivity level: Sedentary, Lightly Active, Moderately Active, Very Activer7   z>Workout level: Easy To Start, Break A Light Sweat, Challengingr9   z-Main goal: Lose Weight, Gain Muscle, Stay Fitr8   zDesired weight in kgÚdesired_weightz.Focus areas: Arms, Upper Body, Abs, Butt, Legsr)   r:   TzWhether to generate videosÚgenerate_videosÚreturnc                 óŠ   — | j                   r7| j                  r+| j                   dz  }t        | j                  |dz  z  d«      S y )Néd   é   é   )rE   rD   Úround)ÚselfÚheight_ms     r!   Úcalculate_bmizUserProfile.calculate_bmiM   s:   € Ø�;Š;˜4Ÿ;š;Ø—{‘{ SÑ(ˆHÜ˜Ÿ™¨°A©Ñ6¸Ó:Ð:Ør    c                 óN   — | j                  «       }|€y |dk  ry|dk  ry|dk  ryy)Ng     €2@ÚUnderweighté   ÚNormalé   Ú
OverweightÚObese)rP   )rN   r4   s     r!   Úget_bmi_categoryzUserProfile.get_bmi_categoryS   s9   € Ø× Ñ Ó"ˆØˆ;ØØ�Š:Ø Ø�2ŠXØØ�2ŠXØàr    c                 ó¾   — | j                   €y | j                   dk  ry| j                   dk  ry| j                   dk  ry| j                   dk  ry| j                   d	k  ry
y)Né   ÚYouthrU   zYoung Adulté(   ÚAdulté2   z
Middle AgeéA   ÚSeniorÚElderly)r3   ©rN   s    r!   Úget_age_categoryzUserProfile.get_age_category`   sX   € Ø�8‰8ÐØØ�8‰8�bŠ=ØØ�X‰X˜Š]Ø Ø�X‰X˜Š]ØØ�X‰X˜Š]ØØ�X‰X˜Š]Øàr    c                 óH   — dddddœ}|j                  | j                  d«      S )z.Get calorie multiplier based on activity levelç333333ó?g      ö?gÍÌÌÌÌÌø?gš™™™™™û?)Ú	SedentaryúLightly ActiveúModerately ActiveúVery Active)Úgetr7   )rN   Úmultiplierss     r!   Úget_activity_multiplierz#UserProfile.get_activity_multiplierp   s0   € ð Ø#Ø!%Ø ñ	
ˆð �‰˜t×2Ñ2°EÓ:Ð:r    c                 óF   — ddddœ}|j                  | j                  d«      S )zMap workout level to intensityÚLowÚMediumÚHigh)zEasy To StartzBreak A Light SweatÚChallenging)rj   r9   )rN   Úmappings     r!   Ú get_intensity_from_workout_levelz,UserProfile.get_intensity_from_workout_levelz   s-   € ð #Ø#+Ø!ñ
ˆð
 �{‰{˜4×-Ñ-¨xÓ8Ð8r    c                 óÖ  — g g g g g g dddddœ
}| j                   r‰| j                   dk  r|d   j                  d«       d|d<   d|d	<   n[| j                   d
k\  r|d   j                  d«       d|d<   d|d	<   n-| j                   dk\  r|d   j                  d«       d|d<   d|d	<   | j                  «       }|dk(  r|d   j                  d«       d|d<   d|d<   n"|dv r|d   j                  d«       d|d<   d|d<   | j                  r¶| j                  dk(  r"|d   j                  d«       |dxx   dz  cc<   n…| j                  dk(  r"|d   j                  d «       |dxx   dz  cc<   nT| j                  d!k(  r"|d   j                  d"«       |dxx   dz  cc<   n#| j                  d#k(  r|d   j                  d$«       | j                  rÐ| j                  d%k(  r/|d&   j                  d'«       |dxx   dz  cc<   |d	xx   dz  cc<   n’| j                  d(k(  r"|d&   j                  d)«       |dxx   d*z  cc<   na| j                  d+k(  r|d&   j                  d,«       n=| j                  d-k(  r.|d&   j                  d.«       |dxx   dz  cc<   |dxx   dz  cc<   | j
                  rŸ| j
                  d/k(  r/|d0   j                  d1«       |dxx   d2z  cc<   |dxx   dz  cc<   na| j
                  d3k(  r/|d0   j                  d4«       |dxx   dz  cc<   |d	xx   dz  cc<   n#| j
                  d5k(  r|d0   j                  d6«       | j                  r±| j                  r¥| j                  | j                  z
  }|d7kD  r'|d0   j                  d8|d9›d:�«       |dxx   dz  cc<   n`|d;kD  r'|d0   j                  d<|d9›d=�«       |dxx   dz  cc<   n4|d>k  r/|d0   j                  d?t        |«      d9›d@�«       |dxx   dz  cc<   | j                  r^t        | j                  «      dAkD  rFdBj                  | j                  «      }|dC   j                  dD|› �«       |dC   j                  dE«       |S )FNg      ð?)
Úage_factorsÚbmi_factorsÚbody_shape_factorsÚactivity_factorsÚgoal_factorsÚfocus_factorsÚintensity_modifierÚvolume_modifierÚrecovery_modifierÚcalorie_modifierrZ   ru   z<Growing body - focus on technique and foundational movementsgš™™™™™é?r{   gÍÌÌÌÌÌì?r}   r^   z'Increased recovery needs and joint careg333333ë?re   r_   z2Focus on mobility, balance, and functional fitnessçffffffæ?gffffffö?rR   rv   z*Focus on strength building and muscle gainr|   gffffffò?r~   )rV   rW   z1Include more cardio and calorie-burning exercisesgš™™™™™ñ?g      ô?ÚSkinnyrw   z4Emphasize resistance training and compound movementsÚFlabbyz<Balance cardio with strength training for body recompositionÚMuscularz<Maintain muscle mass with varied intensity and periodizationro   z2Well-balanced workout approach for overall fitnessrf   rx   zBStart gradually, focus on building consistency and habit formationrg   z3Build on current activity with progressive overloadgffffffî?rh   z/Maintain current fitness with varied challengesri   z/Can handle higher volume and intensity workoutszLose Weightry   zFPrioritize calorie-burning exercises, HIIT, and metabolic conditioninggÍÌÌÌÌÌô?zGain MusclezIFocus on progressive resistance, compound lifts, and hypertrophy trainingzStay Fitz8Balanced approach to maintain overall fitness and healthé
   z Significant weight loss target: z.1fz& kg - sustained caloric deficit neededé   zModerate weight loss target: z kgéûÿÿÿzWeight gain target: z% kg - focus on strength and nutritionr   ú, rz   zTarget areas: z8Include specific exercises targeting these muscle groups)r3   ÚappendrX   r6   r7   r8   rD   rF   Úabsr:   ÚlenÚjoin)rN   Úconsiderationsr5   Úweight_diffÚ	focus_strs        r!   Úget_fitness_considerationsz&UserProfile.get_fitness_considerationsƒ   sû  € àØØ"$Ø "ØØØ"%Ø"Ø!$Ø #ñ
ˆð �8Š8Ø�x‰x˜"Š}Ø˜}Ñ-×4Ñ4Ð5sÔtØ7:�Ð3Ñ4Ø69�Ð2Ò3Ø—‘˜R’Ø˜}Ñ-×4Ñ4Ð5^Ô_Ø7;�Ð3Ñ4Ø69�Ð2Ò3Ø—‘˜R’Ø˜}Ñ-×4Ñ4Ð5iÔjØ7:�Ð3Ñ4Ø69�Ð2Ñ3ð ×,Ñ,Ó.ˆØ˜=Ò(Ø˜=Ñ)×0Ñ0Ð1]Ô^Ø03ˆNÐ,Ñ-Ø15ˆNÐ-Ò.ØÐ4Ñ4Ø˜=Ñ)×0Ñ0Ð1dÔeØ03ˆNÐ,Ñ-Ø15ˆNÐ-Ñ.ð �?Š?Ø�‰ (Ò*ØÐ3Ñ4×;Ñ;Ð<rÔsØÐ0Ó1°TÑ9Ô1Ø—‘ HÒ,ØÐ3Ñ4×;Ñ;Ð<zÔ{ØÐ1Ó2°cÑ9Ô2Ø—‘ JÒ.ØÐ3Ñ4×;Ñ;Ð<zÔ{ØÐ3Ó4¸Ñ;Ô4Ø—‘ HÒ,ØÐ3Ñ4×;Ñ;Ð<pÔqð ×ÒØ×"Ñ" kÒ1ØÐ1Ñ2×9Ñ9Ð:~ÔØÐ3Ó4¸Ñ<Ó4ØÐ2Ó3°sÑ:Ô3Ø×$Ñ$Ð(8Ò8ØÐ1Ñ2×9Ñ9Ð:oÔpØÐ3Ó4¸Ñ<Ô4Ø×$Ñ$Ð(;Ò;ØÐ1Ñ2×9Ñ9Ð:kÕlØ×$Ñ$¨Ò5ØÐ1Ñ2×9Ñ9Ð:kÔlØÐ3Ó4¸Ñ<Ó4ØÐ0Ó1°SÑ8Ó1ð �>Š>Ø�~‰~ Ò.Ø˜~Ñ.×5Ñ5Ð6~ÔØÐ1Ó2°cÑ9Ó2ØÐ0Ó1°TÑ9Ô1Ø—‘ =Ò0Ø˜~Ñ.×5Ñ5ð  7Bô  CØÐ0Ó1°SÑ8Ó1ØÐ2Ó3°sÑ:Ô3Ø—‘ :Ò-Ø˜~Ñ.×5Ñ5Ð6pÔqð �;Š;˜4×.Ò.ØŸ+™+¨×(;Ñ(;Ñ;ˆKØ˜RÒØ˜~Ñ.×5Ñ5Ð8XÐYdÐehÐXið  jPð  7Qô  RØÐ1Ó2°cÑ9Ô2Ø˜q’Ø˜~Ñ.×5Ñ5Ð8UÐVaÐbeÐUfÐfiÐ6jÔkØÐ1Ó2°dÑ:Ô2Ø˜rÒ!Ø˜~Ñ.×5Ñ5Ð8LÌSÐQ\ÓM]Ð^aÐLbð  cHð  7Iô  JØÐ0Ó1°TÑ9Ó1ð ×Ò¤ D×$4Ñ$4Ó 5¸Ò 9ØŸ	™	 $×"2Ñ"2Ó3ˆIØ˜?Ñ+×2Ñ2°^ÀIÀ;Ð3OÔPØ˜?Ñ+×2Ñ2Ð3mÔnàÐr    )r   r   r   r   r   r   r3   r   r?   rD   r@   rE   r   r6   r7   r9   r8   rF   r.   r:   r   rG   ÚboolrP   rX   rc   rl   rs   r   r   rŽ   r   r    r!   rC   rC   =   sA  … Ù:ØƒLØƒOØ€Cˆ�#‰ÓØ"€FˆH�U‰OÓ"Ø"€FˆH�U‰OÓ"Ù % dÐ8fÔ g€J�˜‘ÓgÙ$)¨$ð  =Hô  %I€N�H˜S‘Mó  IÙ#(¨Ð;{Ô#|€M�8˜C‘=Ó|Ù$ TÐ7fÔg€Iˆx˜‰}ÓgÙ&+¨DÐ>TÔ&U€N�H˜U‘OÓUÙ',¸TÐOô  (A€K�˜$˜s™)Ñ$ó  Aá! $Ð4PÔQ€O�TÓQð˜x¨™ó ð (¨3¡-ó ð (¨3¡-ó ð ;¨ó ;ð9°#ó 9ðf¨D°°c°©Nô fr    rC   c            	       ó†   — e Zd ZdZd„ Zdedeeeeee   f   f   fd„Zddefd„Z	de
defd	„Zdefd
„Z G d„ de«      Zd„ Zy)ÚWorkoutDatabasez7Manages workout database, PDF parsing, and LLM planningc                 ó.   — i | _         d | _        d | _        y ©N)Úparsed_workout_dataÚllmÚvalidation_llmrb   s    r!   Ú__init__zWorkoutDatabase.__init__ð   s   € Ø#%ˆÔ ØˆŒØ"ˆÕr    Úpdf_pathrH   c                 óè  ‡— 	 t        j                  |«      }i i i i dœ}d}d}|D �]t  }	 |j	                  d«      d   }|D �]V  }	d|	vrŒ	|	d   D �]E  }
|
d   D �]9  }|d	   j                  «       Š|d
   }‰sŒ|dk\  r?d‰v r;t        j                  d‰«      }|sŒA|j                  d«      }d}t        d|› �«       Œc|dk\  r3|dk  r.|r,g d¢}t        ˆfd„|D «       «      }|sŒŠ‰}t        d|› �«       Œ›|dk\  sŒ¡|dk  sŒ§|sŒª|sŒ­‰j                  d«      s#‰j                  d«      s‰j                  d«      sŒá‰j                  d«      j                  «       }|s�Œt        |«      dkD  s�Œ|||   vrg ||   |<   ||   |   j                  |«       �Œ< �ŒH �ŒY �Œw |j                  «        |S # t        $ r}t        d|› �«       ‚ d}~ww xY w# t        $ r}t        d|› �«       Y d}~�ŒÇd}~ww xY w)z4Extract exercises from PDF using font size detectionzError opening PDF with fitz: N©ÚOÚAÚBÚABrA   ÚblockszError getting text from page: ÚlinesÚspansÚtextÚsizeé   ÚTypezType\s+([OABAB]{1,2})rL   zFound Blood Type: é   )ÚStrengthÚCombatÚBoxingÚConditioningÚHIITÚ	EnduranceÚSportsÚMobilityÚRecoveryÚYogaÚPilateszTai ChiÚ
StretchingÚ	BreathingÚ
MeditationzFoam RollingÚExtrasÚStressÚBalanceÚCardioÚCalmingÚFlexibilityc              3   ó^   •K  — | ]$  }|j                  «       ‰j                  «       v –— Œ& y ­wr“   )Úlower)Ú.0Úcatr¢   s     €r!   Ú	<genexpr>zHWorkoutDatabase.extract_exercises_with_font_detection.<locals>.<genexpr>'  s%   øè ø€ Ð-`ÑU_Èc¨c¯i©i«k¸T¿Z¹Z»\Ô.IÑU_ùs   ƒ*-z  Category: é	   é   u   â€¢Ú-Ú*u   â€¢-* rK   )ÚfitzÚopenÚ	ExceptionÚprintÚget_textÚstripÚreÚsearchÚgroupÚanyÚ
startswithÚlstripr‰   r‡   Úclose)rN   r˜   ÚdocÚeÚexercises_by_blood_typeÚcurrent_blood_typeÚcurrent_categoryÚpagerŸ   ÚblockÚlineÚspanÚ	font_sizeÚblood_matchÚ
categoriesÚis_categoryÚexercise_namer¢   s                    @r!   Ú%extract_exercises_with_font_detectionz5WorkoutDatabase.extract_exercises_with_font_detectionõ   s5  ø€ ð	Ü—)‘)˜HÓ%ˆCð
 )+°¸"ÀBÑ"GÐà!ÐØÐäˆDðØŸ™ vÓ.¨xÑ8�ô
  �Ø %Ñ'Øà! '�N�DØ $ W¥˜Ø# F™|×1Ñ1Ó3˜Ø$(¨¡L˜	á#Ø$ð %¨š?¨v¸©~Ü*,¯)©)Ð4LÈdÓ*S˜KÚ*Ø5@×5FÑ5FÀqÓ5IÐ 2Ø37Ð 0Ü %Ð(:Ð;MÐ:NÐ&OÕ Pð '¨"š_°¸R²ÑDVò*˜Jô +.Ó-`ÑU_Ó-`Ó*`˜KÚ*Ø37Ð 0Ü %¨Ð5EÐ4FÐ&GÕ Hð '¨!›^°	¸B³ÒCUÒZjØ#Ÿ™¨uÔ5¸¿¹ÈÔ9MÐQU×Q`ÑQ`ÐadÕQeØ04·±¸HÓ0E×0KÑ0KÓ0M Û#0´S¸Ó5GÈ!Ô5KØ'7Ð?VÐWiÑ?jÑ'jØhjÐ(?Ð@RÑ(SÐTdÑ(eØ$;Ð<NÑ$OÐP`Ñ$a×$hÑ$hÐivÖ$wòK !.ò +ò	  ð ðf 	�	‰	ŒØ&Ð&øô{ ò 	ÜÐ1°!°Ð5Ô6Øûð	ûô ò ÜÐ6°q°cÐ:Ô;Ýûðús.   ƒF/ ªGÆ/	GÆ8GÇGÇ	G1ÇG,Ç,G1Úfolder_pathc                 ó²  — t         j                  j                  |«      s't        d|› d�«       i i i i dœ| _        | j                  S t        j
                  |«      D �cg c]$  }|j                  «       j                  d«      sŒ#|‘Œ& }}|s't        d|› d�«       i i i i dœ| _        | j                  S t        dt        |«      › d�«       i }i }|D ]œ  }t         j                  j                  ||«      }t        d	|› �«       	 d
|j                  «       v sd|j                  «       v r| j                  |«      }n5d|j                  «       v sd|j                  «       v r| j                  |«      }Œž i i i i dœ| _        dD ]Ú  }	|j                  |	i «      j                  «       D ]I  \  }
}|
| j                  |	   vrg | j                  |	   |
<   | j                  |	   |
   j                  |«       ŒK |j                  |	i «      j                  «       D ]I  \  }
}|
| j                  |	   vrg | j                  |	   |
<   | j                  |	   |
   j                  |«       ŒK ŒÜ dD ]A  }	t        d„ | j                  |	   j!                  «       D «       «      }t        d|	› d|› d�«       ŒC | j                  S c c}w # t        $ r}t        d|› d|› �«       Y d}~�Œd}~ww xY w)zLoad and parse all PDFszWARNING: Workout folder 'z"' not found. Using empty database.rš   z.pdfz WARNING: No PDF files found in 'z'. Using empty database.zFound z
 PDF fileszProcessing: ÚmasterÚdatabaseÚyogaÚ
meditationzError processing z: Nc              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr“   )r‰   )r½   Úexss     r!   r¿   z:WorkoutDatabase.load_and_parse_all_pdfs.<locals>.<genexpr>g  s   è ø€ ÐZÑ,Y Sœ˜CŸÑ,Yùs   ‚zBlood Type z
 exercises)ÚosÚpathÚexistsrÇ   r”   Úlistdirr¼   Úendswithr‰   rŠ   rß   rÆ   rj   ÚitemsÚextendÚsumÚvalues)rN   rà   ÚfÚ	pdf_filesÚ	master_dbÚyoga_dbÚpdf_filer˜   rÒ   r2   r(   Ú	exercisesÚtotals                r!   Úload_and_parse_all_pdfsz'WorkoutDatabase.load_and_parse_all_pdfs8  sÎ  € ä�w‰w�~‰~˜kÔ*ÜÐ-¨k¨]Ð:\Ð]Ô^Ø-/°b¸rÈÑ'LˆDÔ$Ø×+Ñ+Ð+ä "§
¡
¨;Ô 7ÓVÑ 7˜1¸1¿7¹7»9×;MÑ;MÈfÕ;U’QÐ 7ˆ	ÐVáÜÐ4°[°MÐAYÐZÔ[Ø-/°b¸rÈÑ'LˆDÔ$Ø×+Ñ+Ð+ä�”s˜9“~Ð& jÐ1Ô2àˆ	Øˆã!ˆHÜ—w‘w—|‘| K°Ó:ˆHÜ�L  
Ð+Ô,ðØ˜xŸ~™~Ó/Ñ/°:ÀÇÁÓAQÑ3QØ $× JÑ JÈ8Ó T‘IØ˜xŸ~™~Ó/Ñ/°<À8Ç>Á>ÓCSÑ3SØ"×HÑHÈÓR�Gøð "ð *,°"¸2ÀRÑ#HˆÔ Û/ˆJØ'0§}¡}°ZÀÓ'D×'JÑ'JÖ'LÑ#�˜)Ø 4×#;Ñ#;¸JÑ#GÑGØEG�D×,Ñ,¨ZÑ8¸ÑBØ×(Ñ(¨Ñ4°XÑ>×EÑEÀiÕPð (Mð
 (/§{¡{°:¸rÓ'B×'HÑ'HÖ'JÑ#�˜)Ø 4×#;Ñ#;¸JÑ#GÑGØEG�D×,Ñ,¨ZÑ8¸ÑBØ×(Ñ(¨Ñ4°XÑ>×EÑEÀiÕPñ (Kð 0ó 0ˆJÜÑZ¨D×,DÑ,DÀZÑ,P×,WÑ,WÔ,YÓZÓZˆEÜ�K 
˜|¨2¨e¨W°JÐ?Õ@ð 0ð ×'Ñ'Ð'ùòW Wøô* ò ÜÐ)¨(¨°2°a°SÐ9Ô:Ýûðús%   Á$J,ÂJ,ÄA+J1Ê1	KÊ:KËKÚuser_profilec                 ó¸
  — |j                   }|| j                  vs| j                  |   syd|j                  › d�g}|j                  d«       |j                  d«       |j                  d|› d�«       |j                  r0|j                  d|j                  › d|j                  «       › d	�«       |j                  rn|j                  rb|j                  «       }|j                  d
|j                  › d|j                  › d�«       |j                  d|› d|j                  «       › d	�«       |j                  r|j                  d|j                  › d�«       |j                  rB|j                  d|j                  › d�«       |j                  d|j                  «       › d�«       |j                  rB|j                  d|j                  › d�«       |j                  d|j                  «       › d�«       |j                  r|j                  d|j                  › d�«       |j                   rH|j                  r<|j                  |j                   z
  }|j                  d|j                   › d|d›d�«       |j"                  rFt%        |j"                  «      dkD  r.|j                  ddj'                  |j"                  «      › d�«       |j)                  «       }|j                  d«       |j                  d|d   d›d�«       |j                  d |d!   d›d�«       |j                  d"|d#   d›d�«       |j                  d$|d%   d›d�«       |d&   r0|j                  d'«       |d&   D ]  }|j                  d(|› d�«       Œ |d)   r0|j                  d*«       |d)   D ]  }|j                  d(|› d�«       Œ |d+   r0|j                  d,«       |d+   D ]  }|j                  d(|› d�«       Œ |d-   r0|j                  d.«       |d-   D ]  }|j                  d(|› d�«       Œ |d/   r0|j                  d0«       |d/   D ]  }|j                  d(|› d�«       Œ |d1   r0|j                  d2«       |d1   D ]  }|j                  d(|› d�«       Œ |j                  d3«       |j                  d4«       |j                  d5«       d}| j                  |   j+                  «       D ]L  \  }	}
|
sŒ	|j                  d|	j-                  «       › d6�«       |
D ]  }|j                  d7|› d�«       |d8z  }Œ ŒN |j                  d9|› d�«       |j                  d:«       d;j'                  |«      S )<z:Create comprehensive context for LLM with all user detailszIWARNING: No exercise data found for this blood type. Use basic exercises.z$PERSONALIZED WORKOUT PLAN FOR USER: Ú
zR================================================================================

zUSER PROFILE:
zBlood Type: zAge: z (z)
zWeight: z kg, Height: z cm
zBMI: zBody Shape: zActivity Level: zActivity Multiplier: zx
zWorkout Level: zPreferred Intensity: zMain Goal: zDesired Weight: z kg (Difference: z+.1fz kg)
r   zFocus Areas: r†   z
FITNESS CONSIDERATIONS:
zIntensity Modifier: r{   z.2fzVolume Modifier: r|   zRecovery Modifier: r}   zCalorie Modifier: r~   ru   z
Age Factors:
z  - rv   z
BMI Factors:
rw   z
Body Shape Factors:
rx   z
Activity Factors:
ry   z
Goal Factors:
rz   z
Focus Area Requirements:
zR
================================================================================
z?AVAILABLE EXERCISES DATABASE - YOU MUST USE THESE EXACT NAMES:
zQ================================================================================
z:
u     â€¢ rL   z
TOTAL AVAILABLE EXERCISES: zS
IMPORTANT: Use ONLY the exercise names listed above. Do not invent new exercises.
Ú )r2   r”   r1   r‡   r3   rc   rD   rE   rP   rX   r6   r7   rl   r9   rs   r8   rF   r:   r‰   rŠ   rŽ   rí   Úupper)rN   rù   r2   Úcontext_partsr4   rŒ   r‹   ÚfactorÚtotal_exercisesr(   rö   Úexs               r!   Úcreate_personalized_contextz+WorkoutDatabase.create_personalized_contextl  s£  € à!×,Ñ,ˆ
à˜T×5Ñ5Ñ5¸T×=UÑ=UÐV`Ò=aØ^à?À×@TÑ@TÐ?UÐUWÐXÐYˆØ×Ñ˜_Ô-ð 	×ÑÐ.Ô/Ø×Ñ˜|¨J¨<°rÐ:Ô;à×ÒØ× Ñ  5¨×)9Ñ)9Ð(:¸"¸\×=ZÑ=ZÓ=\Ð<]Ð]`Ð!aÔbà×Ò <×#6Ò#6Ø×,Ñ,Ó.ˆCØ× Ñ  8¨L×,?Ñ,?Ð+@ÀÈl×NaÑNaÐMbÐbgÐ!hÔiØ× Ñ  5¨¨¨R°×0MÑ0MÓ0OÐ/PÐPSÐ!TÔUà×"Ò"Ø× Ñ  <°×0GÑ0GÐ/HÈÐ!KÔLà×&Ò&Ø× Ñ Ð#3°L×4OÑ4OÐ3PÐPRÐ!SÔTØ× Ñ Ð#8¸×9]Ñ9]Ó9_Ð8`Ð`cÐ!dÔeà×%Ò%Ø× Ñ  ?°<×3MÑ3MÐ2NÈbÐ!QÔRØ× Ñ Ð#8¸×9fÑ9fÓ9hÐ8iÐikÐ!lÔmà×!Ò!Ø× Ñ  ;¨|×/EÑ/EÐ.FÀbÐ!IÔJà×&Ò&¨<×+>Ò+>Ø&×-Ñ-°×0KÑ0KÑKˆKØ× Ñ Ð#3°L×4OÑ4OÐ3PÐPaÐbmÐnrÐasÐsyÐ!zÔ{à×#Ò#¬¨L×,DÑ,DÓ(EÈÒ(IØ× Ñ  =°·±¸<×;SÑ;SÓ1TÐ0UÐUWÐ!XÔYð &×@Ñ@ÓBˆØ×ÑÐ:Ô<Ø×ÑÐ3°NÐCWÑ4XÐY\Ð3]Ð]`ÐaÔbØ×ÑÐ0°Ð@QÑ1RÐSVÐ0WÐWZÐ[Ô\Ø×ÑÐ2°>ÐBUÑ3VÐWZÐ2[Ð[^Ð_Ô`Ø×ÑÐ1°.ÐASÑ2TÐUXÐ1YÐY\Ð]Ô^à˜-Ò(Ø× Ñ Ð#3Ô5Ø(¨Ô7�Ø×$Ñ$ t¨F¨8°2Ð%6Õ7ð 8ð ˜-Ò(Ø× Ñ Ð#3Ô5Ø(¨Ô7�Ø×$Ñ$ t¨F¨8°2Ð%6Õ7ð 8ð Ð.Ò/Ø× Ñ Ð#:Ô<Ø(Ð)=Ô>�Ø×$Ñ$ t¨F¨8°2Ð%6Õ7ð ?ð Ð,Ò-Ø× Ñ Ð#8Ô:Ø(Ð);Ô<�Ø×$Ñ$ t¨F¨8°2Ð%6Õ7ð =ð ˜.Ò)Ø× Ñ Ð#4Ô6Ø(¨Ô8�Ø×$Ñ$ t¨F¨8°2Ð%6Õ7ð 9ð ˜/Ò*Ø× Ñ Ð#?ÔAØ(¨Ô9�Ø×$Ñ$ t¨F¨8°2Ð%6Õ7ð :ð 	×ÑÐ1Ô2Ø×ÑÐ_Ô`Ø×Ñ˜]Ô+àˆØ#'×#;Ñ#;¸JÑ#G×#MÑ#MÖ#OÑˆH�iÚØ×$Ñ$ r¨(¯.©.Ó*:Ð);¸3Ð%?Ô@Û#�BØ!×(Ñ(¨6°"°°R¨Ô9Ø# qÑ(‘Oñ $ð $Pð 	×ÑÐ<¸_Ð<MÈRÐPÔQØ×ÑÐtÔuà�w‰w�}Ó%Ð%r    c                 ó0   — d}t        j                  |«      S )z>Create personalized workout prompt with focus area integrationa…  You are an expert fitness trainer creating a 7-day personalized workout plan.

        {personalized_context}

        CRITICAL RULES - MUST FOLLOW EXACTLY:
        - You MUST use EXACT exercise names from the available exercises database above
        - Do NOT invent or create new exercise names
        - Only use exercises listed in the available exercises section
        - If an exercise category has limited options, use what's available
        - PRIORITIZE exercises that target the user's focus areas when specified
        - Apply all modifiers (intensity, volume, calorie, recovery) to create appropriate workouts
        - Respect the user's workout level preference (Easy To Start, Break A Light Sweat, Challenging)
        - Align workouts with the user's main goal (Lose Weight, Gain Muscle, Stay Fit)

        Create a workout plan in this EXACT JSON format:
        {{
        "Monday": {{
            "title": "Workout Title Based on Available Exercises and User Goals",
            "category": "Category from Available Exercises",
            "intensity": "Low/Medium/High (based on workout level and modifiers)",
            "duration": "XX Min",
            "total_calories": "XXX",
            "warmup": [
            {{"name": "EXACT_EXERCISE_NAME_FROM_DATABASE", "duration": "XX Min", "sets": "X Sets", "calories": "XX"}},
            {{"name": "EXACT_EXERCISE_NAME_FROM_DATABASE", "duration": "XX Min", "sets": "X Sets", "calories": "XX"}}
            ],
            "main": [
            {{"name": "EXACT_EXERCISE_NAME_FROM_DATABASE", "duration": "XX Min", "sets": "X Sets", "calories": "XX"}},
            {{"name": "EXACT_EXERCISE_NAME_FROM_DATABASE", "duration": "XX Min", "sets": "X Sets", "calories": "XX"}},
            {{"name": "EXACT_EXERCISE_NAME_FROM_DATABASE", "duration": "XX Min", "sets": "X Sets", "calories": "XX"}}
            ],
            "cooldown": [
            {{"name": "EXACT_EXERCISE_NAME_FROM_DATABASE", "duration": "XX Min", "sets": "X Sets", "calories": "XX"}},
            {{"name": "EXACT_EXERCISE_NAME_FROM_DATABASE", "duration": "XX Min", "sets": "X Sets", "calories": "XX"}}
            ]
        }},
        "Tuesday": {{ ... }},
        ... for all 7 days
        }}

        REQUIREMENTS:
        - Use ONLY exercises from the available database - this is mandatory
        - Adapt intensity based on age, BMI, body shape, and activity level factors
        - Include exercises targeting the user's focus areas (if specified) in main workouts
        - Apply calorie modifiers for realistic calorie calculations based on goal
        - Apply volume modifiers to set counts and exercise selection
        - Vary workout categories across the week for balanced training
        - Format durations as "XX Min"
        - Format sets as "X Sets"
        - Calculate realistic calories using the calorie modifier

        Generate the complete 7-day plan using ONLY the available exercises:)r	   Úfrom_template)rN   Útemplates     r!   Úcreate_personalized_promptz*WorkoutDatabase.create_personalized_promptÐ  s   € ð3Pˆôj "×/Ñ/°Ó9Ð9r    c                   ó    — e Zd ZdZdedefd„Zy)ú'WorkoutDatabase.WorkoutPlanOutputParserzParse LLM outputr¢   rH   c                 óæ   — 	 t        j                  d|«      }|r$t        j                  |j	                  d«      «      S t        d«      ‚# t        j                  $ r}t        d|› �«       ‚ d }~ww xY w)Nz\{[\s\S]*\}r   zNo JSON foundzJSON error: )rÊ   rË   ÚjsonÚloadsrÌ   Ú
ValueErrorÚJSONDecodeErrorrÇ   )rN   r¢   Ú
json_matchrÒ   s       r!   Úparsez-WorkoutDatabase.WorkoutPlanOutputParser.parse  sg   € ðÜŸY™Y ~°tÓ<�
ÙÜŸ:™: j×&6Ñ&6°qÓ&9Ó:Ð:Ü  Ó1Ð1øÜ×'Ñ'ò Ü˜ Q CÐ(Ô)Øûðús   ‚;A	 ¾A	 Á	A0ÁA+Á+A0N)r   r   r   r   r   r   r  r   r    r!   ÚWorkoutPlanOutputParserr  
  s   „ Ùð	˜cð 	 dô 	r    r  c                 óÊ   — t        ddt        j                  d«      ¬«      | _        t        ddt        j                  d«      ¬«      | _        | j                  | j                  fS )zInitialize LLM instanceszgpt-4o-minir   ÚOPENAI_API_KEY)ÚmodelÚtemperatureÚopenai_api_keyg333333Ó?)r   rè   Úgetenvr•   r–   rb   s    r!   Úinitialize_llmszWorkoutDatabase.initialize_llms  s\   € ô ØØÜŸ9™9Ð%5Ó6ô
ˆŒô
 )ØØÜŸ9™9Ð%5Ó6ô
ˆÔð
 �x‰x˜×,Ñ,Ð,Ð,r    N)Úworkout)r   r   r   r   r—   r   r   r   rß   rø   rC   r  r	   r  r
   r  r  r   r    r!   r‘   r‘   í   s‚   „ ÙAò#ð
A'¸cð A'ÀdÈ3ÐPTÐUXÐZ^Ð_bÑZcÐUcÑPdÐKdÑFeó A'ñF2(°3ó 2(ðha&¸ð a&Èó a&ðH8:Ð,>ó 8:ôtÐ"2ô ó-r    r‘   Úduration_strrH   c                 ój   — t        j                  d| «      }|rt        |j                  d«      «      S dS )z6Parse duration string like '10 Min' to integer minutesú(\d+)rL   r   ©rÊ   rË   r?   rÌ   )r  Úmatchs     r!   Úparse_duration_to_minutesr  (  ó,   € ä�I‰I�h Ó-€EÙ"'Œ3ˆu�{‰{˜1‹~ÓÐ.¨QÐ.r    Úcalories_strc                 ój   — t        j                  d| «      }|rt        |j                  d«      «      S dS )z4Parse calories string like '120 Calories' to integerr  rL   r   r  )r   r  s     r!   Úparse_caloriesr"  -  r  r    r2   c                 óŠ   — | j                  «       j                  «       } | j                  d«      d   j                  d«      d   S )z6Normalize blood type to uppercase and handle +/- signsÚ+r   rÂ   )rÉ   rý   Úsplit)r2   s    r!   Únormalize_blood_typer&  2  s?   € à×!Ñ!Ó#×)Ñ)Ó+€JØ×Ñ˜CÓ  Ñ#×)Ñ)¨#Ó.¨qÑ1Ð1r    )!r   rè   r
  rÊ   Útypingr   r   r   r   r   ÚpymupdfrÄ   Úlangchain_openair   Úlangchain.promptsr	   Úlangchain.schemar
   Úpydanticr   r   Údotenvr   r   r#   r0   rC   r‘   r   r?   r  r"  r&  r   r    r!   Ú<module>r.     s¶   ðñó 
Û Û 	ß ,Ó ,Ý Û Ý 'Ý 0Ý -ß %Ý ñ „ôl�ô lô
j�9ô 
jôM�9ô Mô&l�)ô l÷`w-ñ w-ðv	/¨Cð /°Có /ð
/ ð /¨ó /ð
2 Sð 2¨Sô 2r    