+
    kTj4                       R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t^ RI
Ht Rt]P                  P                  RR4      P                  4       R*9   t]! ]P                  P                  RR4      4      tR	R
RRRR/t^<t ! R R]4      tR R ltR R ltR R ltR+R R lltR R ltR R ltR R ltR R ltR  R! ltR" R# lt R$ R% lt!R& R' lt"]#R(8X  d"   ]$! ]PJ                  ! ]! 4       ^R)7      4       R# R# ),u^  
sync_module.py — Backup remoto Six Hype (Sprint M).

Sincroniza estado do Zustand do app pro Supabase schema six_hype.*
pra usuário poder trocar device e ter audit log de mudanças.

Entidades sincronizadas (todas com owner_user_id = user.id):
  - operators
  - personagens
  - campanhas (com atos JSONB inline)
  - generated_packs (com pack/briefing/themes JSONB inline)

Stack: urllib stdlib (consistente com catalogo_module + chatwoot_sender).
Variáveis de env esperadas:
  UNI_DATA_SUPABASE_URL          → ex https://abc.supabase.co
  UNI_DATA_SUPABASE_SERVICE_ROLE → service role key (write)

Pra ligar/desligar sem mexer em código:
  SIX_HYPE_SYNC_ENABLED=true (default false — sync exige consenso do owner)

Idempotente: usa PATCH-or-upsert via PostgREST `Prefer: resolution=merge-duplicates`
(equivalente a INSERT ... ON CONFLICT DO UPDATE).
)annotationsN)Anysix_hypeSIX_HYPE_SYNC_ENABLEDfalseSIX_HYPE_SYNC_TIMEOUT_SEC20	loaded_atg        url keyc                      ] tR t^+tRtR# )	SyncError N)__name__
__module____qualname____firstlineno____static_attributes__r       #/opt/apps/studio-api/sync_module.pyr   r   +   s    r   r   c                   V ^8  d   QhRR/# )   returnzdict[str, str]r   )formats   "r   __annotate__r   /   s       r   c                 8   \         P                   ! 4       p V \        R ,          ,
          \        8  d   \        R,          '       d   \        # \        P                  P                  R4      ;'       g*    \        P                  P                  R4      ;'       g    RP                  R4      p\        P                  P                  R4      ;'       g*    \        P                  P                  R4      ;'       g    Rp\        P                  R V RVRV/4       \        # )	r	   r
   UNI_DATA_SUPABASE_URLSUPABASE_URLr   /UNI_DATA_SUPABASE_SERVICE_ROLESUPABASE_SERVICE_ROLEr   )time
_CFG_CACHE_CFG_TTL_SECosenvirongetrstripupdate)nowr
   r   s      r   _configr+   /   s    
))+C
Z$$|3
58I8I


./ 	 	::>>.)	 	fSk	  	

78 	 	::>>12	 	 
 {CUC@Ar   c                   V ^8  d   QhRR/# )r   r   boolr   )r   s   "r   r   r   A   s     < <D <r   c                 x    \        4       p \        ;'       d$    \        V R ,          ;'       d
    V R,          4      # )r
   r   )r+   SYNC_ENABLEDr-   cfgs    r   
is_enabledr2   A   s,    
)C;;DU!:!:E
;;r   c                   V ^8  d   QhRR/# )r   r   dict[str, Any]r   )r   s   "r   r   r   F   s       r   c            	         \        4       p R \        4       R\        R\        V R,          ;'       d
    V R,          4      R\        /# )enabledschemaconfig_presentr
   r   env_flag)r+   r2   SCHEMAr-   r/   r0   s    r   statusr;   F   s>    
)C:<&$s5z88c%j9L	 r   c               0    V ^8  d   QhRRRRRRRRRR	R
R/# )r   methodstrpathbodyz
Any | Nonepreferz
str | Nonequeryzdict[str, str] | Noner   ztuple[int, Any]r   )r   s   "r   r   r   P   sD     '? '?'?
'? '? 	'?
 !'? '?r   c                   \        4       pVR ,          '       d   VR,          '       g   \        R4      hV'       d)   R\        P                  P	                  VRR7      ,           MRpVR ,           RV V 2pRVR,          R	R
VR,           2RRRRR\
        R\
        /pV'       d   W8R&   Ve&   \        P                  ! V4      P                  R4      MRp	\        P                  P                  WyWR7      p
 \        P                  P                  V
