
    ,i                     P    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	  G d d      Z
y)    )AnyDictListUnion)HTTPExceptionN)VesselFilterc            	       V    e Zd Zd Zdedeeeeee   f   f   fdZ	de
deeef   fdZy)VesselServicec                      d| _         d| _        y )Nz>https://cms.marinerskills.com/api/get-seafarer-based-on-vesselFslKvipEQ3hT2PfdZla00hp)seafarer_api_urlseafarer_security_key)selfs    4/var/www/html/beaconod-api/app/api/vessel/service.py__init__zVesselService.__init__   s    _t$=t!    	vessel_idreturnc                 x   	 t        |      | j                  d}t        j                  | j                  |d      }|j                          |j                         }t        |t              r|}n%t        |t              r
d|v r|d   }nt        d      |D cg c]%  }|j                  d      s|j                  d      ' }}|st        dd	      |t        t        |            d
S c c}w # t        j                  $ r}t        dd| 	      d }~wt         $ r}t        dt        |      	      d }~ww xY w)NVesselIDSecurityKey
   jsontimeoutdatazUnexpected API formatRole  No roles found for this vesselstatus_codedetail)vesselIdroles  zExternal API error:   )strr   requestspostr   raise_for_statusr   
isinstancelistdict
ValueErrorgetr   sortedsetRequestException	Exception)	r   r   payloadresponser   	seafarerssr%   es	            r   get_roles_by_vesselz!VesselService.get_roles_by_vessel
   s   	@#&y>$B\B\]G}}T%:%:RTUH%%'==?D$% 	D$'FdN L	 !899,5GIqvQUU6]IEG#<\]] )F3u:4FGG	 H
 (( 	TC:Nqc8RSS 	@CA??	@s<   BC/ C*/C*'C/ *C/ /D9DD9D44D9filtersc                    |j                   }ddlm}  ||       }	 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
      	 |j!                  |      }|j                  dg       }|st        dd
      |D cg c]  t#        fd|
D              r }}|st        dd| 
      i }|D ]"  }|j                  dd      }|j                  dd      }|j                  dd      }|j                  d|j                  dd            }||vri i d||<   |j                  dg       D ]G  }||
v s||   d   j%                  |g        |||   d   |   vs.||   d   |   j'                  |       I |||   d   vri ||   d   |<   ||   d   |   j%                  |g        |||   d   |   |   vs||   d   |   |   j'                  |       % d d!| ||d"S c c}	w # t
        j                  $ r}t        dd| 
      d }~ww xY wc c}w )#Nr   )CourseService)vessel_servicer   r   r   r   r'   z Unexpected API response format: r!   r   r   r    r&   zError contacting seafarer API: )r   matched_courseszNo course data availablec              3   F   K   | ]  }|j                  d g       v   yw)r%   N)r0   ).0rolecs     r   	<genexpr>zGVesselService.get_roles_functional_areas_and_courses.<locals>.<genexpr>G   s"     G,$4155"--,s   !zNo courses found for vessel serieszUnknown Seriesfunctional_areaUncategorizedcategory_namecms_course_name
lms_coursezUnnamed Course)r%   functional_areasr%   rK   1z&Roles and functional areas for vessel )statusmessager$   r   )r$   app.api.course.servicer=   r(   r   r)   r*   r   r+   r   r,   r-   r.   r   r0   r3   sync_full_course_listany
setdefaultappend)r   r;   r   r=   course_servicer5   r6   r   r7   r8   vessel_rolesr9   	full_datar?   rC   vessel_coursesresult_datacourserE   	func_arearH   course_namerB   s                 `        r   &get_roles_functional_areas_and_coursesz4VesselService.get_roles_functional_areas_and_courses#   sA   $$	8&d;	_#&y>$B\B\]G}}T%:%:RTUH%%'==?D$% 	D$'FdNz$v,X\?] L	#>^_c^d<eff3<N9afAEE&M9LN#<\]]   #8898M	#--(92>C8RSS '
&!G,GG  	 

 C:VW`Va8bcc $FZZ*:;F

#4oFI"JJHM **%6

<Qa8bcK[((*'F# 

7B/<''0;;D"E"+f*=g*Ft*LL#F+G4T:AA+N	 0 K$78J$KKIKF#$67F  23MBMMiY[\+f"56H"I-"XYb"ccF#$67FyQXXYde5 %< ?	{K!	
 	
o O (( 	_C:YZ[Y\8]^^	_
s6   B.J* J%#J%6J*  K%J* *K=KKN)__name__
__module____qualname__r   intr   r(   r   r   r:   r   r   r\    r   r   r
   r
      sU    >@S @T#uS$s)^?T:T5U @2O
l O
tTWY\T\~ O
r   r
   )typingr   r   r   r   fastapir   r)   app.api.vessel.schemasr   r
   ra   r   r   <module>re      s     ) ) !  /m
 m
r   