+
    m[i:                         R t ^ RIt^ RIt^ RIHt ^ RIt^ RIHtHtHtH	t	H
t
HtHt R]/tRR ltR tR tR tR	 tR
 tR t]R8X  d
   ]! 4        R# R# )u  
Enrich properties with free government/scientific API data.

APIs used:
  - SoilGrids (ISRIC) — soil organic carbon, clay content, pH
  - Géorisques (BRGM)  — flood zones, seismic risk, clay shrink-swell

Usage:
    python3 enrich_apis.py                # Enrich all active with lat/lon
    python3 enrich_apis.py --limit 5      # Test on 5 properties
    python3 enrich_apis.py --dry-run      # Show what would be enriched
    python3 enrich_apis.py --force        # Re-enrich even if already done
N)datetime)loadsavepersistupsert	is_active	short_urlNOMINATIM_UAz
User-Agentc                    \        V 4      '       g   R# V P                  R4      '       d   V P                  R4      '       g   R# V'       g   V P                  R4      '       d   R# R# )z:Property has coordinates and hasn't been API-enriched yet.Flatlonapi_enrichedT)r   get)propforces   &&S/Users/jonathan/Documents/Zakelijk/ClaudeOS/03_Lab/farmmatch/scraper/enrich_apis.pyneeds_enrichmentr      sA    T??88E??$((5//TXXn--    c           
        RpRVRV R. RORR	R
R/p \         P                  ! W#\        ^R7      pVP                  ^8w  d   RRVP                   23# VP	                  4       p/ pVP                  R/ 4      P                  R. 4       F  pVP                  RR4      pVP                  R. 4      p	V	'       g   K1  V	^ ,          P                  R/ 4      P                  R4      p
V
f   K_  VR8X  d   V
^
,          VR&   Kt  VR8X  d   V
^
,          VR&   K  VR8X  g   K  V
^
,          VR&   K  	  VR3#   \         P
                   d   pR\        T4      R,          3u Rp?# Rp?ii ; i)z.Fetch soil properties from SoilGrids REST API.z6https://rest.isric.org/soilgrids/v2.0/properties/queryr   r   propertyocsclayphh2odepthz0-30cmvaluemeanparamsheaderstimeoutNHTTP 
propertieslayersname depthsvaluessoil_organic_carbon_t_hasoil_clay_pctsoil_phokNP   N)r   r   r   )requestsr   HEADERSstatus_codejsonRequestExceptionstr)r   r   urlr   rdataresultlayerr#   r%   vales   &&          r   fetch_soilgridsr:   &   sV   
BCss,F!LLWbI==C5000vvxXXlB/33HbAE99VR(DYYx,F)--"-11&9C{u}582X12*-('$'"Hy!# B& t|$$ !SVC[  !s*   >D+ CD+ D+ +E EEEc                d   V '       g   R# RpV P                  R4      pV P                  R4      pVe3   V^P8  d   VR,          pM!V^(8  d   VR,          pMV^8  d
   VR,          pVe4   RTu;8:  d   R8:  d   M M
VR,          pMVR	8  g   VR
8  d
   VR,          p\        R\        RV4      4      # )z1Simple soil quality 1-5 from organic carbon + pH.Ng      @r'   r)         ?      ?g      @g      @g      @g      !@      @)r   maxmin)	soil_datascoreocphs   &   r   soil_quality_scorerE   P   s    E	1	2B	y	!B	~8SLE2XSLE"WSLE	~"SLE#XcSLEsCUO$$r   c           
       a / p RpRV RV  2/p\         P                  ! W4\        ^R7      pVP                  ^8w  d   RRVP                   23# VP	                  4       pVP                  R4      pV'       d>   VP                  R4      ;'       g    VP                  R	4      pVe    \        V4      VR
