a
    #i                     @   s   d dl Z d dlmZ d dlmZmZmZmZ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mZ eeedd	d
Zeee dddZeeeef dddZeeeef dddZeeeef ddddZeeeef ddddZeedddZeee eeeeef  dddZeeeeeef  dddZeeeeef  ddd d!Z d4eeeed#d$d%Z!eeeeef d&d'd(Z"eeef ee eee e#f d)d*d+Z$eeed,d-d.Z%eeeeed/d0d1Z&ee#dd2d3Z'dS )5    N)Counter)AnyDictListOptionalTuple)select)AsyncSession)Poll
PollStatusRoomVote)as_utc_naiveutc_now)textfallbackreturnc                 C   s>   z t | pd}|d ur|n|W S  t jy8   | Y S 0 d S )N )jsonloadsJSONDecodeError)r   r   value r   IC:\Users\jasmi\Projects\line-hihaho-voting\backend\app\services\voting.py_parse_json   s
    r   )pollr   c                 C   s(   t | jg }t|tr$dd |D S g S )Nc                 S   s   g | ]}t |qS r   )str).0xr   r   r   
<listcomp>       z!parse_options.<locals>.<listcomp>)r   options_json
isinstancelistr   datar   r   r   parse_options   s    
r&   c                 C   sZ   t | ji }t|tsi S |dg  |dg  |di  |di  |dd |S )Ntrigger_keystrigger_namespause_actionwinner_actionsduration_secondsr   )r   config_jsonr"   dict
setdefaultr$   r   r   r   parse_poll_config   s    
r/   c                 C   s   t | ji }t|tr|S i S )N)r   runtime_jsonr"   r-   r$   r   r   r   parse_poll_runtime'   s    r1   )r   r%   r   c                 C   s   t j|dd| _d S NF)ensure_ascii)r   dumpsr,   r$   r   r   r   set_poll_config,   s    r5   c                 C   s   t j|dd| _d S r2   )r   r4   r0   r$   r   r   r   set_poll_runtime0   s    r6   c                 C   s,   t | }t|dpi dp d}|d S )Ncontroller_commandseqr      )r1   intget)r   runtimecurrentr   r   r   next_command_seq4   s    r>   )r   winner_optionsourcer   c                 C   sX   |sd S t | }|dpi }||}t|tr6|s:d S t| |||t  d dS )Nr*   Zr8   r?   r@   actionZ	issued_atr/   r;   r"   r-   r>   r   	isoformat)r   r?   r@   configr*   rC   r   r   r   build_winner_command:   s    
rG   )r   r@   r   c                 C   sB   t | }|d}t|tr |s$d S t| d ||t  d dS )Nr)   rA   rB   rD   )r   r@   rF   rC   r   r   r   build_open_pause_commandK   s    
rH   )r   commandr   c                 C   s"   t | }|r||d< t| | d S )Nr7   )r1   r6   )r   rI   r<   r   r   r   apply_control_commandY   s    rJ   r   )sessionroom_idnamer   c                    sB   |  t|I d H }|r|S t||d}| | |  I d H  |S )N)idrM   )r;   r   addflush)rK   rL   rM   rr   r   r   ensure_room`   s    
rR   )rK   poll_idr   c                    sF   |  tttj|kI d H }| }dd |D }t|}t|S )Nc                 S   s   g | ]
}|j qS r   )choice)r   vr   r   r   r   m   r    z!compute_tally.<locals>.<listcomp>)execr   r   whererS   allr   r-   )rK   rS   resultZvoteschoicescountsr   r   r   compute_tallyj   s
     r\   )option_countsoptionsr   c                    s|   | sdS t |    dkr dS  fdd|  D tdkrpfdd|D }|rd|d dfS d dfS d dfS )	z(Returns (winner_choice_or_None, is_tie).)NFr   c                    s   g | ]\}}| kr|qS r   r   )r   krU   )bestr   r   r   y   r    zpick_winner.<locals>.<listcomp>r9   c                    s   g | ]}| v r|qS r   r   )r   o)winnersr   r   r   {   r    TF)maxvaluesitemslen)r]   r^   orderedr   )r`   rb   r   pick_winnerr   s    rh   )rK   r   r   c                    s   t j|_t|}t| |jI d H }|D ]}||d q&t||\}}||_d|_	t
|}|dpfd|d< t  d |d< t|| t|t||d | | |  I d H  |S )Nr   Zvote_resultZclose_reasonrA   Z	closed_at)r   closedstatusr&   r\   rN   r.   rh   r?   winner_sourcer1   r;   r   rE   r6   rJ   rG   rO   rP   )rK   r   r^   Ztallyoptwinner_r<   r   r   r   close_poll_and_set_winner   s     

ro   )rK   r   voter_idrT   r   c                    s   t |}||vrtdt|s(td| tttj|jktj	|kI d H }|
 }|r||_t |_| | |  I d H  |S t|j||d}| | |  I d H  |S )NZinvalid_choiceZpoll_not_accepting)rS   rp   rT   )r&   
ValueErrorcan_accept_voterV   r   r   rW   rS   rN   rp   firstrT   r   
created_atrO   rP   )rK   r   rp   rT   r^   rY   existingrU   r   r   r   	cast_vote   s&    


rv   c                 C   s0   | j tjkrdS t| j}|r,t |kr,dS dS )NFT)rj   r   openr   deadline_atr   )r   rx   r   r   r   rr      s    
rr   )r   )(r   collectionsr   typingr   r   r   r   r   sqlmodelr   sqlmodel.ext.asyncio.sessionr	   app.models.entitiesr
   r   r   r   Zapp.services.time_utilsr   r   r   r   r&   r/   r1   r5   r6   r:   r>   rG   rH   rJ   rR   r\   boolrh   ro   rv   rr   r   r   r   r   <module>   s6   $
*