
    gj                        d dl Z d dlZd dlZd dlmZmZ d dlZd dlZd dlm	Z	m
Z
 d dlmZ d dlmZ d dlmZ  e	            Ze                    edgdgdg           d	Zd
ZdZdZdZdZdZdZdZddd d ddd dd ej                    ddZ G d de          ZdefdZe                     d          d             Z!e                     d          	 	 	 	 	 	 	 	 	 dAde"d e"d!e#d"e#d#e"d$e"d%e#d&e"d'e"fd(            Z$e%                    d)          d*efd+            Z&de'fd,Z(d-e"d.e"fd/Z)e                     d0          d1             Z*e                     d2          d3             Z+e                     d4          d5             Z,e                     d6          d7             Z-e                     d8          d9e"fd:            Z.e                     d;          d<             Z/e0d=k    r ej1        ed>d?@           dS dS )B    N)LiteralOptional)FastAPIHTTPException)CORSMiddleware)FileResponse)	BaseModel*)allow_originsallow_methodsallow_headersz&ignaciolagosruiz/hevy-sense2-companionz/tmp/hevy-companion-latest.fbaz/tmp/hevy-bridge-latest.apkz/tmp/hevy-companion-v0.1.fbaz/tmp/hevy-bridge.apkz/tmp/handoff-report.mdz/tmp/hevy-live.pngz/home/ubuntu/hevy-artifacts/gamz*/home/ubuntu/hevy-artifacts/gam-assets.zipidlezStart workout in Hevy zcloud-debug-backend)phaseexercise
setCurrentsetTotalweightrepsrestSecondsdurationvolume	timestampsourcec                   @    e Zd ZU ed         ed<   dZee         ed<   dS )ActionPayload)set_done	skip_resttimer_adjustactionNdelta)__name__
__module____qualname__r   __annotations__r!   r   int     	server.pyr   r   )   s8         ;<<<<E8C=r(   r   returnc                  f   	 t          j        g ddd          } | j        dk    rat          | j                  dk    rIt          t          d          5 }|                    | j                   ddd           n# 1 swxY w Y   dS n)# t          $ r}t          d	|            Y d}~nd}~ww xY wd
S )zRCloud/debug path only. Production gym path uses phone-bridge AccessibilityService.)adbzexec-out	screencapz-pT
   )capture_outputtimeoutr   i  wbNzScreenshot error: F)

subprocessrun
returncodelenstdoutopenSCREENSHOT_PATHwrite	Exceptionprint)resultfes      r)   take_screenshotr?   .   s   ( F F FW[eghhh!!c&-&8&84&?&?ot,, '&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' '4 ( ( (&1&&''''''''(5s<   AB A:.B :A>>B A>B 
B.B))B./api/hevy/livec                  f   K   t                       t          j                    t          d<   t          S )Nr   )r?   time_last_stater'   r(   r)   	hevy_liverD   ;   s(      #y{{Kr(   z/api/hevy/updater   r   r   r   r   r   r   r   r   c	                 @  K   | r
| t           d<   |r
|t           d<   |dk    r
|t           d<   |dk    r
|t           d<   |r
|t           d<   |r
|t           d<   |dk    r
|t           d<   |r
|t           d	<   |r
|t           d
<   t          j                    t           d<   dt           dS )Nr   r   r   r   r   r   r   r   r   r   r   T)okstate)rC   rB   )	r   r   r   r   r   r   r   r   r   s	            r)   hevy_updaterI   B   s        %$G +"*JQ$.L!1}}"*J ' &H #"Fa%0M" +"*J ' &H#y{{K---r(   /api/hevy/actionpayloadc           	        K   | j         dk    rJdt          d<   t          dt          t                              d          pd                    t          d<   nu| j         dk    rdt          d<   d	t          d<   nU| j         d
k    rJ| j        pd	}t          d	t          t                              dd	                    |z             t          d<   t          j                    t          d<   d| j         t          ddS )zORemote debug fallback. Real gym actions are handled by phone-bridge local HTTP.r   restr      r   Z   r   r   r   r   r   Tzcloud debug fallback only)rG   r    rH   note)r    rC   maxr&   getr!   rB   )rK   r!   s     r)   hevy_actionrS   d   s       ~##%G%(C0N0N0TRT,U,U%V%VM""	;	&	&)G%&M""	>	)	)"%(Cq0Q0Q,R,RUZ,Z%[%[M"#y{{K'.;Pklllr(   c                      ddi} t           j                            d          pt           j                            d          }|rd| | d<   | S )NAcceptzapplication/vnd.github+jsonGITHUB_TOKENGH_TOKENzBearer Authorization)osenvironrR   )headerstokens     r)   github_headersr]   u   sR    67GJNN>**HbjnnZ.H.HE 5#4U#4#4 Nr(   suffix
cache_pathc                    	 t                      }t          j        dt           d|d          }|                                 |                                D ]}|                    dg           D ]}|d                             |           rt          |          }d|d<   t          j        |d	         |d
          }|                                 t          |d          5 }|	                    |j
                   d d d            n# 1 swxY w Y   t          d|d          d|d          dt          |j
                   d           |c c S n,# t          $ r}	t          d|  d|	            Y d }	~	nd }	~	ww xY wd S )Nzhttps://api.github.com/repos/z	/releasesr.   )r[   r0   assetsnameapplication/octet-streamrU   url   r1   zDownloaded z from release tag_namez: z byteszFailed to fetch latest )r]   requestsrR   GITHUB_REPOraise_for_statusjsonendswithdictr7   r9   contentr;   r5   r:   )