&   VP                  R4      p	V	'       d>   V	P                  R4      ;'       g    V	P                  R4      p
V
e    \        V
4      VR&   VP                  R4      ;'       g    VP                  R4      pV'       dO   VP                  R4      ;'       g    VP                  R4      pV'       d   \        V4      P                  4       VR&   VP                  R4      ;'       g    / pVP                  R4      ;'       g    VP                  R4      ;'       g    . p\        V\        4      '       d   V'       d   V Uu. uF-  p\        V\        4      '       g   K  VP                  RR4      NK/  	  ppV Uu. uF-  p\        V\        4      '       g   K  VP                  RR4      NK/  	  ppWR&   V Uu. uF  pV'       g   K  VNK  	  upVR&   \        V4      VR&   0 R7mo\        ;QJ d    V3R lV 4       F  '       g   K   R M	  R!M! V3R lV 4       4      VR"&   VP                  R#4      ;'       g    VP                  R$4      pV'       dQ   \        V\        4      '       d   TMVP                  R%. 4      p\        V\        4      '       d   \        V4      M^ VR&&   VP                  R'4      pV'       dQ   \        V\        4      '       d   TMVP                  R%. 4      p\        V\        4      '       d   \        V4      M^ VR(&   VP                  R)4      ;'       g    VP                  R*4      pV'       Ed   \        V\        4      '       d   TMVP                  R%. 4      p\        V\        4      '       d   \        V4      VR+&   V Uu. uFD  p\        V\        4      '       g   K  VP                  R,R4      P                  4       R89   g   KB  VNKF  	  pp\        V4      VR-&   V Uu. uFM  p\        V\        4      '       g   K  R,\        VP                  R,R4      4      P                  4       9   g   KK  VNKO  	  pp\        V4      VR.&   VP                  R/4      pV'       dQ   \        V\        4      '       d   TMVP                  R%. 4      p\        V\        4      '       d   \        V4      M^ VR0&   VP                  R14      ;'       g    / p\        V\        4      '       d   TMVP                  R%. 4      p\        V\        4      '       d   \        V4      VR2&   VP                  R34      ;'       g    VP                  R34      ;'       g    . p\        V\        4      '       d   \        V4      VR4&   T'       g   \#        Y4      # TR63#   \        \        3 d    \        T4      TR&    ELi ; i  \        \        3 d    \        T
4      TR&    ELi ; iu upi u upi u upi u upi u upi   \         P                    d   pR\        T4      R5,          3u Rp?# Rp?ii ; i)9u&  Fetch comprehensive risk report from Géorisques API (all categories, one call).

Uses the combined report endpoint which returns:
seismic zone, flood risk, radon, clay shrink-swell, cavities,
ground movements, industrial installations (ICPE/Seveso), and more.
No authentication required (V1).
z:https://georisques.gouv.fr/api/v1/resultats_rapport_risquelatlon,r   Nr    zonage_sismiquezone_sismicite	code_zoneseismic_zoneseismic_zone_rawradonclasse_potentielpotentiel_radonradon_levelradon_level_rawrgaretrait_gonflement_argiles
expositionniveau	clay_riskgasparrisques_detailrisquescode_national_risquer$   libelle_risque_long
risk_codesrisk_labels
risk_countc              3   `   <"   T F#  p\        V4      ^8  g   K  VR,          S9   x  K%  	  R# 5i   :Nrb   NNlen.0cflood_prefixess   & r   	<genexpr>#fetch_georisques.<locals>.<genexpr>   s,     *fJqZ]^_Z`deZe+B1R5N+BJ   ..TFhas_flood_riskmouvements_terrainmvtr5   ground_movement_countcavitescavity_countinstallations_classeesicpe
icpe_countsevesoseveso_high_countseveso_any_countinstallations_nucleairesnuclear_countppr	ppr_countcatnatcatnat_countr+   r*      131415)
SEUIL_HAUTSHz
SEUIL HAUT)r-   r   r.   r/   r0   int
ValueError	TypeErrorr2   lower
isinstancelistdictrd   anyupperr1   _fetch_georisques_fallback)r   r   r6   r3   r   r4   r5   sismiquezonerN   catrS   rU   rX   rZ   r]   r^   lrn   itemsrp   rs   iseveso_items
seveso_all	nucleairerz   	ppr_itemsr|   r9   rh   s   &&                            @r   fetch_georisquesr   l   s    F[!Jse1SEN+LLWbI==C5000vvx 88-.<< 01NNX\\+5ND;-0YF>*
 !))./OO599=N3OC9,/HF=)
 hhuoGG*F!G.CC#''(2CJ&)*o&;&;&={# (#))r**-.MM&**Y2GMM2gt$$ELdWPZ[\^bPc;!%% 6;WJdELdWPZ[\^bPc;155!6;WKd#-< 0;$A1qQQ$AF=!#&w<F< /N'*s*fJ*fsss*fJ*f'fF#$ hh+,??%c400Ccggfb6IE<Fud<S<Sc%jYZF*+ ((9%)'488Ggkk&RT>UE3=eT3J3JSZPQF>" xx01EETXXf5E4&tT22D8LE%&&'*5z|$+0  c5aJq$4G !h 3 9 9 ;?a a !"5  c.1,.?*+). LA*Q2Ea&#aeeHb.A*B*H*H*JJ  a
 L-0_)* HH78	!+It!<!<I)--PVXZB[E4>ud4K4Kc%jQRF?# hhuo##%c400Ccggfb6I	i&&"%i.F; (#AAvzz(';AArfd##%([F>"
 )#334<c #I. ;14TF-.; #I. 903CF,-9 ed$A. cL* $$ !SVC[  !s[  A	Z3 (Z3 8Z3 Z3 'Y 5Z3 Z3 &Z3 =Y4 Z3 #Z3 =Z3 Z3 /3Z3 #Z3 >Z3  Z3 8Z3 <ZZ/Z3 5ZZ(
