
    ~h                     l    d dl 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
mZ d dlmZmZ  G d d      Zy)	    )AnyDictList)HTTPExceptionN)sync_full_course_list)FunctionalSeriesFilterRoleSeriesFilter)vessels	seafarersc                   p    e Zd Zd ZdefdZdedeeef   fdZ	defdZ
deeef   fdZdeeef   fdZy	)
HtmlServicec                      d| _         d| _        y )Nz>https://cms.marinerskills.com/api/get-seafarer-based-on-vesselFslKvipEQ3hT2PfdZla00hp)seafarer_api_urlseafarer_security_key)selfs    7/var/www/html/beaconod-api/app/api/htmlfiles/service.py__init__zHtmlService.__init__   s     `%>"    	vessel_idc                 ^   	 t        |      | j                  d}t        j                  | j                  |d      }|j                          |j                         }t        |t              r|}n=t        |t              rd|v rt        |d   t              r|d   }nt        dd|       |D cg c]%  }|j                  d      s|j                  d      ' }}|st        d	d
      t        t        |            S c c}w # t        j                  $ r}t        dd|       d }~ww xY w)N)VesselIDSecurityKey
   )jsontimeoutdatai  z Unexpected API response format: status_codedetailRole  zNo roles found for this vesseli  zExternal API error: )strr   requestspostr   raise_for_statusr   
isinstancelistdictr   getsortedsetRequestException)	r   r   payloadresponser   r   svessel_roleses	            r   _get_roles_from_apizHtmlService._get_roles_from_api   s   	T#&y>$B\B\]G}}T%:%:RTUH%%'==?D$% 	D$'FdNz$v,X\?] L	#>^_c^d<eff3<N9afAEE&M9LN#<\]]#l+,,	 O (( 	TC:Nqc8RSS	Ts0   B.D 0C?C?$D ?D D,D''D,returnc                 Z   | j                  |      }t               }|j                  dg       }|D cg c]  t        fd|D              r }}|st	        dd      t               t               dt               t               dd}|D ]  }|j                  d      xs d	j                         j                         }	|j                  d
      xs dj                         }
|j                  dg       }d|	v rd}nd|	v sd|	v rd}nd}|D ]5  }||v s||   d   j                  |       ||   d   j                  |
       7  |j                         D ci c]5  \  }}|t        t        |d               t        t        |d               d7 }}}dd| ||dS c c}w c c}}w )Nmatched_coursesc              3   F   K   | ]  }|j                  d g       v   ywrolesNr*   .0rolecs     r   	<genexpr>zDHtmlService.get_series_functional_areas_by_vessel.<locals>.<genexpr>5   "     G,$4155"--,   !r"   zNo matching courses foundr   )r9   functional_areas)	eLearningVideo Seriesseries functional_areaUncategorizedr9   videorD   	elearningz
