Ë
    ˆuOjš  ã                   óv  — d dl mZ d dlZd dlmZ d dlmZ d dlmZm	Z	 d dl
mZmZmZmZ d dlmZmZ d dlmZ d d	lmZ d d
lmZ  e	exs d«      Zdedz  dedz  fd„Zdedz  dedz  fd„Zdedefd„Z	 	 d,dededz  dedz  deeef   fd„Zdedededz  fd„Z dedededz  fd„Z!dededededz  fd„Z"dedefd„Z#dededz  fd„Z$defd„Z%ddœdedededed ed!ededz  defd"„Z&ddœdedededed ed!ededz  defd#„Z'dedefd$„Z(dedefd%„Z)	 	 d-d&eded'ed(edz  def
d)„Z*	 d.ded*ed(edz  defd+„Z+y)/é    ©ÚdeepcopyN)Ú	urlencode)ÚSession)ÚHudlCredentialsÚcanonical_hudl_login_url)Ú
HUDL_EMAILÚHUDL_LOGIN_URLÚHUDL_PASSWORDÚget_frontend_base_url)Údecrypt_secretÚencrypt_secret)ÚSessionLocal)Úcreate_token_pair)ÚAccountz,https://identity.hudl.com/u/login/identifierÚmetadataÚreturnc                 óf   — | sy t        | «      }|j                  d«      rt        |d   «      |d<   |S )NÚimap_password)r   Úgetr   )r   Ústoreds     úC/var/www/html/sergio/sergio-backend/app/services/account_service.pyÚ_encrypt_metadatar      s7   € ÙØÜ�hÓ€FØ‡z�z�/Ô"Ü"0°¸Ñ1HÓ"IˆˆÑØ€Mó    c                 ó4   — | sy t        | «      }d|v rd|d<   |S )Nr   z********r   )r   Úpublics     r   Ú_public_metadatar   !   s)   € ÙØÜ�hÓ€FØ˜&Ñ Ø",ˆˆÑØ€Mr   Úemailc                 óê   — | j                  «       j                  «       j                  dd«      }t        j                  dd|«      }t        j                  dd|«      j                  d«      }|xs ddd S )	zAStable slug from Hudl email (matches frontend Settings behavior).Ú@z-at-z
[^a-z0-9-]Ú-z-+zhudl-accountNéd   )ÚstripÚlowerÚreplaceÚreÚsub)r   Úslugs     r   Úaccount_id_from_emailr)   *   sd   € à�;‰;‹=×ÑÓ ×(Ñ(¨¨fÓ5€DÜ�6‰6�-  dÓ+€DÜ�6‰6�%˜˜dÓ#×)Ñ)¨#Ó.€DØÒ"�N D SÐ)Ð)r   Ú
hudl_emailÚ
account_idÚnamec                 óŒ   — | j                  «       }|xs t        |«      j                  «       }|xs |j                  «       }||fS ©N)r#   r)   )r*   r+   r,   r   Úresolved_idÚresolved_names         r   Úresolve_account_fieldsr1   2   sH   € ð
 ×ÑÓ€EØÒ=Ô!6°uÓ!=×DÑDÓF€KØ’]˜U×)Ñ)Ó+€MØ˜Ð%Ð%r   Údbc                 óˆ   — | j                  t        «      j                  t        j                  |k(  «      j	                  «       S r.   )Úqueryr   Úfilterr+   Úfirst)r2   r+   s     r   Úget_account_by_account_idr7   =   s0   € Ø�8‰8”GÓ×#Ñ#¤G×$6Ñ$6¸*Ñ$DÓE×KÑKÓMÐMr   c                 ó¤   — | j                  t        «      j                  t        j                  |j	                  «       k(  «      j                  «       S r.   )r4   r   r5   r*   r#   r6   )r2   r*   s     r   Úget_account_by_hudl_emailr9   A   s8   € à