Z3 2
Z$Z$7Z3 2Z3 4Z3 A(Z3 7A'Z3 Z3 :AZ3 Z))"Z)Z)Z3 *Z.+Z.7Z.=(Z3 &A'Z3 A(Z3 7Z3 'Z3 Y1-Z3 0Y11Z3 4ZZ3 ZZ3 3[&[![&![&c                  a / p RpRV RV  2RR/p\         P                  ! W4\        ^R7      pVP                  ^8X  d   VP	                  4       P                  R. 4      pV'       d   V Uu. uF  qwP                  RR	4      NK  	  upVR
&   V Uu. uF-  qwP                  R4      '       g   K  VP                  RR	4      NK/  	  upVR&   \        V4      VR&   0 Rmo\        ;QJ d&    V3R lVR
,           4       F  '       g   K   RM	  RM! V3R lVR
,           4       4      VR&    RpRT RT  2/p\         P                  ! Y4\        ^R7      pTP                  ^8X  dE   TP	                  4       P                  R. 4      pT'       d   T^ ,          P                  RR4      TR&   T'       d   TR3# R# u upi u upi   \         P                   d     Li ; i  \         P                   d     LJi ; i)z=Fallback to individual endpoints if combined report is empty.z0https://georisques.gouv.fr/api/v1/gaspar/risquesrG   rH   rayoni  r   r5   r[   r$   r]   r\   r^   r_   c              3   `   <"   T F#  p\        V4      ^8  g   K  VR,          S9   x  K%  	  R# 5ira   rc   re   s   & r   ri   -_fetch_georisques_fallback.<locals>.<genexpr>   s.     .tPd1hklmhnrshs/Fqu/FPdrk   TFrl   z%https://georisques.gouv.fr/api/v1/rgarU   unknownrW   r*   r~   )Nzno data)r-   r   r.   r/   r0   rd   r   r1   )	r   r   r6   r3   r   r4   r5   drh   s	   &&      @r   r   r      s   F@se1SENGT:LLWbI==C668<<+DSW'XSWa.Db(ISW'X|$SW(xSWa[`[`av[w)I/Db)ISW(x}%'*4y|$!3+.3.tPVWcPd.t333.tPVWcPd.t+t'(
	5se1SEN+LLWbI==C668<<+D&*1gkk,	&J{# $FD>:)::) (Y(x $$  $$ s[   A"F< (F< ,F2
F< F7-F7>F< "F< 'A G G 2
F< <GGG/.G/c           
        V '       g   R# RpV P                  R4      pVe3   V^8  d   VR,          pM!V^8  d   VR,          pMV^8  d
   VR,          pV P                  R4      '       d
   VR,          pV P                  R	^ 4      pV^8  d   VR,          pMV^8  d
   VR,          pV P                  R
R4      pVR8X  d   VR,          pMVR8X  d
   VR,          pV P                  R4      pVe"   V^8  d   VR,          pMV^8  d
   VR,          pV P                  R^ 4      ^ 8  d   VR,          pM V P                  R^ 4      ^ 8  d
   VR,          pV P                  R^ 4      ^ 8  d
   VR,          pV P                  R^ 4      ^8  d
   VR,          pV P                  R^ 4      ^8  d
   VR,          pV P                  R^ 4      pV^
8  d   VR,          pMV^8  d
   VR,          p\        R\        R\        V^4      4      4      # )zComprehensive environmental risk score 1-5 (5 = safest).

Evaluates: seismic zone, flood risk, clay shrink-swell, radon,
ground movements, cavities, Seveso/ICPE, nuclear, natural disaster history.
Nr>   rL   g       @g      ?r=   rl   r<   r_   rW   r$   fortmoyeng      ?rQ   rv   rw   ry   ro   rq   r}   )r   r?   r@   round)	risk_datarB   seismicr_   r   rN   r|   s   &      r   
risk_scorer      s    E mmN+Ga<SLE\SLE\SLE }}%&& |Q/JQ	q ==b)Dv~	 MM-(EA:SLEaZTME }}(!,q0 
)1	-	1 }}_a(1, }},a0A5}}^Q'1, ]]>1-F|	1sCU5!_-..r   c            
      ^   \         P                  ! R R7      p V P                  R\        ^ RR7       V P                  RRRR7       V P                  R	RR