r^   r_   r[   rreleaseassetasset_headersasset_rr=   r>   s
             r)   fetch_latest_assetrs   }   s   7 ""LBKBBB
 
 

 	
vvxx 
	& 
	&G Xr22 	& 	&=))&11 &$(MMM.HM(+&l5<XZ[[[G,,...j$// 110001 1 1 1 1 1 1 1 1 1 1 1 1 1 1xfxxWZEXxx\_`g`o\p\pxxxyyy%%%%%%&	&
	&  7 7 7555!556666666674sB   C E "D	=E 	DE D?E E 
E=E88E=/download/app.fbac                    K   t          dt                    pt          } t          j                            |           st
          } t          j                            |           st          dd          t          | dd          S )Nz.fba  zNo .fba availablezhevy-companion.fbarc   filename
media_type)rs   	FBA_CACHErY   pathexists
STATIC_FBAr   r   r{   s    r)   download_fbar      ss      fi00=ID7>>$ 7>>$ 6C!4555';Hbccccr(   /download/hevy-bridge.apkc                    K   t          dt                    pt          } t          j                            |           st
          } t          j                            |           st          dd          t          | dd          S )Nz.apkrv   zNo HevyBridge APK availablezhevy-bridge.apkz'application/vnd.android.package-archiverw   )rs   	APK_CACHErY   r{   r|   
STATIC_APKr   r   r~   s    r)   download_apkr      st      fi00=ID7>>$ 7>>$ @C!>???'8Enoooor(   /download/handoffc                     K   t           j                            t                    st	          dd          t          t          dd          S )Nrv   zHandoff not foundzhandoff-report.mdztext/markdownrw   )rY   r{   r|   HANDOFF_PATHr   r   r'   r(   r)   download_handoffr      sC      7>>,'' 6C!4555/B____r(   /download/gam-assets.zipc                     K   t           j                            t                    st	          dd          t          t          dd          S )Nrv   zGAM assets zip not foundzhevy-companion-gam-assets.zipzapplication/ziprw   )rY   r{   r|   GAM_ASSETS_ZIPr   r   r'   r(   r)   download_gam_assets_zipr      sD      7>>.)) =C!;<<<1P]noooor(   /download/gam/{filename}rx   c                   K   h d}| |vrt          dd          t          j                            t          |           }t          j                            |          st          dd          t          || d          S )N>   icon-80.pngicon-160.pngicon-512.pngscreenshot-rest-336.pngscreenshot-active-336.pngrv   zGAM asset not foundzGAM asset missing on diskz	image/pngrw   )r   rY   r{   joinGAM_ASSET_DIRr|   r   )rx   allowedr{   s      r)   download_gam_assetr      s        G wC!67777<<x00D7>>$ >C!<===xKHHHHr(   /c                     K   dddg ddS )Nzhevy-companion-backendzcloud-debug-and-downloadszDFitbit companion -> http://127.0.0.1:18090 -> HevyBridge APK -> Hevy)r@   rJ   rt   r   r   r   r   )servicemodegym_path	endpointsr'   r'   r(   r)   rootr      s2       ,+Z {  {  {	  r(   __main__z0.0.0.0i   )hostport)	r   r   rE   rE   r   r   rE   r   r   )2rY   r2   rB   typingr   r   rg   uvicornfastapir   r   fastapi.middleware.corsr   fastapi.responsesr   pydanticr	   appadd_middlewarerh   rz   r   r}   r   r   r8   r   r   rC   r   boolr?   rR   rD   strr&   rI   postrS   rl   r]   rs   r   r   r   r   r   r   r"   r3   r'   r(   r)   <module>r      s   				      $ $ $ $ $ $ $ $   * * * * * * * * 2 2 2 2 2 2 * * * * * *      gii   >#se\_[`  a a a6,	)	+
#
'&1= '#          I      

 
 
 
 
 	   	. ... . 	.
 . . . . . . . .B 
m} m m m m     s     2 	d d d 	$%%p p &%p 	` ` ` 	#$$p p %$p 	#$$Is I I I %$I     zGK)$////// r(   