�‰”Óß	‰”×"Ñ" j×&6Ñ&6Ó&8Ñ8Ó	9ß	‰‹ðr   Úpasswordc                 ó’   — t        | |«      }|r|j                  sy	 t        |j                  «      }||k7  ry|S # t        $ r Y yw xY w)zIAuthenticate against accounts table using hudl_email and stored password.N)r9   Ú	is_activer   Úhudl_password_encÚ
ValueError)r2   r   r:   ÚaccountÚstored_passwords        r   Úauthenticate_accountrA   I   sW   € ä'¨¨EÓ2€GÙ˜'×+Ò+ØðÜ(¨×)BÑ)BÓCˆð ˜(Ò"Øà€Nøô ò Ùðús   �: º	AÁAr?   c           
      ó0  — | j                   r| j                   j                  d«      ng }|r|d   nd}t        |«      dkD  rdj                  |dd  «      nd}t	        | j
                  «      | j                  | j                   xs d||dd| j                  ddœ	S )NÚ r   Ú é   ÚACCOUNTr?   )	Úidr   r,   Ú	firstNameÚlastNameÚbioÚroler+   Ú	auth_type)r,   ÚsplitÚlenÚjoinÚstrrG   r*   r+   )r?   Ú
name_partsÚ
first_nameÚ	last_names       r   Úaccount_auth_payloadrT   Z   s�   € Ø,3¯LªL�—‘×#Ñ# CÔ(¸b€JÙ",�˜A’°"€JÜ,/°
«O¸aÒ,?�—‘˜ A B˜Ô(ÀR€Iô �'—*‘*‹oØ×#Ñ#Ø—‘Ò" ØØØØØ×(Ñ(Øñ
ð 
r   c                 óö   — | j                  t        «      j                  t        j                  j	                  d«      «      j                  t        j                  j                  «       «      j                  «       S )NT)	r4   r   r5   r<   Úis_Úorder_byÚ
updated_atÚdescr6   )r2   s    r   Úget_active_accountrZ   l   sN   € à
�‰”Óß	‰”×!Ñ!×%Ñ% dÓ+Ó	,ß	‰”'×$Ñ$×)Ñ)Ó+Ó	,ß	‰‹ð	r   c                  óz  — t        «       } 	 t        | «      }|rGt        |j                  «      }t	        |j
                  ||j                  ¬«      | j                  «        S 	 | j                  «        t        r&t        r t        rt	        t        t        t        ¬«      S t        d«      ‚# | j                  «        w xY w)N)r   r:   Ú	login_urlzaNo Hudl credentials configured. Ingest an account via POST /api/v1/accounts or set HUDL_* in .env)r   rZ   r   r=   r   r*   Úhudl_login_urlÚcloser	   r   ÚDEFAULT_HUDL_LOGIN_URLr>   )r2   r?   r:   s      r   Úload_active_credentialsr`   u   s£   € Ü	‹€Bð
Ü$ RÓ(ˆÙÜ% g×&?Ñ&?Ó@ˆHÜ"Ø×(Ñ(Ø!Ø!×0Ñ0ôð 	�‰�
ð ð 	�‰Œ
å•mÕ(>ÜÜÜ"Ü,ô
ð 	
ô ð	Lóð øð 	�‰�
ús   ŒAB( Â(B:)r   Úhudl_passwordr]   c          	      ót  — t        |«      }t        |«      }| j                  t        «      j	                  t        j
                  j                  d«      «      j                  ddid¬«       t        |||t        |«      ||d¬«      }	| j                  |	«       | j                  «        | j                  |	«       |	S )z3Create a new account and mark it as the active one.Tr<   F©Úsynchronize_session)r+   r,   r*   r=   r]   Úmetadata_jsonr<   )r   r   r4   r   r5   r<   rV   Úupdater   ÚaddÚcommitÚrefresh)
r2   r+   r,   r*   ra   r]   r   r\   Úencrypted_metadatar?   s
             r   Úcreate_accountrk   �   sª   € ô )¨Ó8€IÜ*¨8Ó4Ðà‡H�HŒWÓ×ÑœW×.Ñ.×2Ñ2°4Ó8Ó9×@Ñ@Ø	�eÐØ!ð Aô ô
 ØØØÜ(¨Ó7Ø Ø(Øô€Gð ‡F�Fˆ7„OØ‡I�I„KØ‡J�JˆwÔØ€Nr   c          	      ó*  — t        | |«      }|st        | ||||||¬«      S t        |«      }t        |«      }	| j	                  t
        «      j                  t
        j                  j                  d«      t
        j                  |j                  k7  «      j                  ddid¬«       ||_        ||_        ||_        t        |«      |_        ||_        |	|_        d|_        | j%                  |«       | j'                  «        | j)                  |«       |S )zG
    Create or update an account by account_id and mark it active.
    )r+   r,   r*   ra   r]   r   Tr<   Frc   )r7   rk   r   r   r4   r   r5   r<   rV   rG   rf   r+   r,   r*   r   r=   r]   re   rg   rh   ri   )