R7       V P	                  4       p\        4       pVP                  4        UUu. uF$  w  r4\        WAP                  4      '       g   K"  VNK&  	  pppVP                  '       d   VRVP                   p\        R\        V4       R24       \        R4       \        4        VP                  '       d   V F  p\        RV 24       K  	  R# V'       g   \        R4       R# ^ p^ p\        V4       EF  w  rW#,          p	V	R,          V	R,          r\        V4      p\        RV^,            R\        V4       RV R2RR7       / p\        W4      w  rV'       d&   VP!                  V4       \#        V4      pVe   VVR&   \$        P&                  ! R4       \)        W4      w  ppV'       dE   VP!                  V4       \+        V4      pVe%   VVR&   VR8  d   RVR&   MVR8  d   R VR&   MR!VR&   V'       Edj   \,        P.                  ! 4       P1                  4       VR"&   \3        W#V4       V^,          p. pV'       d%   VP5                  R#VP7                  RR$4       24       V'       d   VP5                  R%VP7                  RR$4       24       TP5                  R&VP7                  R'4      '       d   R(MR) 24       VP7                  R*4      pV'       d   VP5                  R+V 24       VP7                  R,4      pV'       d   VP5                  R-V 24       VP7                  R.^ 4      pV'       d   VP5                  R/V 24       \        R0R1P9                  V4       R224       MV^,          p\        R3V R4V R224       \$        P&                  ! R54       EK  	  \        R6V R\        V4       R7V R824       V^ 8  d   \;        V4       R# R# u uppi )9zEnrich properties with API data)descriptionz--limitzMax properties (0=all))typedefaulthelpz	--dry-run
store_truezShow what would be enriched)actionr   z--forcezRe-enrich already doneNu   API ENRICHMENT — z properties to enrichu-     APIs: SoilGrids (soil), Géorisques (risks)z  zNothing to do.r   r   z  [/z] z... )endrE   r=   r   g      @Laagrisk_profileg      @	GemiddeldHoogr   zsoil=?zrisk=zfloods=rl   YNrL   zseis=rQ   zradon=rv   zSEVESO=zOK (z, )zFAIL (soil=z, risk=g?z

Enriched z (z failed))argparseArgumentParseradd_argumentr   
parse_argsr   r   r   r   limitprintrd   dry_run	enumerater   r:   updaterE   timesleepr   r   r   now	isoformatr   appendr   joinr   )parserargsstorer3   p
candidatesenrichedfailedr   r   r   r   	url_shortfieldssoilsoil_statussqrisksrisk_statusrspartsseisrN   ru   s                           r   mainr   L  s   $$1RSF
	Q=UV
L?\]
	,=UVDFE$)KKMUM&#5Ea5T##MJUzzz,
	J00E
FG	9;	G|||CBse* HFJ'z;UScN	AaC5#j/*"YKs;E ,C5MM$#D)B~/1+, 	

3-c7{MM% E"B~')|$9-3F>*3Y-8F>*-3F>*6%-\\^%=%=%?F>"5v&MHEuVZZ0Dc%J$KLMuVZZc%B$CDEweii8H.I.Iss&STUyy0LL50		-0LL6%!12#6:LL76(!34D5)*!,-aKFK}GK=BC 	

3u (x 
Kz3z?"32fXX
FG!| g Vs   P)*P)__main__)F)__doc__r   r   r   r-   r   r   r   r   r   r   r   r	   
USER_AGENTr.   r   r:   rE   r   r   r   r   __name__ r   r   <module>r      sj        _ _ _
$'!T%8l^ ;FI/\\~ zF r   