\        R7      ;_uu_ 4       pVP                  ^ 8w  d    VP                  4       P                  R4      MRpV'       d   \        P                   ! V4      MRpVP"                  V3uuRRR4       #   + '       g   i     R# ; i  \        P$                  P&                   db   pRp TP                  4       P                  RRR7      R,          pM  \(         d     Mi ; i\        RTP*                   RT RT 24      ThRp?i\        P$                  P,                   d"   p\        RT RTP.                   24      ThRp?ii ; i)r
   r   zCredenciais Supabase ausentes?,)safer   z	/rest/v1/apikeyAuthorizationzBearer zContent-Typezapplication/jsonAcceptzAccept-ProfilezContent-ProfilePreferNzutf-8)dataheadersr=   )timeoutignore)errors:Ni  NzHTTP  z: z	URLError )r+   r   urllibparse	urlencoder:   jsondumpsencoderequestRequesturlopenTIMEOUT_SEClengthreaddecodeloadsr;   error	HTTPError	ExceptioncodeURLErrorreason)r=   r?   r@   rA   rB   r1   qsr
   rL   rK   reqresprawpayloademsgs   &&&&&           r   _rest_requestrl   P   s    )Cu::SZZ788<A#&&u3&7
7rBZL	$t
,C#e*73u:,/*$&6G "/3/?4::d""7+TD
..
 
 
 
PC?^^##C#==151A$))+$$W-rC),djjo$G;;' >=== <<!! ?	&&(//'(/;DAC 		%xqb67Q><<   ?)D6AHH:67Q>?sr   6-F" #:F%F
F" F	F" F" "I H(G-,H-G;8H:G;;"H I >I ?II c               $    V ^8  d   QhRRRRRR/# )r   tabler>   rowslist[dict[str, Any]]r   intr   )r   s   "r   r   r   z   s"      3 2 s r   c                ~    V'       g   ^ # \        RV VRR7      w  r#VR9  d   \        RV  RV 24      h\        V4      # )z>Faz upsert idempotente via Prefer resolution=merge-duplicates.POSTz*resolution=merge-duplicates,return=minimal)r@   rA   zupsert 
 retornou )         )rl   r   len)rn   ro   rb   _s   &&  r   _upsertrz   z   sL    ;	GD ?"'%
4&9::t9r   c                    V ^8  d   QhRRRR/# )r   userr4   r   r>   r   )r   s   "r   r   r      s      > c r   c                T   RV R,          RV R,          RV P                  R4      RV P                  R4      R\        V P                  R4      ;'       g    V P                  R4      4      R\        P                  ! R\        P                  ! 4       4      /p\        R	V.4       V R,          # )
z-Garante registro em app_users e devolve o id.idemailnamerolebeta_access
betaAccesslast_sync_atz%Y-%m-%dT%H:%M:%SZ	app_users)r'   r-   r"   strftimegmtimerz   )r|   ri   s   & r   _ensure_app_userr      s     	d4jg  tDHH]3MMtxx7MN&:DKKMJG K'#:r   c               $    V ^8  d   QhRRRRRR/# )r   opr4   owner_idr>   r   r   )r   s   "r   r   r      s!       3 > r   c                2   R V R ,          RVRV R,          RV P                  R4      RV P                  R4      RV P                  R4      R\        V P                  R4      4      R	\        V P                  R
4      4      R\        V P                  RR4      4      /	# )r~   owner_user_idr   r   r   avatar_seed
avatarSeedis_ownerisOwneris_external
isExternalactiveTr'   r-   )r   r   s   &&r   _operator_to_rowr      s    bh6
vrvvl+D	*+tBFF<01$rvvh-.
 
