o
    =hQ                     @   s  d dl mZmZ 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
 d dlZedZedd ddd	d
dZdZdZe
jZe
jZe
jZe
jZe
jZe
jZe
jZe
jZdZ da!dd Z"dd Z#dd Z$dd Z%dd Z&dd Z'dd Z(dd Z)dd  Z*d!d" Z+d#ej,d$ej,d%e-d&ej,fd'd(Z.d)e-d#ee- d$ej,d&ee-ee- f fd*d+Z/d,d- Z0d.d/ Z1d)e-fd0d1Z2d<d3e-fd4d5Z3d=d7e4d3e-fd8d9Z5e6d:kr	 e$ Z7e7re%e7 dS e8d; dS dS )>    )DictListN)settingsfpl_datazfuture.no_silent_downcastingTZGKZDEFZMIDZFWD)            z7https://fantasy.premierleague.com/api/bootstrap-static/z/https://fantasy.premierleague.com/api/fixtures/zhttp://127.0.0.1:8002c                  C   s^   zt td} t| W  d    W S 1 sw   Y  W d S  ty.   td i  Y S w )Nrz0Info file not found. Returning empty dictionary.)openINFO_FILE_PATHjsonloadFileNotFoundErrorloggerwarning)f r   :/var/www/html/fantasy/fantasy_api/fantasy_data/services.py	load_info   s   (
r   c              
   C   s   z"t td}tj| |dd W d    W d S 1 sw   Y  W d S  tyD } ztd|  td|  W Y d }~d S d }~ww )Nwr	   indentzError saving info: )r   r   r   dumpIOErrorr   errorprint)infor   er   r   r   	save_info&   s   &r   c               
   C   sF  t  aztd g d} g d}g d}dtd< tt}|  | }t	|d }t	|d }t
|d	 }|jd
dd t }t|d dk d }	td|	  |	td< td tt d}
td td|	 d |	d d dkr|	d td krtd tt d|	d  }
|	d td< td tt |	dk rtjt dtd|	id}| }zt	|}|jt d|	 ddd  td! W n ty } ztd"| W Y d#}~nd#}~ww |d$ d% |d$< |d& d'd( |d&< |jtdd)|d*< |jtdd)}t|||	}|jd#d#|j|  f }tt d|	 dj d+d,id-}tj!||d.d/d0}|d, d|d,< |j"d.gdd1j#d2d3}|jd#d#|j| f j#d2d3}|jd#d#|j| f j#d2d3}|j#d2d3}|j#d2d3}td4 |||||fW S  tj$y } zt%d5|  td5|  W Y d#}~d#S d#}~w tj&j'y } zt%d6|  td6|  W Y d#}~d#S d#}~w tj&j(y  } zt%d7|  td5|  W Y d#}~d#S d#}~w ty" } zt%d8|  td8|  W Y d#}~d#S d#}~ww )9zG
    Fetches data from the FPL API.  Handles errors and logs them.
    zFetching data from FPL API...)Z
news_addedZsquad_numberZregionZnow_cost_rankZnow_cost_rank_typeZ	form_rankZform_rank_typeZpoints_per_game_rankZpoints_per_game_rank_typeZselected_rankZselected_rank_typeZinfluence_rankZinfluence_rank_typeZcreativity_rankZcreativity_rank_typeZthreat_rankZthreat_rank_typeZict_index_rankZict_index_rank_typeZ#corners_and_indirect_freekicks_textZdirect_freekicks_textZpenalties_textZchance_of_playing_next_round)
ZdrawformZlossZplayedZpointspositionZteam_divisionunavailablewinZpulse_id)	Zdeadline_time_game_offsetZrelease_timeZcup_leagues_createdZh2h_ko_matches_createdZreleasedZ	can_enterZ
can_manageZranked_count	overridesTupdating_datateamselementseventsg      inplacefinishedr   zCurrent GW : gwzUpdating Model Data.z/updatez Model Data Updated Successfully z#Getting Model Predictions for Gw : .r   r   Z
retrain_gwzStarting Model Retrainz	/retrain/zModel Retrain Complete.'   z/predict)dataz.csvF)indexz Prediction Fetched Successfully.z5Error decoding JSON response from FastAPI service: %sNZnow_cost
   Zelement_typec                 S   s   t |  S )N)	POSITIONS)elemr   r   r   <lambda>   s    z fetch_fpl_data.<locals>.<lambda>)axischance_of_playing_this_roundZxPXP)columnsidleft)r:   rightonhow)	ascendingrecords)orientzKFetched  players ,gameweeks, fixtures ,and teams from FPL API Successfully.zError decoding JSON: zHTTP error occurred: zError fetching FPL data: An unexpected error occurred: ))r   r   r   requestsgetFPL_API_URLraise_for_statusr   pdjson_normalize	DataFramefillnafetch_fixtures_dataintsumFASTAPI_SERVICE_URLr   postdumpsto_csvMODEL_PREDICTION_FOLDER	Exceptionr   mapapplyclean_playing_chance_colclean_setpieces_ranking/calculate_teams_upcoming_matches_avg_difficultylocr8   isinread_csvrenamemergesort_valuesto_dictJSONDecodeErrorr   
