o
    hp                     @   s<  d dl Z d dlmZmZmZ d dlZd dlZd dlm	Z	 d dl
mZ dZe Zdd Zdd	 ZdddZdeeef deeeef  dee deeef def
ddZdeeeef  deeeef  dee deeef def
ddZ	 	ddeeeef  deeeef  dee deeef dededefddZdS )    N)AnyDictList)deepcopy)load_teams_data   c                 C   s$   t | d  }|d |d |d dS )z4
    Returns the team name for a given team ID.
       id
short_namecode)r	   namer   )TEAMS)team_idteam r   0/var/www/html/fantasy/fantasy_api/squad/tr_v3.pyget_team_name   s   r   c                 C   s<   t | g}|g d }|d dd |d< |jd  S )N)r	   web_nameelement_typer   now_costtotal_pointsstatus	opta_codescore
DifficultyXPr   c                 S   s   t | S )N)r   xr   r   r   <lambda>(   s    z!format_transfer.<locals>.<lambda>r   )pd	DataFrameapplyilocto_dict)playerdfr   r   r   format_transfer   s   r&   Tc                 C   sX   | d |v s| | d dtkrdS | d |k rdS | d |kr"dS | d dkr*dS d	S )
z
    Validates a transfer selection:
      - Checks if the player Xp is not less than the Old.
      - Checks if the player cost is within the budget.
    r	   r   r   Fr   r   availabilityr   T)getMAX_PLAYERS_PER_TEAM)r$   old_XPbudgetidscountis_availbler   r   r   validate_trasfer_selection-   s    r/   
player_outall_playersr   
team_countr+   c              	      s  i }t |}| }d }d }	|	dkr%|d |	 t|d  d }||   fdd|D }
t|
dd	 d
d}
|
D ]B}|d |v rGq>t|d  ||d dv r|d d  }|dkr|t||d < t|d|d< t |d  d|d< |  S q>i S )z
    For a single player to transfer out, return the next batch of best transfer suggestions.
    Suggestions are sorted by XP, then price. Returns up to batch_size suggestions starting from 'start'.
    r   cost_change_startr   
   g      ?c                    <   g | ]}|d  d  kr|d d kr|d  kr|qS r   r   r   r   .0pbankr0   r   r   
<listcomp>^   s   < z7get_transfer_suggestions_for_player.<locals>.<listcomp>c                 S      | d | d fS Nr   r   r   r   r   r   r   r   _       z5get_transfer_suggestions_for_player.<locals>.<lambda>Tkeyreverser	   r   r   adr      gainr   r;   )setcopymathfloorsortedr/   r&   round)r0   r1   r   r2   r+   
suggestionsuggested_players_idsteam_player_countplayer_selling_priceplayer_price_change
candidates	candidaterE   r   r:   r   #get_transfer_suggestions_for_playerI   s:   
rS   playersc                 C   sN   g }| D ]}t |||||}|r|| q|jdd dd |r%|d S g S )z
        get best ai suggestion for each player in one  on  one fashion if a transfer is possible
        then return the best suggestion based on total gain and remaining budget in case of 2 suggestions having the same gain
    c                 S   s   |  dd|  ddfS )NrE   r   r;   )r(   r   r   r   r   r      s    z-get_ai_transfer_suggestions.<locals>.<lambda>Tr@   r   )rS   appendsort)rT   r1   r   r2   r+   Zsuggestion_resultr$   rL   r   r   r   get_ai_transfer_suggestionss   s   
rW   players_outstart
batch_sizec                    s  g }| D ] fdd|D  }}t |dd dd}|| qttj| }	g }
|	D ]}d}i }t|}t|} }d}t|D ]R\}}| | |d |v rTd	} nAt|d
 |||d dv sgd	} n.t	||d < |
|d  ||d dd ||d < ||d 8 }||d
 d
  7 }qB|rt|t| kr|
d|dt|ddt|dddd |D i q,|
jdd dd tdt|  dt|	  tdt|
  |
dd S )z
    For multiple players to transfer out, return the next batch of best transfer combinations.
    Each combination is a mapping of player_out to best valid replacement.
    Results are sorted by total XP gain, then remaining budget.
    c                    r5   r6   r   r7   r+   r0   r   r   r<      s
    ,z8get_transfer_suggestions_for_players.<locals>.<listcomp>c                 S   r=   r>   r   r   r   r   r   r      r?   z6get_transfer_suggestions_for_players.<locals>.<lambda>Tr@   r   r	   Fr   r   rC   r   r   r   r   	transfersrem_balance
total_gainrD   comboc                 S   s   g | ]}|d  qS )r	   r   r7   r   r   r   r<      s    c                 S   r=   )Nr^   r]   r   r   r   r   r   r      r?   z Total Available Combos for z players : z Total Valid Suggestions : N   )rJ   rU   list	itertoolsproductrF   r   	enumerater/   r&   addr(   lenrK   rV   print)rX   r1   r   r2   r+   rY   rZ   Zcandidates_per_outrQ   Z
all_combosresultsr_   valid	selectionZused_idsrN   r;   r^   idxrR   r   r[   r   $get_transfer_suggestions_for_players   s`   



rl   )T)r   r   )rH   typingr   r   r   pandasr   rb   rG   r   fantasy_data.servicesr   r)   r   r   r&   r/   strintrS   rW   floatrl   r   r   r   r   <module>   sd    



*