r   c               $    V ^8  d   QhRRRRRR/# r   pr4   r   r>   r   r   )r   s   "r   r   r      s!      . C N r   c           #        R V R ,          RTRV R,          RV R,          RV R,          RV P                  R4      RV P                  R4      RV P                  R4      R	V P                  R
4      RV P                  R4      RV P                  R4      ;'       g    RRV P                  R4      ;'       g    . RV P                  R4      RV P                  R4      R\        V P                  RR4      4      /# )r~   r   nome	categoriapapel_narrativo_padraopapelNarrativoPadraocrmrqeespecialidadeinstagram_handleinstagramHandlefoto_urlfotoUrlconsent_imagem_untilconsentImagemUntilNprocedimentos_associadosprocedimentosAssociadostom_editorialtomEditorial
restricoesativoTr   r   r   s   &&r   _personagem_to_rowr      s    ag&	Q{^ !$:";quuU|quuU|/AEE"34AEE)$&: ; C Ct"AEE*C$D$J$J~.aeeL)aeeGT*+ r   c               $    V ^8  d   QhRRRRRR/# )r   cr4   r   r>   r   r   )r   s   "r   r   r      s!       # . r   c                   R V R ,          RTRV R,          RV P                  R4      RV P                  R4      RV P                  R4      R	V P                  R
4      RV P                  R4      RV P                  RR4      RV P                  R4      ;'       g    RRV P                  R4      ;'       g    RRV P                  R4      RV P                  R4      ;'       g    . /# )r~   r   r   big_ideabigIdea
profile_id	profileId
product_id	productIdproduct_nameproductNamepersonagem_principal_idpersonagemPrincipalIdr;   rascunhodata_inicio
dataInicioNdata_fimdataFim	objectiveatosr'   )r   r   s   &&r   _campanha_to_rowr      s    ag&	AEE)$aeeK(aeeK(m,!155)@#A!%%*-quu\*22dAEE)$,,QUU;'f## r   c               $    V ^8  d   QhRRRRRR/# r   r   )r   s   "r   r   r      s!      N c n r   c                   R V R ,          RTRV R,          RV P                  R4      RV P                  R4      RV P                  R4      RV P                  R4      R	V P                  R
4      RV P                  R4      ;'       g    . RV P                  R4      ;'       g    . RV P                  R4      ;'       g    RRV P                  R4      RV P                  R4      RV P                  R4      /# )r~   r   dateweekyearr   r   profile_nameprofileNamebriefing_focusbriefingFocusthemespackbriefingNcampanha_id
campanhaIdato_idatoIdetapa_funil
etapaFunilr   r   s   &&r   _pack_to_rowr      s    ag&	ffaeeK(m,!%%0!%%/''Rf##AEE*%--quu\*!%%.quu\* r   c               $    V ^8  d   QhRRRRRR/# )r   r|   r4   ri   r   r   )r   s   "r   r   r      s!     4: 4:~ 4: 4:> 4:r   c                ,   \        4       '       g   \        R4      h\        P                  ! 4       p\        V 4      p/ p\	        VP                  R4      \        4      '       d0   \        RVR,           Uu. uF  p\        WS4      NK  	  up4      VR&   \	        VP                  R4      \        4      '       d0   \        RVR,           Uu. uF  p\        Wc4      NK  	  up4      VR&   \	        VP                  R4      \        4      '       d0   \        RVR,           Uu. uF  p\        Ws4      NK  	  up4      VR&   \	        VP                  R4      \        4      '       d0   \        RVR,           Uu. uF  p\        Wc4      NK  	  up4      VR&   \        \        P                  ! 4       V,
          R,          4      p \        RR	VR
RR\        VP                  4       4      RVRRRV/.4       RVRV/# u upi u upi u upi u upi   \         d     L'i ; i)z
Faz upsert das entidades vindas do app.

user    = { id, email, name?, role?, betaAccess? }
payload = { operators?, personagens?, campanhas?, generatedPacks? }

Retorna {counts, duration_ms}.
z/sync desabilitado (SIX_HYPE_SYNC_ENABLED=false)	operatorspersonagens	campanhasgeneratedPacksgenerated_packs  sync_loguser_id	directionpushentitiescountsr;   okduration_ms)r2   r   r"   r   
isinstancer'   listrz   r   r   r   r   rq   keysra   )	r|   ri   startedr   r   or   r   r   s	   &&       r   r   r      s    <<IJJiikG%HF'++k*D11%4;K4HI4Hqa*4HI
{ '++m,d33 '6=m6LM6L,6LM!
} '++k*D11%4;K4HI4Hqa*4HI
{ '++./66$+078H0IJ0I1\!&0IJ%
 !
 tyy{W,45K

xV[[]+fd;
  	 fm[99C J
 N
 J
 K  s*   4G1
G6
G;
0H 
;0H HHc                    V ^8  d   QhRRRR/# )r   r|   r4   r   r   )r   s   "r   r   r     s     w w~ w. wr   c           &     r	  a \        4       '       g   \        R4      h\        P                  ! 4       pV R,          o\        V 4       R V3R llpV! R4      pV! R4      pV! R4      pV! R4      pRV Uu. uF  pRVR,          R	VR	,          R
VP	                  R
4      RVP	                  R4      RVP	                  R4      RVP	                  R4      RVP	                  R4      RVP	                  RR4      RVP	                  R4      /	NK  	  upRV Uu. uF  pRVR,          RVR,          RVR,          RVR,          RVP	                  R4      RVP	                  R4      RVP	                  R4      RVP	                  R4      RVP	                  R 4      R!VP	                  R"4      R#VP	                  R$4      ;'       g    . R%VP	                  R&4      R'VP	                  R'4      R(VP	                  R(R4      RVP	                  R4      /NK  	  upRV Uu. uF  pRVR,          RVR,          R)VP	                  R*4      R+VP	                  R,4      R-VP	                  R.4      R/VP	                  R04      R1VP	                  R24      R3VP	                  R3R44      R5VP	                  R64      R7VP	                  R84      R9VP	                  R94      R:VP	                  R:4      ;'       g    . RVP	                  R4      /NK  	  upR;V Uu. uF  pRVR,          R<VR<,          R=VP	                  R=4      R>VP	                  R>4      R+VP	                  R,4      R?VP	                  R@4      RAVP	                  RB4      RCVP	                  RC4      ;'       g    . RDVP	                  RD4      ;'       g    . REVP	                  RE4      RFVP	                  RG4      RHVP	                  RI4      RJVP	                  RK4      RLR/NK  	  up/p\        \        P                  ! 4       V,
          RM,          4      p	RNT	ROVP                  4        U
Uu/ uF)  w  r\        V\        4      '       g   K  V
\        V4      bK+  	  upp
/VRP&    \        RQRRSRSRTRU. RWOROVRP,          RO,          R3RVRNV	/.4       V# u upi u upi u upi u upi u upp
i   \         d     T# i ; i)Xuw   
Lê do Supabase as entidades do owner pra restaurar em outro device.
Retorna no formato Zustand-friendly (camelCase).
zsync desabilitador~   c                    V ^8  d   QhRRRR/# )r   rn   r>   r   rp   r   )r   s   "r   r   pull.<locals>.__annotate__%  s      C 0 r   c                z   < \        R V RRS 2RR/R7      w  rV^8w  d   \        RV  RV 24      hT;'       g    . # )GETr   zeq.select*)rB   zpull rt   )rl   r   )rn   rb   rK   r   s   &  r   _getpull.<locals>._get%  sU    ""c($4hD


 3;eE7*TF;<<zzrr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   T	createdAt
created_atr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r;   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   isGeneratedr   r   r   _metar   r   r   pullr   r   )r   r   r   r   )r2   r   r"   r   r'   rq   itemsr   r   rx   rz   ra   )r|   r   r   operators_rawpersonagens_rawcampanhas_raw	packs_rawrresultr   kvr   s   &           @r   r   r     s   
 <<+,,iikGDzHT  %M=)O%M&'I 	 #
 # ag&	fwaeeM2155,aeeM2!%%$/QUU<0
 #
 	$ %%
$ %! ag&	Q{^&*B(CquuU|quuU|!7!155);#<155,$aee,B&C)1551K+L+R+RPRo 6aeeL1w-QUU<0" %%
( 	  #!
  # ag&	155,QUU<0QUU<0quu^4'/H)I!%%*5aeeM2155,QUU;/f++QUU<0 #!
$ 	" #
"  ag&	ffQUU<0quu^4'7!8!%%///Rf++AEE*-aeeM2xaeeM2t  #
kHFT tyy{W,45K{O:a;N91c!f9OF7O


xTfWoh/d;
  	 Mw

(
$
0 P  MsT   4BRB'R
8AR
C	RR6BR;RAR*R!	R!")R' 'R65R6__main__)indent)true1yes)NNN)&__doc__
__future__r   rT   r%   r"   urllib.errorrQ   urllib.parseurllib.requesttypingr   r:   r&   r'   lowerr/   rq   rZ   r#   r$   ra   r   r+   r2   r;   rl   rz   r   r   r   r   r   r   r   r   printrU   r   r   r   <module>r     s   0 #  	     	zz~~5w?EEGK__"**..!<dCD3r5"5
		 	$<
'?T ($*4:nwt z	$**VXa
() r   