exceptions	HTTPErrorRequestException)Zexlude_player_colsZexlude_team_colsZexlude_events_colsresponser/   r&   playersZ	gameweeksfixturescurr_gw_resultr   Zupcoimg_5_gw_difficultyZleaderboardZxp_dfr   r   r   fetch_fpl_data0   s   



 



"
ri   c              
   C   s  | du rt d dS ztjtjtdd tjtjtdd tjtjtdd tjtjt	dd tjtjt
dd tt
d}tj| d |dd W d   n1 s]w   Y  tt	d}tj| d |dd W d   n1 s|w   Y  ttd}tj| d	 |dd W d   n1 sw   Y  ttd}tj| d
 |dd W d   n1 sw   Y  ttd}tj| d |dd W d   n1 sw   Y  dtd< tt td dk rttd  t d W dS  ttfy } zt d|  W Y d}~dS d}~w ty2 } zt d|  W Y d}~dS d}~w tyM } zt d|  W Y d}~dS d}~ww )zK
    Saves the FPL data to a JSON file.  Handles errors and logs them.
    NzNo data to save.T)exist_okr   r	   r   r   r   r   r   Fr%   r,   r.   zFPL data saved successfully.zError saving FPL data z"Type error while saving FPL data: rA   )r   r   osmakedirspathdirnameTEAMS_STORAGE_PATHPLAYERS_STORAGE_PATHGAMEWEEKS_STORAGE_PATHFIXTURES_STORAGE_PATH UPCOMING_TEAM_FIXTIRES_DIFFICULTr   r   r   r   r   save_dream_teamsr   OSErrorr   	TypeErrorrR   )r/   r   r   r   r   r   save_fpl_data   sN   
rw   c               
   C      zt td} t| W  d   W S 1 sw   Y  W dS  ty1   tdt d Y dS  tjyD   tdt d Y dS  t	t
fyc } ztdt d|  W Y d}~dS d}~w ty} } ztd|  W Y d}~dS d}~ww )	zk
    Loads the teams data from the JSON file.  Handles errors, logs them, and returns None on failure.
    r
   NFPL teams file not found at .  Returning None.Error decoding JSON from "Error reading FPL teams data from : rA   )r   ro   r   r   r   r   r   r_   r   r   ru   rR   r   r   r   r   r   load_teams_data  s*   (
r   c               
   C   rx   	zo
    Loads the gameweeks data from the JSON file.  Handles errors, logs them, and returns None on failure.
    r
   Nry   rz   r{   r|   r}   rA   )r   rq   r   r   r   r   r   r_   r   r   ru   rR   r~   r   r   r   load_gameweeks_data  .   (

r   c               
   C   rx   r   )r   rr   r   r   r   r   r   r_   r   r   ru   rR   r~   r   r   r   load_fixtures_data5  r   r   c               
   C   rx   	zm
    Loads the players data from the JSON file.  Handles errors, logs them, and returns None on failure.
    r
   NzFPL players file not found at rz   r{   z$Error reading FPL players data from r}   rA   )r   rp   r   r   r   r   r   r_   r   r   ru   rR   r~   r   r   r   load_players_dataN  r   r   c               
   C   rx   r   )r   rs   r   r   r   r   r   r_   r   r   ru   rR   r~   r   r   r   &load_team_upcoming_fix_difficulty_datae  r   r   c                  C   s6   t t} |  }t|}|jddd |g d S )NTr)   )eventteam_hteam_h_difficultyZteam_h_scoreteam_ateam_a_difficultyZteam_a_scorer+   )rB   rC   FPL_FIXTURE_API_URLr   rF   rG   rI   )rc   r/   re   r   r   r   rJ   }  s
   

