Ë
    Uti�  ã                   óø  — d dl Z d dlZd dlZd dlZd dlZd dlmZmZmZm	Z	 e j                  j                  e j                  j                  e«      «      Ze j                  j                  ed«      Zdej"                  fd„Zdedefd„Zdeeef   deeee   f   fd	„Zdd
„Zdedeeef   defd„Zddddœdedee   dee   dee   ddf
d„Zdedeeeef      fd„Zdedeeeef      fd„Zde	eeef      fd„Zy)é    N)ÚOptionalÚDictÚAnyÚListztiktok_tokens.sqlite3Úreturnc                  óÌ   — t        j                  t        d¬«      } t         j                  | _        	 | j                  d«       | j                  d«       | S # t        $ r Y | S w xY w)Né   )ÚtimeoutzPRAGMA journal_mode=WAL;zPRAGMA synchronous=NORMAL;)Úsqlite3ÚconnectÚ	TOKENS_DBÚRowÚrow_factoryÚexecuteÚ	Exception)Úconns    ú)/var/www/html/luxverbi-app/token_store.pyÚ_dbr      s]   € Ü�?‰?œ9¨bÔ1€DÜ—{‘{€DÔðØ�‰Ð/Ô0Ø�‰Ð1Ô2ð €Køô ò ØØ€Kðús   ²"A Á	A#Á"A#Úaliasc                 ó®   — | xs dj                  «       j                  «       }t        j                  dd|«      }t        j                  dd|«      }|xs dS )u�   
    Alias â€œhumanoâ€� (p.ej. nombre del canal) pero seguro para usar como key.
    - lower
    - espacios -> '-'
    - solo [a-z0-9_-]
    Ú z\s+ú-z[^a-z0-9_-]Údefault)ÚstripÚlowerÚreÚsub)r   Úas     r   Ú_sanitize_aliasr      sM   € ð 
Š�"×ÑÓ×#Ñ#Ó%€AÜ
�‰ˆv�s˜AÓ€AÜ
�‰ˆ~˜r 1Ó%€AØŠ>�	Ðó    Útoken_bundlec                 ó  — | j                  d«      xs | j                  d«      xs dj                  «       xs d}| j                  d«      xs dj                  «       xs d}| j                  d«      xs dj                  «       xs d}|||dœS )uÊ   
    TikTok suele devolver open_id en token exchange.
    El nickname/username normalmente lo obtienes con creator_info; si lo incluyes
    en token_bundle bajo estas keys, lo persistimos tambiÃ©n.
    Úopen_idÚcreator_open_idr   NÚcreator_usernameÚcreator_nickname©r$   r%   r&   )Úgetr   )r!   r#   ÚusernameÚnicknames       r   Ú_extract_creator_metar+   &   s•   € ð ×Ñ 	Ó*ÒW¨l×.>Ñ.>Ð?PÓ.QÒWÐUW×^Ñ^Ó`ÒhÐdh€GØ× Ñ Ð!3Ó4Ò:¸×AÑAÓCÒKÀt€HØ× Ñ Ð!3Ó4Ò:¸×AÑAÓCÒKÀt€Hà"Ø$Ø$ñð r    c                  ó  — t        «       } | j                  «       }|j                  d«       | j                  «        |j                  d«       |j	                  «       D �ch c]  }|d   ’Œ	 }}g }d|vr|j                  d«       d|vr|j                  d«       d|vr|j                  d	«       |D ]  }|j                  |«       Œ |j                  d
«       |j                  d«       | j                  «        | j                  «        yc c}w )uI   
    Crea tabla y migra columnas si vienes de una versiÃ³n anterior.
    z·
        CREATE TABLE IF NOT EXISTS tiktok_accounts (
          alias TEXT PRIMARY KEY,
          token_json TEXT NOT NULL,
          updated_at_ts INTEGER NOT NULL
        )
        z"PRAGMA table_info(tiktok_accounts)Únamer$   z;ALTER TABLE tiktok_accounts ADD COLUMN creator_open_id TEXTr%   z<ALTER TABLE tiktok_accounts ADD COLUMN creator_username TEXTr&   z<ALTER TABLE tiktok_accounts ADD COLUMN creator_nickname TEXTzXCREATE INDEX IF NOT EXISTS idx_tiktok_accounts_updated ON tiktok_accounts(updated_at_ts)zYCREATE INDEX IF NOT EXISTS idx_tiktok_accounts_openid ON tiktok_accounts(creator_open_id)N)r   Úcursorr   ÚcommitÚfetchallÚappendÚclose)r   ÚcurÚrowÚexistingÚaltersÚsqls         r   Úinit_token_dbr8   6   sð   € ô ‹5€DØ