e-learningrC   rB   1z&Roles and functional areas for vessel )statusmessagevesselIdr   )r3   r   r*   anyr   r,   striploweradditemsr+   r(   )r   r   r1   	full_datar6   r>   filtered_coursesr   course
raw_seriesrG   r9   
series_keyr=   keyvaluesresponse_datas        `           r   %get_series_functional_areas_by_vesselz1HtmlService.get_series_functional_areas_by_vessel-   s   //	:)+	#--(92> '
&!G,GG  	 

  C8STT $'5ceD&)eG

 'F **X.4";;=CCEJ%zz*;<OVVXOJJw+E*$+

*lj.H(
,
<'$W-11$7$%78<<_M  ',  $zz|

  ,V	 VG_ 56$*47I0J+K$L   , 	 
 ?	{K!!	
 	
M
<
s   F":F'c                     | j                  |      }|d   }t               }t        |j                               }|D ]   }||   d   D ]  }|j	                  |        " |t        t        |            t        |      dS )Nr   r9   )rN   r9   rE   )r\   r,   r(   keysrR   r+   )r   r   vessel_datar   r9   rE   rY   rs           r   get_default_request_bodyz$HtmlService.get_default_request_bodyc   s}    @@K6"diik"C#Yw'		! ( 
 "DK(Vn
 	
r   c                 l   |j                   }|j                  xs g D cg c]  }|j                          }}|j                  xs g D cg c]  }|j                          }}|r|sQ| j	                  |      }|d   D cg c]  }|j                          }}|d   D cg c]  }|j                          }}| j                  |      D cg c]  }|j                          }}|D cg c]	  }||vs| }	}|	rt        dd|	       t               }
|
j                  dg       }|D cg c]:  t        fd|D              r$j                  dd      j                         |v r< }}|st        dd	      d
d| d|||t        |      |dS c c}w c c}w c c}w c c}w c c}w c c}w c c}w )Nr9   rE   r"   zInvalid roles: r   r6   c              3      K   | ]4  }|j                  d g       D cg c]  }|j                          c}v  6 yc c}w wr8   )r*   rQ   )r<   r`   crr>   s      r   r?   z=HtmlService.get_courses_by_role_and_series.<locals>.<genexpr>   s<     Q5a1aeeGR.@A.@.@AA5As   A=ArF   z+No courses found for these roles and seriesrK   Courses for vessel z (roles & series filter))rL   rM   rN   r9   rE   total_coursescourses)rN   r9   rQ   rE   ra   r3   r   r   r*   rO   len)r   filtersr   r`   r9   r0   series_listdefaultsr1   invalid_rolesrT   r6   r>   rU   s               ` r   get_courses_by_role_and_seriesz*HtmlService.get_courses_by_role_and_seriesw   s   $$	$+MM$7R$78$7q$78*1..*>B*>?*>Qqwwy*>? K44Y?H(0(9:(91QWWY(9E:.6x.@A.@1779.@KA+/+C+CI+NO+Na	+NO$)CEqQl-BECC/-8YZZ)+	#--(92> '
&!Q5QQh#))+{:  	 
  C:egg ,YK7OP!! !12'
 	
5 9?
 ;AOC
s/   FF F F"F')	F,3F,,?F1c                    |j                   }|j                  xs g D cg c]  }|j                          }}|j                  xs g D cg c]  }|j                          }}|r|st| j	                  |      }|d   }|j                         D cg c]  }|j                          }}|D ].  }	||	   d   D ]!  }
|j                  |
j                                # 0 | j                  |      }t               }|j                  dg       }|D cg c]  t        fd|D              r }}|D cg c]K  }|j                  d      xs dj                         |v r$|j                  dd      j                         |v r|M }}|st        d	d
      dd| d|||t        |      |dS c c}w c c}w c c}w c c}w c c}w )Nr   rB   r6   c              3   F   K   | ]  }|j                  d g       v   ywr8   r:   r;   s     r   r?   zCHtmlService.get_courses_by_functional_and_series.<locals>.<genexpr>   r@   rA   rG   uncategorizedrE   rF   r"   z"No courses found for these filtersr   rK   re   z" (functional area & series filter))rL   rM   rN   rB   rE   rf   rg   )rN   rB   rQ   rE   r\   r^   appendr3   r   r*   rO   r   rh   )r   ri   r   frB   r0   rj   r_   r   rY   far1   rT   r6   r>   filtered_by_rolesrU   s                 `  r   $get_courses_by_functional_and_seriesz0HtmlService.get_courses_by_functional_and_series   s   $$	/6/G/G/M2/MN/M!AGGI/MN*1..*>B*>?*>Qqwwy*>?  {DDYOKv&D.2iik:k1779kK:s)$67B$++BHHJ7 8  //	:)+	#--(92> '
&!G,GG  	 
 )
(!'(;OBBDHXXh#))+{: ( 	 
  C8\]] ,YK7YZ! 0! !12'
 	
= O? ;


s   F)F.F3F81AF=N)__name__
__module____qualname__r   intr3   r   r#   r   r\   ra   rm   ru    r   r   r   r      sg    ?TS T41
s 1
tCQTH~ 1
l
# 
($
c3h $
R(
tCH~ (
r   r   )typingr   r   r   fastapir   r$   app.api.course.routerr   app.api.vessel.schemasr   r	   app.utils.common_utilsr
   r   r   rz   r   r   <module>r      s(    " " !  8 K 4}
 }
r   