a
    Pi%                     @  s  d dl mZ d dlZd dlZd dlZd dlmZ d dlmZm	Z	 d dl
mZ d dlmZ d dlmZ d dlmZ d d	lmZmZmZmZ d d
lmZ dddddZddddddZdddddddddddddZddddddZdddddddd d!d"d#Zdddd$ddddd%d&d'd(d)Zddd*d+d,d-Zdd.d/d0Z d;ddd1dd2d3Z!ddddd4d5Z"ddd6dd7d8Z#ddd6dd9d:Z$dS )<    )annotationsN)	timedelta)AnyOptional)delete)select)AsyncSession)settings)AudienceSession	JoinTokenParticipantRoom)utc_nowstr)line_user_idreturnc                 C  s(   | pd  }|sdS t|d S )N zutf-8)striphashlibsha256encode	hexdigest)r   raw r   OC:\Users\jasmi\Projects\line-hihaho-voting\backend\app\services\participants.pyhash_line_user_id   s    r   r   r   )sessionroom_idr   c                   sB   |  t|I d H }|r|S t||d}| | |  I d H  |S )N)idname)getr   addflush)r   r   roomr   r   r   ensure_room_exists   s    
r$   r   )r   sourcedisplay_namer   )r   r   r   r%   r&   r   c             	     s   t |}t| |I d H  d }|rP| tttj|ktj|kI d H }| }|rt	 |_
|rf||_|rp||_| | |  I d H  |S tdtd ||pdtd ||t	 t	 d}| | |  I d H  |S )Nzp-   z
anonymous:   )r   r   line_user_id_hashr%   r&   	joined_atlast_seen_at)r   r$   execr   r   wherer   r)   firstr   r+   r&   r%   r!   r"   secrets	token_hex)r   r   r   r%   r&   r)   participantresultr   r   r   get_or_create_participant#   s@    

	
r3   zOptional[str]zOptional[AudienceSession])r   
session_idr   c                   s   |sd S |  t|I d H }|s"d S t }|j|krT| |I d H  |  I d H  d S ||_|ttj	d |_| 
| |  I d H  |S Nseconds)r    r
   r   
expires_atr   r"   r+   r   r	   audience_session_ttl_secondsr!   )r   r4   recnowr   r   r   get_session_recordN   s    

r<   )existing_session_idr%   r
   )r   r1   r=   r%   r   c                  s   t | |I d H }t }|rp|j|jkrp|j|jkrp||_|ttjd |_	|rT||_
| | |  I d H  |S ttd|j|j|j||||ttjd d}| | |  I d H  |S )Nr6      )r4   participant_idr   r)   r%   
created_atr+   r8   )r<   r   r   r?   r   r+   r   r	   r9   r8   r%   r!   r"   r
   r/   token_urlsafer)   )r   r1   r=   r%   existingr;   r:   r   r   r   create_or_reuse_sessionc   s.    


rC   )event_idr%   metadatazOptional[dict[str, Any]]r   )r   r1   rD   r%   rE   r   c                  sb   t  }ttd|j|j|j||tj|p*i dd||t	t
jd d	}| | |  I d H  |S )N    F)ensure_asciir6   )	tokenr?   r   r)   r%   rD   metadata_jsonr@   r8   )r   r   r/   rA   r   r   r)   jsondumpsr   r	   join_token_ttl_secondsr!   r"   )r   r1   rD   r%   rE   r;   rH   r   r   r   issue_join_token   s    
rM   ztuple[JoinToken, Participant])r   token_valuer   c                   s   |  t|I d H }t }|r&|j|kr.td|  t|jI d H }|sNtd||_| jd7  _||_	| 
| | 
| |  I d H  ||fS )NZinvalid_join_tokenZparticipant_not_found   )r    r   r   r8   
ValueErrorr   r?   last_used_at	use_countr+   r!   r"   )r   rN   rH   r;   r1   r   r   r   consume_join_token   s    

rS   )r   c                 C  s6   t  }|ttjd }|tj| ktj|ktj|kgfS r5   )r   r   r	   &audience_session_active_window_secondsr
   r   r8   r+   )r   r;   Zactive_cutoffr   r   r   _active_session_filters   s    rU   Nonec                   sL   t ttjt k}|r*|tj|k}| |I d H  |  I d H  d S N)r   r
   r-   r8   r   r   r,   r"   )r   r   	statementr   r   r   purge_expired_sessions   s
    rY   c                   sD   |sd S |  t|I d H }|s"d S | |I d H  |  I d H  |S rW   )r    r
   r   r"   )r   r4   r:   r   r   r   delete_session_record   s    rZ   intc                   sB   t | |I d H  t|\}}| ttj| I d H }t| S rW   )rY   rU   r,   r   r
   r-   lenallr   r   _filtersr2   r   r   r   count_room_sessions   s    ra   c                   sH   t | |I d H  t|\}}| ttjj| I d H }tt|	 S rW   )
rY   rU   r,   r   r
   r?   r-   r\   setr]   r^   r   r   r   count_room_active_participants   s    rc   )N)%
__future__r   r   rJ   r/   datetimer   typingr   r   
sqlalchemyr   sqlmodelr   sqlmodel.ext.asyncio.sessionr   
app.configr	   app.models.entitiesr
   r   r   r   app.services.time_utilsr   r   r$   r3   r<   rC   rM   rS   rU   rY   rZ   ra   rc   r   r   r   r   <module>   s>   +%
