
    CuiJ"                         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 ddl	m
Z
 d Zd Z e       ZdZddZd	 Zd
 Zd Zd Zd Zd Zedk(  r e        yy)zx
Sync MMA events and fights from BallDontLie API to SportsDB.
This supplements the Kaggle data with more recent events.
    N)datetime)Pathc                  b   t        d      } | j                         rjt        |       5 }|D ]P  }|j                  d      s|j	                  dd      d   j                         j                  d      c cddd       S  	 ddd       t        j                  j                  d      S # 1 sw Y   (xY w)z(Load BallDontLie API key from .env file./var/www/html/eventheodds/.envzBALLDONTLIE_API_KEY==   "NBALLDONTLIE_API_KEY	r   existsopen
startswithsplitstriposenvironget)env_pathflines      9/var/www/html/eventheodds/scripts/sync_mma_balldontlie.pyload_api_keyr      s    45H(^ 	Dq D??#9:::c1-a0668>>sCC	D 	DD	D ::>>/00		D 	Ds   B%3B%<B%%B.c                     t        d      } | j                         rt        |       5 }|D ]j  }|j                  d      s|j	                  dd      d   j                         j                  d      }d|v r|j	                  d      d   n|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)z!Load database URL from .env file.r   zSPORTS_DATABASE_URL=r   r   r	   z?schema=r   NSPORTS_DATABASE_URL r   )r   r   r   urls       r   load_db_urlr      s    45H(^ 	Rq R??#9:**S!,Q/557==cBC7AS7H399Z03cQ		R 	RR	R
 ::>>/4:::FqII	R 	Rs   CACCCz!https://api.balldontlie.io/mma/v1c                    t          d|  }|r'|dt        j                  j                  |d      z   z  }t        j                  j                  |dt        i      }	 t        j                  j                  |d      5 }t        j                  |j                         j                               cd	d	d	       S # 1 sw Y   y	xY w# t        $ r}t        d
|        Y d	}~y	d	}~ww xY w)zMake authenticated API request./?T)doseqAuthorization)headers   )timeoutNzAPI Error: )BASE_URLurllibparse	urlencoderequestRequestAPI_KEYurlopenjsonloadsreaddecode	Exceptionprint)endpointparamsr   reqrespes         r   make_requestr9   ,   s    Jaz
"CsV\\++F$+???
..
 
 .H
 
IC^^##C#4 	4::diik0023	4 	4 	4 A3 s6   !C >1B9/	C 9C>C C 	C&C!!C&c                     | | dk(  ryt        | t        t        f      rt        |       S t        |       j	                  dd      }d| dS )zFormat value for SQL.r   NULL'z'')
isinstanceintfloatstrreplace)valss     r   	sql_valuerD   :   sJ    
{cRi#U|$3xCd#Aqc8O    c                    t               }|st        d      d}t        |dd      5 }|j                  |        ddd       t	        j
                  d|d|gt        j                  t        j                  d	d
      }|j                  dk7  rH|j                  xs dj                         }d|vr%d|j                         vrt        d|dd         yyyy# 1 sw Y   xY w)zExecute SQL against SportsDB.zSPORTS_DATABASE_URL not setz/tmp/mma_bdl_batch.sqlwzutf-8)encodingNpsqlz-fTi,  )stdoutstderrtextr%   r   r   zalready existszduplicate keyzSQL Warning:    )r   RuntimeErrorr   write
subprocessrunPIPE
returncoderK   r   lowerr3   )sqldb_urltmp_pathr   resulterrs         r   run_sqlrZ   D   s    ]F899'H	hg	. !	 ^^	x(F A}}"))+3&?#))++MM#ds)-. ,N&  s   CCc                     t        d       g } d}	 ddi}|r||d<   t        d|      }|r|j                  d      sn\| j                  |d          |j                  di       j                  d	      }|rt	        |       d
k\  rnt        j                  d       t        dt	        |        d       | D cg c]   }|j                  d      r|d   dd dk\  r|" }}t        dt	        |       d       |D ]  }d|d    }|j                  dd      }|j                  d      r|j                  dd      dd nd}	|j                  d      xs |j                  d      xs d}
dt        |       dt        |       dt        |	       dt        |
       dt        t        j                  |             d}t        |        t        dt	        |       d        |S c c}w )!z+Fetch and sync MMA events from BallDontLie.z)[mma] Fetching events from BallDontLie...Nper_paged   cursoreventsdatametanext_cursori  333333?z[mma] Found z events from BallDontLiedate   2024z[mma] Processing z events from 2024+bdl_idnamezUnknown Eventr   
   locationvenueTBDzG
INSERT INTO "UfcEvent" ("eventId", name, date, location, raw)
VALUES (, z)
ON CONFLICT ("eventId") DO UPDATE SET
    name = EXCLUDED.name,
    date = EXCLUDED.date,
    location = EXCLUDED.location,
    raw = EXCLUDED.raw;
[mma] Synced z events to database)r3   r9   r   extendlentimesleeprD   r.   dumpsrZ   )
all_eventsr^   r5   r7   r8   recent_eventseventevent_idri   rd   rk   rU   s               r   sync_eventsry   [   s   	
56JF
c"%F8Hf-488F+$v,'&"%))-8ZC/