r2   r+   r,   r*   ra   r]   r   Úexistingr\   rj   s
             r   Úupsert_accountrn   ²   s  € ô )¨¨ZÓ8€HÙÜØØ!ØØ!Ø'Ø)Øô
ð 	
ô )¨Ó8€IÜ*¨8Ó4Ðà‡H�HŒWÓ×ÑÜ×Ñ×Ñ˜dÓ#Ü�
‰
�h—k‘kÑ!ó÷ �fØ	�eÐØ!ð ô ð
 %€HÔØ€H„MØ$€HÔÜ!/°Ó!>€HÔØ'€HÔØ/€HÔØ€HÔà‡F�Fˆ8ÔØ‡I�I„KØ‡J�JˆxÔØ€Or   c                 óˆ   — | j                   | j                  | j                  | j                  t	        | j
                  «      dœS )N)rG   r+   r,   ÚHandshake_emailr   )rG   r+   r,   r*   r   re   ©r?   s    r   Úto_account_responserr   ä   s:   € à�j‰jØ×(Ñ(Ø—‘Ø"×-Ñ-Ü$ W×%:Ñ%:Ó;ñð r   c                 ó6   — | j                   | j                  ddœS )Nr?   )r+   r   rL   )rG   r*   rq   s    r   Ú_account_token_datart   î   s   € à—j‘jØ×#Ñ#Øñð r   Úaccess_tokenÚrefresh_tokenÚrequest_hostc                 óX   — t        |«      }|sy| |ddœ}|r||d<   |› dt        |«      › �S )NrD   z/admin/exchange)Útokenr   Úredirectrv   z/auth/access?)r   r   )ru   r   rv   rw   Úbase_urlÚparamss         r   Úbuild_frontend_access_urlr}   ö   sJ   € ô % \Ó2€HÙØàØØ%ñ€Fñ
 Ø"/ˆˆÑØˆZ�}¤Y¨vÓ%6Ð$7Ð8Ð8r   Úverificationc           	      óž   — t        t        | «      «      }|d   d   }|d   d   }i t        | «      ¥||t        || j                  ||¬«      dœ¥S )NÚaccessry   ri   )rv   rw   )r~   ÚtokensÚfrontend_url)r   rt   rr   r}   r*   )r?   r~   rw   r�   ru   rv   s         r   Úto_account_ingest_responserƒ   	  sn   € ô
 Ô2°7Ó;Ó<€FØ˜(Ñ# GÑ,€LØ˜9Ñ% gÑ.€Mð
Ü
˜gÓ
&ð
à$ØÜ1ØØ×ÑØ'Ø%ô	
ò	
ð 
r   )NN)rD   Nr.   ),Úcopyr   r&   Úurllib.parser   Úsqlalchemy.ormr   Úapp.automation.tasks.loginr   r   Úapp.core.configr	   r
   r   r   Úapp.core.credential_cryptor   r   Úapp.core.databaser   Úapp.core.securityr   Úapp.models.account_modelr   r_   Údictr   r   rP   r)   Útupler1   r7   r9   rA   rT   rZ   r`   rk   rn   rr   rt   r}   rƒ   © r   r   Ú<module>r�      s¸  ðÝ Û 	å "å "ç P÷ó ÷ FÝ *Ý /Ý ,á1ØÒDÐDóÐ ð  t¡ð °°t±ó ð˜t d™{ð ¨t°d©{ó ð* ð *¨ó *ð "Øñ&Øð&à�d‘
ð&ð �‰*ð&ð ˆ3�ˆ8�_ó	&ðN 'ð N°sð N¸wÈ¹~ó Nð 'ð °sð ¸wÈ¹~ó ð˜Wð ¨Sð ¸Cð ÀGÈdÁNó ð" 'ð ¨dó ð$˜7ð  w°¡~ó ð ó ðF !òØðð ðð ð	ð
 ðð ðð ðð �T‰kðð óðT !ò/Øð/ð ð/ð ð	/ð
 ð/ð ð/ð ð/ð �T‰kð/ð ó/ðd ð ¨Tó ð ð ¨Tó ð Ø#ñ	9Øð9àð9ð ð9ð ˜‘*ð	9ð
 	ó9ð,  $ñØðàðð ˜‘*ðð 
ô	r   