�+‰+‹-€Cà‡K�Kð	ôð 	‡K�K„Mð ‡K�KÐ4Ô5Ø'*§|¡|£~Ö6 ��F“Ð6€HÐ6à€FØ Ñ(Ø�‰ÐSÔTØ Ñ)Ø�‰ÐTÔUØ Ñ)Ø�‰ÐTÔUàò ˆØ�‰�CÕðð ‡K�KÐjÔkØ‡K�KÐkÔlà‡K�K„MØ‡J�J…Lùò% 7s   ÁD	c           
      óH  — t        | «      }t        |«      }t        «       }|j                  «       }|j	                  d|t        j                  |d¬«      t        t        j                  «       «      |d   |d   |d   f«       |j                  «        |j                  «        |S )zh
    Guarda/actualiza el token_bundle para un alias.
    Devuelve el alias saneado realmente usado.
    aK  
        INSERT INTO tiktok_accounts(alias, token_json, updated_at_ts, creator_open_id, creator_username, creator_nickname)
        VALUES (?, ?, ?, ?, ?, ?)
        ON CONFLICT(alias) DO UPDATE SET
          token_json=excluded.token_json,
          updated_at_ts=excluded.updated_at_ts,
          creator_open_id=COALESCE(excluded.creator_open_id, tiktok_accounts.creator_open_id),
          creator_username=COALESCE(excluded.creator_username, tiktok_accounts.creator_username),
          creator_nickname=COALESCE(excluded.creator_nickname, tiktok_accounts.creator_nickname)
        F)Úensure_asciir$   r%   r&   )r   r+   r   r.   r   ÚjsonÚdumpsÚintÚtimer/   r2   )r   r!   Úalias_sÚmetar   r3   s         r   Ú
save_tokenrA   _   s•   € ô
 ˜eÓ$€GÜ  Ó.€Dä‹5€DØ
�+‰+‹-€CØ‡K�Kð		ð Ü�J‰J�|°%Ô8Ü”—	‘	“ÓØÐ"Ñ#ØÐ#Ñ$ØÐ#Ñ$ð	
ôð( 	‡K�K„MØ‡J�J„LØ€Nr    r'   r$   r%   r&   c          
      óv  — t        | «      }t        «       }|j                  «       }|j                  d|xs dj	                  «       xs d|xs dj	                  «       xs d|xs dj	                  «       xs dt        t        j                  «       «      |f«       |j                  «        |j                  «        y)uZ   
    Ãštil si tras OAuth llamas a creator_info y quieres persistir nickname/username.
    a  
        UPDATE tiktok_accounts
        SET creator_open_id=COALESCE(?, creator_open_id),
            creator_username=COALESCE(?, creator_username),
            creator_nickname=COALESCE(?, creator_nickname),
            updated_at_ts=?
        WHERE alias=?
        r   N)	r   r   r.   r   r   r=   r>   r/   r2   )r   r$   r%   r&   r?   r   r3   s          r   Úupdate_account_metarC   ‚   sŸ   € ô ˜eÓ$€GÜ‹5€DØ
�+‰+‹-€CØ‡K�Kð	ð Ò" ×)Ñ)Ó+Ò3¨tØÒ# ×*Ñ*Ó,Ò4°ØÒ# ×*Ñ*Ó,Ò4°Ü”—	‘	“ÓØð	
ôð" 	‡K�K„MØ‡J�J…Lr    c                 ó~  — t        | «      }t        «       }|j                  «       }|j                  d|f«       |j	                  «       }|s9|dk(  r4|j                  d«       |j                  «       }t        |«      dk(  r|d   }|j                  «        |sy	 t        j                  |d   «      S # t        $ r Y yw xY w)z³
    Carga token por alias.

    Extra UX:
    - si piden alias="default" y NO existe:
        - si SOLO hay 1 cuenta guardada -> devuelve esa
        - si hay 0 o >1 -> None
    z4SELECT token_json FROM tiktok_accounts WHERE alias=?r   zJSELECT token_json FROM tiktok_accounts ORDER BY updated_at_ts DESC LIMIT 2é   r   NÚ