rJ   r&   re   
current_gwreturnc                 C   s   | d   }t }||d< t|||}| D ]\}}d| }|||< qdg}	dd |jD }
|j|	|
ddd}||d dk }|dd  }tj	||dd	d
S )Nr9   GW_c                 S   s   g | ]	}| d r|qS )r   )
startswith).0colr   r   r   
<listcomp>  s    zCcalculate_teams_upcoming_matches_avg_difficulty.<locals>.<listcomp>ZGameWeekZ
Difficulty)id_vars
value_varsvar_name
value_namer   r:   )r<   r=   )
to_listrF   rH   add_gameweek_difficcltyitemsr8   meltgroupbymeanr\   )r&   re   r   Zteam_idsZ%teams_upcoming_matches_avg_difficultyZgw_diff_per_teamkvcol_namer   r   Z	melted_dfZaverage_difficultyr   r   r   rW     s$   

rW   rf   c                 C   s   i }| d dkr| d nd}t t| |d D ]N\}}g }|D ]?}||d |k }	|	|	d |k }
|
jsA|t|
jd d  q|	|	d |k }
|
jsY|t|
jd d	  q|d q|||d < q|S )
Nr	   &   r   r   r   r   r   r   r   )	enumeraterangeemptyappendrK   iloc)rf   r&   re   Zdifficultiesfinalr0   weekZdiff_by_teamZteamZcurrent_gw_fixturesZteam_rowr   r   r   r     s"   r   c                 C   sf   t | d r/| d dkrdS | d dkr-td| d }|dr+|d}t|S d S d	S | d S )
Nr6   statusad   dz(\d+)%newsr   r   )rF   isnaresearchgroupfloat)recordZpercentage_matchnumberr   r   r   rU     s   

rU   c                 C   sF   t | d rd| d< t | d rd| d< t | d r!d| d< | S )NZpenalties_orderr   Zdirect_freekicks_orderZ$corners_and_indirect_freekicks_order)rF   r   )r   r   r   r   rV     s   rV   c                 C   s:   ddl m} || }t||  | dkrt| d  d S d S )Nr   )load_ai_dream_teamr   )squad.servicesr   save_ai_dream_teamsave_actual_dream_team)rf   r   ai_dream_teamr   r   r   rt     s   
rt   actual_dream_team.jsonr,   c              
   C   s  ddl m} t | }zetj|r.t|d}t|}W d   n1 s(w   Y  ni }t	|| k rf|| |t
| < t|d}tj||dd W d   n1 sVw   Y  td|   W dS td	|  d
 W dS  ty } ztd|  W Y d}~dS d}~ww )z
    Save actual dream team only once per gameweek.
    If the file has fewer entries than the current gameweek, add the new dream team.
    Otherwise, do nothing.
    r   )load_dream_teamr
   Nr   r	   r   zSaved actual dream team for GW zActual dream team for GW z  already saved. No action taken.z Error saving actual dream team: )r   r   DREAM_TEAM_FOLDERrk   rm   existsr   r   r   lenstrr   r   r   rR   r   )r,   filenamer   rm   r   r/   r   r   r   r   r     s(   r   ai_dream_team.jsonr   c              
   C   s   t  | }zRtj|r(t|d}t|}W d   n1 s"w   Y  ni }| |t|< t|d}tj||dd W d   n1 sHw   Y  t	
d| d W dS  tys } zt	d|  W Y d}~dS d}~ww )	zu
    Save ai_dream_team for a given gameweek.
    If gw exists, replace its content; if not, add new gw content.
    r
   Nr   r	   r   zSaved AI dream team for GW  zError saving AI dream team: )r   rk   rm   r   r   r   r   r   r   r   r   rR   r   )r   r,   r   rm   r   r/   r   r   r   r   r     s"   r   __main__zFailed to fetch data.)r   )r   )9typingr   r   rB   pandasrF   r   rk   r   django.confr   logging	getLoggerr   
set_optionr2   rD   r   FPL_TEAMS_FILEro   FPL_PLAYERS_FILErp   FPL_GAMEWEEKS_FILErq   FPL_FIXTIRES_FILErr   	INFO_FILEr   *FPL_UPCOMING_TEAM_FIXTIRES_DIFFICULTY_FILErs   rQ   r   rM   r   r   r   ri   rw   r   r   r   r   r   rJ   rH   rK   rW   r   rU   rV   rt   r   dictr   __name__r/   r   r   r   r   r   <module>   s`    

 )/ , 	