U
    Uti  ã                   @   sP  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
 e j
 e¡¡Ze j
 ed¡Zejdœdd„Zeedœdd	„Zeeef eeee f d
œdd„Zddœdd„Zeeeef edœdd„Zddddœeee ee ee ddœdd„Zeeeeef  dœdd„Zeeeeef  dœdd„Ze	eeef  dœdd„ZdS )é    N)ÚOptionalÚDictÚAnyÚListztiktok_tokens.sqlite3)Úreturnc                  C   sH   t jtdd} t j| _z|  d¡ |  d¡ W n tk
rB   Y nX | S )Né   )ÚtimeoutzPRAGMA journal_mode=WAL;zPRAGMA synchronous=NORMAL;)Úsqlite3ÚconnectÚ	TOKENS_DBZRowZrow_factoryÚexecuteÚ	Exception)Úconn© r   ú)/var/www/html/luxverbi-app/token_store.pyÚ_db   s    
r   )Úaliasr   c                 C   s4   | pd  ¡  ¡ }t dd|¡}t dd|¡}|p2d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   Úar   r   r   Ú_sanitize_alias   s    r   )Útoken_bundler   c                 C   sX   |   d¡p|   d¡pd ¡ pd}|   d¡p,d ¡ p4d}|   d¡pBd ¡ pJd}|||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   ÚusernameZnicknamer   r   r   Ú_extract_creator_meta&   s     ýr$   c                  C   s²   t ƒ } |  ¡ }| d¡ |  ¡  | d¡ dd„ | ¡ D ƒ}g }d|krR| d¡ d|krd| d¡ d	|krv| d
¡ |D ]}| |¡ qz| d¡ | d¡ |  ¡  |  ¡  dS )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)c                 S   s   h | ]}|d  ’qS )Únamer   )Ú.0Úrowr   r   r   Ú	<setcomp>J   s     z init_token_db.<locals>.<setcomp>r   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ÚexistingZaltersZsqlr   r   r   Úinit_token_db6   s*    ÿ	





r0   )r   r   r   c              
   C   sh   t | ƒ}t|ƒ}tƒ }| ¡ }| d|tj|ddtt ¡ ƒ|d |d |d f¡ | 	¡  | 
¡  |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*   r-   )r   r   Úalias_sÚmetar   r.   r   r   r   Ú
save_token_   s"    
úõr8   r!   )r   r   r   r    r   c             	   C   sl   t | ƒ}tƒ }| ¡ }| d|p"d ¡ p*d|p0d ¡ p8d|p>d ¡ pFdtt ¡ ƒ|f¡ | ¡  | ¡  dS )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   r4   r5   r*   r-   )r   r   r   r    r6   r   r.   r   r   r   Úupdate_account_meta‚   s    
	
û÷r9   c                 C   sš   t | ƒ}tƒ }| ¡ }| d|f¡ | ¡ }|s^|dkr^| d¡ | ¡ }t|ƒdkr^|d }| ¡  |sndS zt 	|d ¡W S  t
k
r”   Y dS X dS )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   Úfetchoner+   Úlenr-   r2   Úloadsr   )r   r6   r   r.   r'   Úrowsr   r   r   Ú
load_token¤   s"    	
r@   c                 C   s”   t | ƒ}tƒ }| ¡ }| d|f¡ | ¡ }| ¡  |s<dS zt |d ¡}W n tk
rf   d}Y nX |d |d | 	d¡| 	d¡| 	d¡|d	œS )
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=?
        Nr;   r   Úupdated_at_tsr   r   r    )r   rA   r   r   r    Útoken)
r   r   r)   r   r<   r-   r2   r>   r   r"   )r   r6   r   r.   r'   rB   r   r   r   Úload_accountÅ   s,    ú
úrC   c               
   C   sj   t ƒ } |  ¡ }| d¡ | ¡ }|  ¡  g }|D ]4}| |d |d | d¡| d¡| d¡dœ¡ q0|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   rA   r   r   r    )r   rA   r   r   r    )r   r)   r   r+   r-   r,   r"   )r   r.   r?   ÚoutÚrr   r   r   Úlist_accountsé   s$    ÿûÿ	rF   )Úosr   r2   r	   r5   Útypingr   r   r   r   ÚpathÚdirnameÚabspathÚ__file__ZBASE_DIRÚjoinr   Ú
Connectionr   Ústrr   r$   r0   r8   r9   r@   rC   rF   r   r   r   r   Ú<module>   s2   $)&ûú"!$