o
    s|Bh                     @   s  d dl mZmZ d dlmZmZ d dlmZmZm	Z	 d dl
Z
d dlZd dlZd dlmZmZmZ d dlmZ eddd	d
Zejejde gd eeZG dd deZG dd deZG dd deZejdeddefddZdd Zedkre  dS dS )    )FastAPIHTTPException)	BaseModelField)ListDictOptionalN)SessionLocalTournamentDeco
PayoutDeco)simulate_and_roundz&Prize Pool Calculator - No Floor Decayz1.0.0z<Calculate tournament prize distributions with no floor decay)titleversiondescriptionz'%(asctime)s [%(levelname)s] %(message)s)levelformathandlersc                   @   s   e Zd ZU edddZeed< edddZeed< edddZe	ed< edddZ
e	ed< edddZeed< edZeed	< edZeed
< edZeed< dS )PayoutRequest.r   )gtpriceminprizeprizesticketspoolfirstcompetition_idsportN)__name__
__module____qualname__r   r   float__annotations__r   r   intr   r   r   r   strr    r$   r$   2/var/www/html/new/PrizeAPI/app/main_api_nofloor.pyr      s   
 r   c                   @   s&   e Zd ZU eed< eed< eed< dS )PayoutResultrankamounttierN)r   r   r   r"   r!   r    r#   r$   r$   r$   r%   r&   #   s   
 r&   c                   @   sZ   e Zd ZU eed< eed< ee ed< eed< eed< eed< eed< eed< eed	< d
S )StorePayoutResponser   r   payoutsr   r   r   r   r   r   N)	r   r   r   r#   r!   r   r&   r    r"   r$   r$   r$   r%   r*   (   s   
 r*   z#/calculate_and_store_payout_nofloor)response_modelrequestc                    s  zt d|    t| j| j| j| j| j| j	d}|d }t d|  t
 }zzp|tj| jd	 }|sft| j| j| j| j| j| jtj tj d}|| |  t d| j  nt d |D ]}|t| j|d	 |d
 |d | jtj tj d qm|  t dt| d W n# ty } z|  t d|  tddt| dd }~ww W |  t d n
|  t d w t| j| jdd |D | j| j	| j| j| j| jd	W S  ty } zt jd| dd tdt|dd }~ww )NzReceived payout request: )r   r   r   r   r   r   r+   zCalculated payouts: )CompetitionId)r.   SportInitialPoolTicketPriceTicketsSold
PrizeCount	CreatedAt	UpdatedAtz"Created new tournament record for z-Tournament already exists, skipping creation.r'   finalr)   )r.   RankAmountTierr/   r4   r5   zSaved z payout recordszDatabase error: i  )status_codedetailzDatabase session closed.c                 S   s&   g | ]}t |d  |d |d dqS )r'   r6   r)   )r'   r(   r)   )r&   ).0pr$   r$   r%   
<listcomp>j   s   & z6calculate_and_store_payout_nofloor.<locals>.<listcomp>)	r   r   r+   r   r   r   r   r   r   zError in payout calculation: T)exc_info)loggerinfodictr   r   r   r   r   r   r   r	   queryr
   	filter_byr   r   datetimeutcnowaddcommitr   len	Exceptionrollbackerrorr   r#   closer*   )r-   resultr+   db
tournamentpayouter$   r$   r%   "calculate_and_store_payout_nofloor3   s   



	rS   c                   C   s   t jddddd d S )Nzmain_api_nofloor:appz0.0.0.0i@  T)hostportreload)uvicornrunr$   r$   r$   r%   startv   s   rY   __main__) fastapir   r   pydanticr   r   typingr   r   r   rW   loggingrE   app.dbr	   r
   r   app.nofloor_decayr   appbasicConfigINFOStreamHandler	getLoggerr   r@   r   r&   r*   postrS   rY   r$   r$   r$   r%   <module>   s:    

B