3 " 
LZ))A
BC 55=QvYr]f4 	
M  
c-011C
DE  %+'yy1-2YYv->uyy$Sb)D99Z(GEIIg,>G%		8	R	$09T?2C2iPXFYEZZ\]fgkgqgqrwgx]y\z { 	" 
M#m,--@
AB3s   4%Gc                    t        dt        |        d       d}| D ]  }|d   }d| }t        d|dd      }|r|j                  d	      s1|d	   }|D ]Q  }d|d    }|j                  d
i       }	|j                  di       }
dt	        |       dt	        |       dt	        |	j                  d             dt	        |
j                  d             dt	        |j                  d             dt	        |j                  d             dt	        |j                  d             dt	        |j                  d             dt	        |j                  d             dt	        |j                  d             dt	        t        j                  |             d}t        |       |dz  }T t        j                  d        t        d| d       y)z)Fetch fights for events from BallDontLie.z[mma] Fetching fights for 
 events...r   rh   rg   fights2   rx   r\   r`   fighter1fighter2z
INSERT INTO "UfcFight" (
    "fightId", "eventId",
    "fighter1Name", "fighter2Name",
    "weightClass", method, round, "fightTime",
    result1, result2, raw
) VALUES (
    rn   ,
    ri   weight_classmethodroundrr   result1result2a  
) ON CONFLICT ("fightId") DO UPDATE SET
    "eventId" = EXCLUDED."eventId",
    "fighter1Name" = EXCLUDED."fighter1Name",
    "fighter2Name" = EXCLUDED."fighter2Name",
    "weightClass" = EXCLUDED."weightClass",
    method = EXCLUDED.method,
    round = EXCLUDED.round,
    "fightTime" = EXCLUDED."fightTime",
    result1 = EXCLUDED.result1,
    result2 = EXCLUDED.result2,
    raw = EXCLUDED.raw;
r   rc   ro   z fights to databaseN)
r3   rq   r9   r   rD   r.   rt   rZ   rr   rs   )r_   total_fightsrw   rx   bdl_event_idr7   r|   fightfight_idr   r   rU   s               r   sync_fightsr      s   	&s6{m:
>?L ,;hZ( H8&LM488F+f 	EeDk]+HyyR0HyyR0H xIl34 5x||F#$%R	(,,v2F(G'H Iuyy()*"Yuyy7J-K,L Muyy!"#2i		&0A&B%C Duyy#$%R	%))I2F(G'H Itzz% !" #C2 CLAL?	B 	

3Y,\ 
M,':
;<rE   c                    t        dt        |        d       d}| dd D ]  }|d   }|j                  d      r|j                  dd      dd	 nd}|s4t        d
|dd      }|r|j                  d      sW|d   }|D ].  }|j                  di       }|j                  di       }	|j                  d      }
|	j                  d      }|
r|sOdt	        |
       dt	        |       dt	        |j                  d             dt	        |j                  d             dt	        |       dt	        t        j                         j                                dt	        |j                  dd             dt	        d       dt	        t        j                  |             d}t        |       |dz  }1 t        j                  d        t        d| d       y)z'Fetch odds for events from BallDontLie.z[mma] Fetching odds for r{   r   Nr$   rh   rd   r   rj   oddsr]   r~   r`   r   r   ri   z
INSERT INTO "UfcOdds" (
    fighter1, fighter2, odds1, odds2,
    "eventDate", "addingDate", source, region, raw
) VALUES (
    rn   r   fighter1_oddsfighter2_oddsvendorballdontlieusz
) ON CONFLICT (fighter1, fighter2, "eventDate", source, region) DO UPDATE SET
    odds1 = EXCLUDED.odds1,
    odds2 = EXCLUDED.odds2,
    "addingDate" = EXCLUDED."addingDate",
    raw = EXCLUDED.raw;
r   rc   ro   z odds to database)r3   rq   r   r9   rD   r   utcnow	isoformatr.   rt   rZ   rr   rs   )r_   
total_oddsrw   rx   
event_dater7   	odds_dataoddr   r   f1_namef2_namerU   s                r   	sync_oddsr      s   	$S[M
<=J +;3899V3DUYYvr*3B/$
 Fs$KL488F+L	 	Cwwz2.Hwwz2.Hll6*Gll6*G'
 w9W-. /sww'()Icggo6N,O+P Qz2i(9(C(C(EFG Hswwx/01IdO3D Etzz#  !C  CL!OJ7	: 	

3W+Z 
M*%6
78rE   c                  V   t         st        d       y t        d       t        dt         d d  d       t               } | rt        |        t	        |        t        d       t               }|r=t        j                  d|dd	gd
d
      }t        d       t        |j                         y y )Nz([mma] Error: BALLDONTLIE_API_KEY not setz&[mma] Starting BallDontLie MMA sync...z[mma] API Key: rj   z...z$[mma] BallDontLie MMA sync complete!rI   z-ca  SELECT 'Events' as type, COUNT(*), MAX(date)::date as max_date FROM "UfcEvent"
                UNION ALL
                SELECT 'Fights', COUNT(*), NULL FROM "UfcFight"
                UNION ALL
                SELECT 'Odds', COUNT(*), MAX("eventDate")::date FROM "UfcOdds";T)capture_outputrL   z
[mma] Database Summary:)	r,   r3   ry   r   r   r   rP   rQ   rJ   )r_   rV   rX   s      r   mainr      s    89	
23	OGCRL>
-. ]FF 	&	
01 ]FVTST  d
 	)*fmm rE   __main__)N)__doc__r   r.   rr   urllib.requestr'   urllib.parserP   r   pathlibr   r   r   r,   r&   r9   rD   rZ   ry   r   r   r   __name__ rE   r   <module>r      sx   
 
       1	J ../.4n4=n39l!H zF rE   