
    ?1j                     b   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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          	 	 	 	 	 	 	 	 	 d9d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 d+e fd,Z%e                    d-          d.             Z&e                    d/          d0             Z'e                    d1          d2             Z(e                    d3          d4             Z)e*d5k    r ej+        ed6d78           dS dS ):    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.png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     backend/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   9   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   @   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   b   s       ~##%G%(C0N0N0TRT,U,U%V%VM""	;	&	&)G%&M""	>	)	)"%(Cq0Q0Q,R,RUZ,Z%[%[M"#y{{K'.;Pklllr(   suffix
cache_pathc                    	 t          j        dt           dddid          }|                                 |                                D ]}|                    dg           D ]}|d                             |           rt          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	/releasesAcceptzapplication/vnd.github+jsonr.   )headersr0   assetsnamebrowser_download_url   )r0   r1   zDownloaded z from release tag_namez: z byteszFailed to fetch latest )requestsrR   GITHUB_REPOraise_for_statusjsonendswithr7   r9   contentr;   r5   r:   )rT   rU   rreleaseassetasset_rr=   r>   s           r)   fetch_latest_assetrh   s   s   7LBKBBB<=
 
 

 	
vvxx 	& 	&G Xr22 & &=))&11 &&l51G+HRTUUUG,,...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   B?D3 C(D3 (C,,D3 /C,0?D3 0D3 3
E=E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.fbazapplication/octet-streamfilename
media_type)rh   	FBA_CACHEospathexists
STATIC_FBAr   r   rq   s    r)   download_fbaru      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.apkrk   zNo HevyBridge APK availablezhevy-bridge.apkz'application/vnd.android.package-archiverl   )rh   	APK_CACHErp   rq   rr   
STATIC_APKr   r   rt   s    r)   download_apkrz      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 )Nrk   zHandoff not foundzhandoff-report.mdztext/markdownrl   )rp   rq   rr   HANDOFF_PATHr   r   r'   r(   r)   download_handoffr~      sC      7>>,'' 6C!4555/B____r(   /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   ri   rv   r{   )servicemodegym_path	endpointsr'   r'   r(   r)   rootr      s2       ,+Z C  C  C	  r(   __main__z0.0.0.0i   )hostport)	r   r   rE   rE   r   r   rE   r   r   ),rp   r2   rB   typingr   r   r^   uvicornfastapir   r   fastapi.middleware.corsr   fastapi.responsesr   pydanticr	   appadd_middlewarer_   ro   rx   rs   ry   r}   r8   rC   r   boolr?   rR   rD   strr&   rI   postrS   rh   ru   rz   r~   r   r"   r3   r'   r(   r)   <module>r      sq   				      $ $ $ $ $ $ $ $   * * * * * * * * 2 2 2 2 2 2 * * * * * *      gii   >#se\_[`  a a a6,	)	+
#
'& '#          I      

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