
    Ki"                     j   d Z ddl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mZm	Z	 ej                  j                  dej                  j                  ej                  j                  e                   ddlmZ dZdZddd	d
dd	ddd	ddd	d
dd	dZd Zd Zd Zd ZddZd Zedk(  r e        yy)z
Fetch Referee Assignments from ESPN
Gets referee/official data for NBA, NFL, NHL games.

ESPN API: /sports/{sport}/{league}/summary?event={id}
Officials are in header.competitions[0].officials

Run: Daily after games complete
    N)datetimetimezone	timedelta)normalize_to_fullz-https://site.api.espn.com/apis/site/v2/sportsg      ?
basketballnba)sportespn_leaguefootballnflhockeynhlmens-college-basketballcollege-football)r   r   r   ncaabncaafc                  ~   d} 	 t        | d      5 }|D ]S  }|j                  d      s|j                  dd      d   j                         j                  d      d   c cd d d        S  	 d d d        t
        j                  j                  dd	      j                  d      d   S # 1 sw Y   ;xY w# t        $ r Y Iw xY w)
Nz/var/www/html/eventheodds/.envrzSPORTS_DATABASE_URL==   ?r   SPORTS_DATABASE_URL )open
startswithsplitstripFileNotFoundErrorosenvironget)env_pathflines      scripts/fetch_espn_referees.pyload_db_urlr&   !   s    /H(C  	GA G??#9:::c1-a0668>>sCAFF	G 	GG	G ::>>/4::3?BB	G 	G  s9   B0 B$6B$	B0 (B$*B0 $B-)B0 0	B<;B<c                 j    | j                  d       | j                  d       | j                  d       y)z"Create GameReferee table if neededa  
        CREATE TABLE IF NOT EXISTS "GameReferee" (
            id BIGSERIAL PRIMARY KEY,
            league VARCHAR(50) NOT NULL,
            "gameId" BIGINT NOT NULL,
            "gameDate" TIMESTAMP,
            "refereeName" VARCHAR(200) NOT NULL,
            "refereeRole" VARCHAR(50),
            "refereeId" VARCHAR(100),
            "createdAt" TIMESTAMP DEFAULT NOW(),
            UNIQUE(league, "gameId", "refereeName")
        )
    z`CREATE INDEX IF NOT EXISTS "GameReferee_league_ref_idx" ON "GameReferee" (league, "refereeName")zOCREATE INDEX IF NOT EXISTS "GameReferee_gameId_idx" ON "GameReferee" ("gameId")N)execute)curs    r%   ensure_referee_tabler*   -   s/    KK  	 KKrsKKab    c                 p   t          d|  d| d| }|dv r|dz  }	 t        j                  |d      }|j                  dk7  rg S |j	                         }g }|j                  dg       D ]  }|j                  d	      }|j                  d
g       }	|	s)|	d   }
|
j                  dg       }d}d}|D ]M  }|j                  di       }|j                  dd      j                         }|j                  d      dk(  r|}L|}O |s|s|s|j                  |||d        |S # t        $ r}g cY d}~S d}~ww xY w)z!Get all ESPN event IDs for a date/z/scoreboard?dates=)r   r   z&groups=50&limit=300   timeout   eventsidcompetitionsr   competitorsNteamabbreviationr   homeAwayhome)r3   r9   away)	ESPN_BASErequestsr!   status_codejsonupperappend	Exception)r	   r
   date_strurlrespdatar2   eventevent_idr4   compr5   	home_team	away_team
competitorr6   abbreves                     r%   get_espn_events_for_daterN   @   s]   Kqq-?z
JCEE%%$||C,s"Iyy{XXh+ 	EyyH 99^R8L?D((="5KII) '
!~~fb1."5;;=>>*-7 &I &I' I)"%% )	4  	s6   'D  B<D  D  D  D   	D5)D0*D50D5c           
      8   t          d|  d| d| }	 t        j                  |d      }|j                  dk7  rg S |j	                         }g }|j                  di       }|j                  dg       }|r|d   j                  d	g       D ]  }	|	j                  d
      xs |	j                  d      }
|	j                  di       }t        |t              r|j                  d
      n|}|	j                  d      }|
sp|j                  |
j                         ||rt        |      ndd        |j                  di       }|j                  d	g       D ]  }	|	j                  d
      xs |	j                  d      }
|
s*|
|D cg c]  }|d   	 c}vs@|j                  |
j                         |	j                  di       j                  d
      |	j                  d      rt        |	j                  d            ndd        |S c c}w # t        $ r}g cY d}~S d}~ww xY w)z*Fetch officials from ESPN summary endpointr-   z/summary?event=r.   r/   r1   headerr4   r   	officialsdisplayNamefullNamepositionr3   N)nameroler3   gameInforU   )r;   r<   r!   r=   r>   
isinstancedictr@   r   strrA   )r	   r
   rG   rC   rD   rE   rQ   rP   r4   officialrU   rT   rV   ref_id	game_infoorM   s                    r%   fetch_officialsr_   m   s   Kqq_XJ
GC'||C,s"Iyy{	 (B'zz."5(O//R@ ||M2Nhll:6N#<<
B76@46Px||M2V^!d+$$ $

 $-3c&k&  HHZ,	!k26 	H<<.J(,,z2JD	$B1QvY$BB   JJL$LLR8<<]K5=\\$5G#hll401T" 	  %C  	sI   'H B<H 8A?H 8H =G?	H A0H ?H 	HHHHc                    | t         vrt        d|         dddS t         |    }t               }t        j                  |      }|j                         }t        |       |j                          t        j                  t        j                        j                         }|t        |      z
  }t        d| j                          d| d|        d}d}	|}
|
|k  r>|
j                  d      }t!        |d	   |d
   |      }|D ]  }t#        j$                  t&               t)        |d	   |d
   |d         }|s5t+        |d   |       }t+        |d   |       }|j-                  d| |||
f       |j/                         }|s||\  }}|	dz  }	|D ]8  }	 |j-                  d| |||d   |d   |d   f       |j0                  dkD  r|dz  }:  |
t        d      z  }
|
|z
  j4                  dz  dk(  r(t        d|  d|
 d|	 d| d	       |j                          |
|k  r>|j                          |j7                          |j7                          t        d|  d| d|	 d       ||	dS # t2        $ r
}Y d}~d}~ww xY w)zFetch referee data for a leaguezUnknown league: r   )insertedgames)days
z: Fetching referees from z to z%Y%m%dr	   r
   r3   r9   r:   z
                SELECT id, "gameDate" FROM "SportsGame"
                WHERE league = %s
                  AND "homeTeam" = %s AND "awayTeam" = %s
                  AND "gameDate"::date = %s
                LIMIT 1
            r   a  
                        INSERT INTO "GameReferee" (league, "gameId", "gameDate", "refereeName", "refereeRole", "refereeId")
                        VALUES (%s, %s, %s, %s, %s, %s)
                        ON CONFLICT (league, "gameId", "refereeName") DO NOTHING
                    rU   rV   N   z  z: Processed through z, z games, z refsz: Total  referees from  games)LEAGUE_CONFIGprintr&   psycopg2connectcursorr*   commitr   nowr   utcdater   r?   strftimerN   timesleepREQUEST_DELAYr_   r   r(   fetchonerowcountrA   rc   close)league	days_backconfigdb_urlconnr)   end_date
start_datetotal_insertedtotal_gamescurrent_daterB   r2   rF   rQ   	home_full	away_fullgamegame_id	game_dater[   rM   s                         r%   fetch_referees_for_leaguer      s   ]" )***6"F]FF#D
++-CKKM ||HLL)..0HI955J	Bv||~7
|4z
RSNKL
(
"((2)&/6-;PRZ[ &	EJJ}%'w9NPUVZP[\I)%-@I)%-@I KK  )Y=? <<>D!%GY1K% 
KK ! !'9hv6FQWHXZbcgZhi	k ||a'&!+7&	P 		q)):%++a/14Bvh2<.;-xXfWgglmnKKMa (
"d 	KKMIIKJJL	Bvhh~.ok]&
QR&== ! s   5I%%	I83I8c                     t        j                  d      } | j                  dt        dd       | j                  dt        dd	       | j                         }t        d
       t        d       t        dt        j                  t        j                        j                                 t        d
       |j                  j                  d      D cg c]   }|j                         j                         " }}d}d}|D ])  }t!        ||j"                        }||d   z  }||d   z  }+ t        dd
        t        d| d| d       t        d
       y c c}w )NzFetch referee data from ESPN)descriptionz	--leaguesznba,nfl,nhlzComma-separated leagues)typedefaulthelpz--days<   zDays to look backz<============================================================zFETCH ESPN REFEREE DATAzTime: ,r   )ry   ra   rb   rd   zTOTAL: rf   rg   )argparseArgumentParseradd_argumentrZ   int
parse_argsri   r   rn   r   ro   	isoformatleaguesr   r   lowerr   rc   )parserargslr   r   r   rx   results           r%   mainr      s@   $$1OPF
#}6  8
sB0  2D	(O	
#$	F8<<-779:
;<	(O*.,,*<*<S*ABQqwwy BGBNK '*6TYYG&,,vg&'
 
Bvh-	GN#?;-v
FG	(O Cs   %E__main__)   )__doc__r<   rj   r   sysrr   r   r   r   r   pathinsertdirnameabspath__file__
team_namesr   r;   rt   rh   r&   r*   rN   r_   r   r   __name__ r+   r%   <module>r      s      	 
   2 2 277??277??8#<= > (;	 "%86e4#4MN!2DE	Cc&*Z+\O>d8 zF r+   