token_json)r   r   r.   r   Úfetchoner0   Úlenr2   r;   Úloadsr   )r   r?   r   r3   r4   Úrowss         r   Ú
load_tokenrK   ¤   s¬   € ô ˜eÓ$€GÜ‹5€DØ
�+‰+‹-€Cà‡K�KÐFÈÈ
ÔSØ
�,‰,‹.€Cá�7˜iÒ'Ø�‰Ð`ÔaØ�|‰|‹~ˆÜˆt‹9˜Š>Ø�q‘'ˆCà‡J�J„LáØðÜ�z‰z˜#˜lÑ+Ó,Ð,øÜò Ùðús   ÂB0 Â0	B<Â;B<c                 ó„  — t        | «      }t        «       }|j                  «       }|j                  d|f«       |j	                  «       }|j                  «        |sy	 t        j                  |d   «      }|d   |d   |j                  d«      |j                  d«      |j                  d«      |d	œS # t        $ r d}Y ŒIw xY w)
u/   
    Devuelve token + meta, Ãºtil para UI.
    z¡
        SELECT alias, token_json, updated_at_ts, creator_open_id, creator_username, creator_nickname
        FROM tiktok_accounts
        WHERE alias=?
        NrF   r   Úupdated_at_tsr$   r%   r&   )r   rM   r$   r%   r&   Útoken)
r   r   r.   r   rG   r2   r;   rI   r   r(   )r   r?   r   r3   r4   rN   s         r   Úload_accountrO   Å   sÇ   € ô ˜eÓ$€GÜ‹5€DØ
�+‰+‹-€CØ‡K�Kð	ð
 
ˆ
ôð �,‰,‹.€CØ‡J�J„LáØðÜ—
‘
˜3˜|Ñ,Ó-ˆð
 �W‘Ø˜_Ñ-ØŸ7™7Ð#4Ó5ØŸG™GÐ$6Ó7ØŸG™GÐ$6Ó7Øñð øô ò ØŠðús   ÁB1 Â1B?Â>B?c            
      óB  — t        «       } | j                  «       }|j                  d«       |j                  «       }| j	                  «        g }|D ]L  }|j                  |d   |d   |j                  d«      |j                  d«      |j                  d«      dœ«       ŒN |S )z8
    Lista cuentas guardadas (para selector en UI).
    z£
        SELECT alias, updated_at_ts, creator_open_id, creator_username, creator_nickname
        FROM tiktok_accounts
        ORDER BY updated_at_ts DESC
        r   rM   r$   r%   r&   )r   rM   r$   r%   r&   )r   r.   r   r0   r2   r1   r(   )r   r3   rJ   ÚoutÚrs        r   Úlist_accountsrS   é   sŸ   € ô ‹5€DØ
�+‰+‹-€CØ‡K�Kð	ôð �<‰<‹>€DØ‡J�J„Là "€CØò 	
ˆØ�
‰
à˜7™Ø!" ?Ñ!3Ø#$§5¡5Ð):Ó#;Ø$%§E¡EÐ*<Ó$=Ø$%§E¡EÐ*<Ó$=ñõ	
ð	
ð €Jr    )r   N)Úosr   r;   r   r>   Útypingr   r   r   r   ÚpathÚdirnameÚabspathÚ__file__ÚBASE_DIRÚjoinr   Ú
Connectionr   Ústrr   r+   r8   rA   rC   rK   rO   rS   © r    r   ú<module>r_      sm  ðã 	Û 	Û Û Û ß ,Ó ,à�7‰7�?‰?˜2Ÿ7™7Ÿ?™?¨8Ó4Ó5€Ø�G‰G�L‰L˜Ð#:Ó;€	ð	ˆW×Ñó 	ð
˜3ð 
 3ó 
ð¨¨S°#¨X©ð ¸4ÀÀXÈcÁ]Ð@RÑ;Só ó &ðR �cð  ¨¨c°3¨h©ð  ¸Có  ðL &*Ø&*Ø&*òØðð ˜c‘]ðð ˜s‘mð	ð
 ˜s‘mðð 
óðD�cð ˜h t¨C°¨H¡~Ñ6ó ðB!˜ð ! ¨¨c°3¨h©Ñ 8ó !ðH�t˜D  c ™NÑ+ô r    