Ë
    L©ði‘x  ã                  óâ  — d Z ddl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Zddl	Z	ddl
m
Z
mZ ddlmZmZmZmZ ddlZddlmZ  e«        ddlZddlmZ ddlmZ dd	lmZmZmZ dd
lmZmZ ddl m!Z!m"Z"m#Z#m$Z$  ejJ                  d«      Z& ejJ                  d«      Z'dZ(dZ) e
jT                  ejV                  «      Z,e'r ejZ                  e'¬«      ndZ.ej^                  ja                  ej^                  jc                  e2«      d«      Z3g d¢Z4dZ5d@d„Z6dAd„Z7dBd„Z8dCd„Z9dBd„Z:dDd„Z;dEdFd„Z<dGd„Z=dHd„Z>dBd„Z?dId„Z@dBd„ZAdJd „ZB	 	 	 	 	 	 dKd!„ZCe#jˆ                  e#jŠ                  e#jŒ                  e#jŽ                  e#j�                  e#j’                  d"œZJe!j–                  e!j˜                  e!jš                  e!jœ                  d#œZOe$j                   e$j¢                  e$j¤                  d$œZSej¨                  ej¢                  ejª                  d%œZVej®                  ej°                  ej²                  d&œZZdLd'„Z[dMd(„Z\dNd)„Z]dOd*„Z^dPd+„Z_dQd,„Z`dRd-„ZadSd.„ZbdTd/„ZcdUd0„ZddVd1„ZedWd2„ZfdXdYd3„Zgehd4k(  r‰ ejÒ                  d5¬6«      Zjejj×                  d7d8d9¬:«       ejj×                  d;d8d<¬:«       ejj×                  d=d8d>¬:«       ejjÙ                  «       Zm egemjÜ                  emjÞ                  emjà                  ¬?«       yy)Zu   
enrich.py â€” Fetch real plant species from Perenual, enrich agronomic traits
with Claude AI, then populate graft combinations.

Run from /backend:
    python -m app.seeds.enrich            # adds to existing data
    python -m app.seeds.enrich --reset    # clears plants + grafts first
é    )ÚannotationsN)ÚdatetimeÚtimezone)ÚAnyÚDictÚListÚOptional)Úload_dotenv)ÚSessionLocal)ÚGraftCombination)ÚPlantÚRootDepthCategoryÚVarietyType)ÚScenarioÚScenarioResult)ÚDrainageRateÚSoilProfileÚSoilTypeÚWaterRetentionÚPERNUAL_API_KEYÚANTHROPIC_API_KEYzhttps://perenual.com/apizclaude-sonnet-4-6)Úapi_keyzperenual_cache.json)+Útomatozcherry tomatoÚpepperzchili pepperÚeggplantÚ	aubergineÚ	tomatilloÚcucumberÚmelonÚ
watermelonÚsquashÚzucchiniÚpumpkinzbitter melonÚluffaÚappleÚpearÚcitrusÚlemonÚorangeÚpeachÚplumÚcherryÚapricotÚmangoÚavocadoÚfigÚpomegranateÚguavaÚgrapeÚ
strawberryÚ	blueberryÚlettuceÚspinachÚkaleÚbroccoliÚcarrotÚpotatozsweet potatoÚonionÚgarlicÚ	artichokeÚ	asparagusé   c                ó”   — t         |d<   t        j                  t        › | › �|d¬«      }|j	                  «        |j                  «       S )NÚkeyé   )ÚparamsÚtimeout)ÚPERENUAL_KEYÚrequestsÚgetÚPERENUAL_BASEÚraise_for_statusÚjson)ÚpathrD   Úresps      úE/var/www/acinvestment.org/public_html/aci/backend/app/seeds/enrich.pyÚ_perenual_getrO   L   s>   € Ü €Fˆ5�MÜ�<‰<œ=˜/¨$¨Ð0¸ÈÔL€DØ×ÑÔØ�9‰9‹;Ðó    c                ó   — d| › d|› d�S )Nz.Generate exactly 30 edible plant species for: z^

Return a JSON array of exactly 30 objects. Each object:
{
  "id": <unique int starting from zì>,
  "common_name": "<common name>",
  "scientific_name": ["<scientific name>"],
  "cycle": "<Annual|Biennial|Perennial>",
  "watering": "<Frequent|Average|Minimum>",
  "drought_tolerant": <true|false>,
  "salt_tolerant": <true|false>
}© )ÚgroupsÚstart_ids     rN   Ú_species_promptrU   S   s%   € Ø=¸f¸Xð F#ð $, *ð -ð	ð rP   c                 ól   — t        t        dd¬«      d¬«      } t        t        dd¬«      d¬«      }| |z   S )z.Two batches of 30 to stay within token limits.a  Solanaceae (tomato varieties, cherry tomato, beef tomato, roma tomato, pepper, chili, bell pepper, eggplant, tomatillo), Cucurbitaceae (cucumber, melon, watermelon, squash, zucchini, pumpkin, bitter melon, luffa), Citrus (lemon, orange, lime, grapefruit, mandarin, pomelo)é   )rT   é¸  ©Ú
max_tokensa  Fruit trees (apple, pear, peach, plum, cherry, apricot, mango, avocado, fig, pomegranate, guava), Grapes and berries (grape, strawberry, blueberry, raspberry), Vegetables (lettuce, spinach, kale, broccoli, carrot, potato, sweet potato, onion, garlic, artichoke, asparagus)é   )Ú_ask_clauderU   ©Úbatch_aÚbatch_bs     rN   Úgenerate_species_with_clauder`   b   sS   € äœ/ð	Eð ô	ð
 ô€Gô œ/ð	{ð ô	ð
 ô€Gð �WÑÐrP   c                óF   — t        d| dddœ«      }|j                  dg «      S )Nz/species-listrW   )ÚqÚedibleÚpageÚdata)rO   rH   )Úqueryre   s     rN   Úfetch_species_listrg   u   s&   € Ü˜°ÀÈAÑ*NÓO€DØ�8‰8�F˜BÓÐrP   c                 óÂ   — t         j                  j                  t        «      r.t	        t        «      5 } t        j                  | «      cd d d «       S g S # 1 sw Y   g S xY w©N)ÚosrL   ÚexistsÚ
CACHE_FILEÚopenrK   Úload)Úfs    rN   Ú
load_cacherp   z   sF   € Ü	‡w�w‡~�~”jÔ!Ü”*Óð 	  Ü—9‘9˜Q“<÷	 ñ 	 à€I÷	 à€Iús   ³AÁAc                ó¢   — t        t        d«      5 }t        j                  | |d¬«       d d d «       t	        dt        › �«       y # 1 sw Y   ŒxY w)NÚwé   )Úindentu     Cache saved â†’ )rm   rl   rK   ÚdumpÚprint)re   ro   s     rN   Ú
save_cacherw   �   sC   € Ü	Œj˜#Ó	ð % !Ü�	‰	�$˜ !Õ$÷%ä	Ðœz˜lÐ
+Õ,÷%ð %ús   ‘AÁAc                ó  — t         €t        d«      ‚t         j                  j                  t        |dd| dœg¬«      }|j
                  d   j                  j                  «       }|j                  d«      r:|j                  d«      d   }|j                  d	«      r|d
d  }|j                  «       }t        j                  |«      }t        |t        «      r,|j                  «       D ]  }t        |t        «      sŒ|c S  |gS |S )Nz#ANTHROPIC_API_KEY is not configuredu—   You are an expert horticulturist and agronomist. Always respond with a valid JSON array only â€” no markdown fences, no commentary, no wrapping object.Úuser)ÚroleÚcontent)ÚmodelrZ   ÚsystemÚmessagesr   z```rW   rK   é   )Ú_aiÚRuntimeErrorr~   ÚcreateÚMODELr{   ÚtextÚstripÚ
startswithÚsplitrK   ÚloadsÚ
isinstanceÚdictÚvaluesÚlist)ÚpromptrZ   ÚmsgÚrawÚresultÚvs         rN   r\   r\   ‹   së   € Ü
€{ÜÐ@ÓAÐAä
�,‰,×
Ñ
ÜØð iØ!¨fÑ5Ð6ð	 ó €Cð �+‰+�a‰.×
Ñ
×
#Ñ
#Ó
%€CØ
‡~�~�eÔØ�i‰i˜Ó˜qÑ!ˆØ�>‰>˜&Ô!Ø�a�b�'ˆCØ�i‰i‹kˆÜ�Z‰Z˜‹_€Fä�&œ$ÔØ—‘“ò 	ˆAÜ˜!œTÕ"Ø’ð	ð ˆxˆØ€MrP   c                óT   — dj                  d„ | D «       «      }d|› d�}t        |«      S )uG   Send Perenual species data to Claude â†’ structured ACI plant profiles.ú
c              3  ó$  K  — | ]ˆ  }d |j                  dd«      › ddj                  |j                  ddg«      «      › d|j                  dd«      › d|j                  d	d«      › d
|j                  dd«      › d|j                  dd«      › �–— ŒŠ y­w)z- Úcommon_nameú?ú (z, Úscientific_namez) | cycle: Úcyclez | watering: Úwateringz | drought_tolerant: Údrought_tolerantFz | salt_tolerant: Úsalt_tolerantN)rH   Újoin©Ú.0Úps     rN   ú	<genexpr>z enrich_scions.<locals>.<genexpr>«   sž   è ø€ ò ð ð ˆQ�U‰U�= Ó%Ð& b¨¯©°1·5±5Ð9JÈSÈEÓ3RÓ)SÐ(Tð UØ—U‘U˜7 3Ó'Ð(Ø
˜Ÿ™˜j¨Ó-Ð.Ø
 §¡Ð&8¸%Ó @ÐAØ
˜QŸU™U ?°EÓ:Ð;ô		=ñùs   ‚BBz;I have these real plant species from a botanical database:
u»  

For each plant, generate a complete ACI agronomic profile. Return a JSON array â€” one object per plant â€” with exactly these fields:

{
  "name": "<common cultivar name>",
  "species": "<scientific name>",
  "variety_type": "scion",
  "drought_tolerance": <int 1-10>,
  "salinity_tolerance": <int 1-10>,
  "heat_tolerance": <int 1-10>,
  "cold_tolerance": <int 1-10>,
  "disease_resistance": {"<disease_name>": <int 1-10>},
  "optimal_ph_min": <float>,
  "optimal_ph_max": <float>,
  "nutrient_uptake_efficiency": {"N": <float>, "P": <float>, "K": <float>},
  "root_depth_category": "<shallow|medium|deep>",
  "growth_cycle_days": <int, days from transplant to first harvest>,
  "yield_potential_kg_per_plant": <float, realistic kg per plant>,
  "description": "<2-sentence agronomic description covering key traits and production notes>"
}

Rules:
- disease_resistance: include 3-5 diseases relevant to that crop family with integer scores 1-10
- nutrient_uptake_efficiency: N/P/K floats around 1.0 (1.2 = 20% more efficient than baseline)
- Base all values on established agronomic science â€” be precise, not generic
- yield_potential_kg_per_plant: realistic figure for a single plant in ideal conditions)r�   r\   )Ú
raw_plantsÚsummaryr�   s      rN   Úenrich_scionsr¤   ©   sD   € à�i‰iñ ð ôó €GðØ€	ð 
Xð[€Fô: �vÓÐrP   c                ó   — d| › d|› d�S )Nz@Generate exactly 6 well-known grafting rootstock cultivars for: z!.
Use these real cultivar names: aÀ  

Return a JSON array of exactly 6 objects. Each object:
{
  "name": "<cultivar name>",
  "species": "<scientific name>",
  "variety_type": "rootstock",
  "drought_tolerance": <int 1-10>,
  "salinity_tolerance": <int 1-10>,
  "heat_tolerance": <int 1-10>,
  "cold_tolerance": <int 1-10>,
  "disease_resistance": {"<disease>": <int 1-10>, "<disease>": <int 1-10>, "<disease>": <int 1-10>},
  "optimal_ph_min": <float>,
  "optimal_ph_max": <float>,
  "nutrient_uptake_efficiency": {"N": <float>, "P": <float>, "K": <float>},
  "root_depth_category": "<shallow|medium|deep>",
  "growth_cycle_days": <int>,
  "yield_potential_kg_per_plant": 0.0,
  "description": "<one sentence on key traits and use case>"
}rR   ©ÚfamiliesÚexampless     rN   Ú_rootstock_promptr©   Ô   s$   € ØOÐPXÈzð Z Ø (˜zð *ðð rP   c                 ó¢   — t        t        dd¬«      d¬«      } t        t        dd¬«      d¬«      }t        t        dd	¬«      d¬«      }| |z   |z   S )
z/Three batches of 6 to stay within token limits.ztomato/solanaceae vegetablesz3Beaufort, Maxifort, Arnold, Brigeor, He-Man, Cobaltr¦   rX   rY   z/cucurbit vegetables (cucumber/melon/watermelon)z7RS841, Ferro, Shintoza, Strong Tosa, Macis, Tetsukabutoz0apple, pear, stone fruit (Prunus), grape (Vitis)z2M.9, MM.106, Quince A, Gisela 6, St. Julien A, SO4)r\   r©   )r^   r_   Úbatch_cs      rN   Úgenerate_rootstocksr¬   ì   so   € äÔ+Ø/ØFôð ô€Gô
 Ô+ØBØJôð ô€Gô
 Ô+ØCØEôð ô€Gð
 �WÑ˜wÑ&Ð&rP   c                ó   — d| › d�S )NzAGenerate exactly 6 soil profiles for these agricultural regions: aÚ  

Return a JSON array of exactly 6 objects:
{
  "name": "<descriptive name e.g. 'Nile Delta Silt'>",
  "soil_type": "<sandy|loam|clay|silt|peat|chalky>",
  "ph_level": <float>,
  "organic_matter_percent": <float>,
  "drainage_rate": "<poor|moderate|good|excessive>",
  "water_retention": "<low|medium|high>",
  "native_nitrogen": <float ppm>,
  "native_phosphorus": <float ppm>,
  "native_potassium": <float ppm>,
  "salinity_level": <float dS/m>,
  "temperature_range_min": <float Celsius>,
  "temperature_range_max": <float Celsius>,
  "description": "<one sentence on origin and crop suitability>",
  "climate_zone": "<arid|semi-arid|mediterranean|temperate|tropical|subtropical|continental>"
}

Use realistic agronomic values.rR   )Úregionss    rN   Ú_soil_promptr¯      s   € ØPÐQXÐPYð Z ð #ð #rP   c                 ód   — t        t        d«      d¬«      } t        t        d«      d¬«      }| |z   S )z3Two batches of 6 soils to stay within token limits.zÓUAE/Gulf desert (arid saline sandy), Nile Delta (fertile silt), Mediterranean basin (loam), Northern European lowland (heavy clay), Tropical volcanic Indonesia (andisol), California Central Valley (fertile loam)iÐ  rY   zãAmazon basin (tropical acidic low-P), Sahel West Africa (semi-arid sandy), Rhine-Po alluvial plain (temperate silt), South African Karoo (semi-arid chalky), Southeast Asian paddy (waterlogged clay), Andean highland (cold peaty))r\   r¯   r]   s     rN   Úgenerate_soilsr±     sI   € äœ,ð	Zóð ô	€Gô œ,ð	Qóð ô	€Gð �WÑÐrP   c                ó   — d|› d| › d|› d�S )Nz*Generate graft combinations. Family rule: z


SCIONS:
z

ROOTSTOCKS:
a5  

Return a JSON array of the 5 most relevant/successful combinations. Each object:
{
  "rootstock_id": "<exact UUID from rootstocks above>",
  "scion_id": "<exact UUID from scions above>",
  "compatibility_score": <float 0.65-1.0>,
  "vigor_boost": <float>,
  "yield_modifier": <float>,
  "stress_tolerance_override": {"drought_tolerance": <int>, "salinity_tolerance": <int>, "heat_tolerance": <int>},
  "notes": "<concise one-sentence note>",
  "source_reference": "<short citation>"
}

Rule: Return exactly 5 objects. Use ONLY the UUIDs listed above. Be concise.
rR   )Úscion_linesÚrootstock_linesÚfamily_rules      rN   Ú_graft_promptr¶   )  s2   € Ø9¸+¸ð Gð €ð ð Ð ð ðð rP   c           	     ó^  — dd„}dd„}| D �cg c]  } ||«      sŒ|‘Œ }}| D �cg c]  } ||«      sŒ|‘Œ }}|D �cg c]  } ||«      sŒ|‘Œ }}|D �cg c]  } ||«      sŒ|‘Œ }}g }	|rq|rot        dt        |«      d«      D ]V  }
||
|
dz    }dj                  d„ |D «       «      }dj                  d„ |D «       «      }	 |	t        t	        ||d«      d	¬
«      z  }	ŒX |rq|rot        dt        |«      d«      D ]V  }
||
|
dz    }dj                  d„ |D «       «      }dj                  d„ |D «       «      }	 |	t        t	        ||d«      d	¬
«      z  }	ŒX | D �cg c]  } ||«      rŒ ||«      rŒ|‘Œ }}|D �cg c]  } ||«      rŒ ||«      rŒ|‘Œ }}|rq|rot        dt        |«      d«      D ]V  }
||
|
dz    }dj                  d„ |D «       «      }dj                  d„ |D «       «      }	 |	t        t	        ||d«      d	¬
«      z  }	ŒX |	S c c}w c c}w c c}w c c}w # t
        $ r"}t        d|
dz  dz   › d|› �«       Y d}~�Œ½d}~ww xY w# t
        $ r"}t        d|
dz  dz   › d|› �«       Y d}~�Œxd}~ww xY wc c}w c c}w # t
        $ r!}t        d|
dz  dz   › d|› �«       Y d}~Œúd}~ww xY w)z,Split by plant family to keep prompts small.c                óz   ‡— | j                   | j                  z   j                  «       Št        ˆfd„dD «       «      S )Nc              3  ó&   •K  — | ]  }|‰v –— Œ
 y ­wri   rR   ©rŸ   ÚkÚss     €rN   r¡   zFgenerate_graft_combinations.<locals>.is_solanaceous.<locals>.<genexpr>I  ó   øè ø€ ò  _˜a�1˜”6ñ  _ùó   ƒ)
ÚsolanumÚcapsicumÚlycopersicumÚ	melongenaÚphysalisr   r   r   r   r   ©ÚspeciesÚnameÚlowerÚany©r    r¼   s    @rN   Úis_solanaceousz3generate_graft_combinations.<locals>.is_solanaceousG  ó?   ø€ Ø�Y‰Y˜Ÿ™Ñ×&Ñ&Ó(ˆÜó  _ð  $^ô  _ó  _ð  	_rP   c                óz   ‡— | j                   | j                  z   j                  «       Št        ˆfd„dD «       «      S )Nc              3  ó&   •K  — | ]  }|‰v –— Œ
 y ­wri   rR   rº   s     €rN   r¡   zCgenerate_graft_combinations.<locals>.is_cucurbit.<locals>.<genexpr>M  r½   r¾   )ÚcucumisÚ	cucurbitaÚ	citrullusr$   Ú	momordicar   r   r!   r"   r#   ÚgourdrÄ   rÉ   s    @rN   Úis_cucurbitz0generate_graft_combinations.<locals>.is_cucurbitK  rË   rP   r   r@   r“   c              3  óp   K  — | ].  }d |j                   › d|j                  › d|j                  › d�–— Œ0 y­w©z  id=z | r—   ú)N©ÚidrÆ   rÅ   rž   s     rN   r¡   z.generate_graft_combinations.<locals>.<genexpr>Z  ó1   è ø€ ÒYÈA %¨¯© v¨S°·±°¸¸1¿9¹9¸+ÀQÔ GÑYùó   ‚46c              3  óp   K  — | ].  }d |j                   › d|j                  › d|j                  › d�–— Œ0 y­wrÕ   r×   rž   s     rN   r¡   z.generate_graft_combinations.<locals>.<genexpr>[  ó1   è ø€ Ò[ÈA %¨¯© v¨S°·±°¸¸1¿9¹9¸+ÀQÔ GÑ[ùrÚ   z3solanaceous scions onto solanaceous rootstocks onlyi   rY   z#  Warning: solanaceous graft batch rW   u    failed â€” Nc              3  óp   K  — | ].  }d |j                   › d|j                  › d|j                  › d�–— Œ0 y­wrÕ   r×   rž   s     rN   r¡   z.generate_graft_combinations.<locals>.<genexpr>d  rÙ   rÚ   c              3  óp   K  — | ].  }d |j                   › d|j                  › d|j                  › d�–— Œ0 y­wrÕ   r×   rž   s     rN   r¡   z.generate_graft_combinations.<locals>.<genexpr>e  rÜ   rÚ   z-cucurbit scions onto cucurbit rootstocks onlyz   Warning: cucurbit graft batch c              3  óp   K  — | ].  }d |j                   › d|j                  › d|j                  › d�–— Œ0 y­wrÕ   r×   rž   s     rN   r¡   z.generate_graft_combinations.<locals>.<genexpr>q  rÙ   rÚ   c              3  óp   K  — | ].  }d |j                   › d|j                  › d|j                  › d�–— Œ0 y­wrÕ   r×   rž   s     rN   r¡   z.generate_graft_combinations.<locals>.<genexpr>r  s1   è ø€ Ò]ÈA %¨¯© v¨S°·±°¸¸1¿9¹9¸+ÀQÔ GÑ]ùrÚ   z-fruit/grape scions onto compatible rootstocksz#  Warning: fruit/grape graft batch )r    r   ÚreturnÚbool)ÚrangeÚlenr�   r\   r¶   Ú	Exceptionrv   )ÚscionsÚ
rootstocksrÊ   rÓ   r    Ú
sol_scionsÚ
cuc_scionsÚ	sol_rootsÚ	cuc_rootsÚresultsÚiÚbatch_sÚlines_sÚlines_rÚeÚother_scionsÚother_rootss                    rN   Úgenerate_graft_combinationsrô   B  s  € ó
_ó_ð $Ö9˜¡~°aÕ'8’!Ð9€JÐ9Ø$Ö7˜©°A­’1Ð7€JÐ7Ø(Ö>˜©N¸1Õ,=’1Ð>€IÐ>Ø(Ö;˜©K¸­N’1Ð;€IÐ;à€Gá‘iä�qœ#˜j›/¨1Ó-ò 	WˆAØ   Q¨¡UÐ+ˆGØ—i‘iÑYÐQXÔYÓYˆGØ—i‘iÑ[ÐQZÔ[Ó[ˆGðWØœ;¤}°W¸gÐG|Ó'}ð  KOô  Pñ  P‘ð	Wñ ‘iÜ�qœ#˜j›/¨1Ó-ò 	TˆAØ   Q¨¡UÐ+ˆGØ—i‘iÑYÐQXÔYÓYˆGØ—i‘iÑ[ÐQZÔ[Ó[ˆGðTØœ;¤}°W¸gÐGvÓ'wð  EIô  Jñ  J‘ð	Tð  &ÖV˜!©^¸AÕ->Á{ÐSTÅ~’AÐV€LÐVØ)ÖZ˜!±ÀÕ1BÉ;ÐWXÍ>’AÐZ€KÐZÙ™Ü�qœ#˜lÓ+¨QÓ/ò 	WˆAØ" 1 q¨1¡uÐ-ˆGØ—i‘iÑYÐQXÔYÓYˆGØ—i‘iÑ]ÐQ\Ô]Ó]ˆGðWØœ;¤}°W¸gÐGvÓ'wð  EIô  Jñ  J‘ð	Wð €NùòS :ùÚ7ùÚ>ùÚ;øô ò WÜÐ;¸A¸q¹DÀ1¹H¸:À\ÐRSÐQTÐU×VÒVûðWûô ò TÜÐ8¸¸A¹À¹¸
À,ÈqÈcÐR×SÒSûðTüò WùÚZøô ò WÜÐ;¸A¸q¹DÀ1¹H¸:À\ÐRSÐQTÐU×VÑVûðWús—   �H›H¥H³H½HÁHÁHÁ#HÃHÄ4I
ÅI8Å#I8Å,I8Å6I=ÆI=ÆI=Ç)JÈ	IÈ%IÉIÉ
	I5ÉI0É0I5Ê	J,ÊJ'Ê'J,)ÚsandyÚloamÚclayÚsiltÚpeatÚchalky)ÚpoorÚmoderateÚgoodÚ	excessive)ÚlowÚmediumÚhigh)Úshallowr   Údeep)ÚscionÚ	rootstockÚbothc                ój   — t        | xs d«      j                  «       }t        j                  dd|«      S )NÚ z\s+ú )Ústrr…   ÚreÚsub)Úvaluer„   s     rN   Ú_normalize_textr  —  s,   € ÜˆuŠ{˜Ó×!Ñ!Ó#€DÜ�6‰6�&˜#˜tÓ$Ð$rP   c                 ó4   — | D ]  }t        |«      }|sŒ|c S  y)Nr  )r  )r‹   r  r„   s      rN   Ú_first_nonemptyr  œ  s(   € Øò ˆÜ˜uÓ%ˆÚØŠKðð rP   c                óž   — | j                  d«      xs i }t        |t        «      sy dD ]"  }t        |j                  |«      «      }|sŒ |c S  y )NÚdefault_image)Úregular_urlÚ
medium_urlÚ	small_urlÚ	thumbnailÚoriginal_url)rH   r‰   rŠ   r  )r�   ÚimagerB   Úurls       rN   Ú_perenual_image_urlr  ¤  sP   € Ø�G‰G�OÓ$Ò*¨€EÜ�eœTÔ"ØàVò ˆÜ˜eŸi™i¨›nÓ-ˆÚØŠJðð rP   c                óZ   — | j                  «       }d|v sd|v ryd|v sd|v ryd|v sd|v ry	y)
NÚminimumrÿ   é   Úaveragerü   é   Úfrequentr  r@   ©rÇ   )rš   Úwatering_values     rN   Ú_watering_to_drought_tolerancer#  °  sG   € Ø—^‘^Ó%€NØ�NÑ" e¨~Ñ&=ØØ�NÑ" j°NÑ&BØØ�^Ñ# v°Ñ'?ØØrP   c                óB   — | j                  «       }d|v ryd|v ryd|v ryy)NÚannualéx   Úbiennialim  Ú	perennialiÚ  é´   r!  )r™   Úcycle_values     rN   Ú_cycle_to_growth_daysr+  »  s1   € Ø—+‘+“-€KØ�;ÑØØ�[Ñ ØØ�kÑ!ØØrP   c                óÞ   ‡— | › d|› �j                  «       Št        ˆfd„dD «       «      rt        j                  S t        ˆfd„dD «       «      rt        j                  S t        j
                  S )Nr	  c              3  ó&   •K  — | ]  }|‰v –— Œ
 y ­wri   rR   ©rŸ   ÚkeywordÚhaystacks     €rN   r¡   z$_infer_root_depth.<locals>.<genexpr>È  s   øè ø€ ò  F 7ˆ7�hÔñ  Fùr¾   )	Útreer%   r&   r'   r.   r/   r3   r0   r1   c              3  ó&   •K  — | ]  }|‰v –— Œ
 y ­wri   rR   r.  s     €rN   r¡   z$_infer_root_depth.<locals>.<genexpr>Ê  s   øè ø€ Ò
f 7ˆ7�hÔÑ
fùr¾   )r6   r7   r<   r=   r4   )rÇ   rÈ   r   r  r  r   )rÆ   rÅ   r0  s     @rN   Ú_infer_root_depthr3  Æ  sj   ø€ Ø��q˜˜	Ð"×(Ñ(Ó*€HÜ
ó  Fð  /Eô  Fô  FÜ ×%Ñ%Ð%Ü
Ó
fÐ.eÔ
fÔfÜ ×(Ñ(Ð(Ü×#Ñ#Ð#rP   c                ó   — t        | j                  d«      | j                  d«      r| j                  dd g«      d   nd d«      }| j                  d«      xs g }t        |r|d   nd |«      }t        | j                  d«      «      }t        | j                  d«      «      }t        |«      }| j                  d«      d	u rt	        d
|dz   «      }| j                  d«      d	u rdnd}d|› d|› d�g}|r|j                  d|› d�«       |r|j                  d|› d�«       i d|d d “d|d d “dd“d|“d|“dd“dd“d i “d!d"“d#d$“d%d&d&d&d'œ“d(t        ||«      j                  “d)t        |«      “d*d+“d,d-j                  |«      d d. “d/t        | «      “S )0Nr•   Ú
other_namer   zUnknown plantr˜   r™   rš   r›   Té
   rs   rœ   é   r   zImported from Perenual as r—   z).zLifecycle: ú.zWatering guidance: rÆ   éÿ   rÅ   Úvariety_typer  Údrought_toleranceÚsalinity_toleranceÚheat_toleranceé   Úcold_tolerancer  Údisease_resistanceÚoptimal_ph_minç      @Úoptimal_ph_maxç      @Únutrient_uptake_efficiencyç      ð?©ÚNÚPÚKÚroot_depth_categoryÚgrowth_cycle_daysÚyield_potential_kg_per_plantç        Údescriptionr	  iè  Ú	image_url)r  rH   r  r#  ÚminÚappendr3  r  r+  r�   r  )	r�   r•   Úscientific_namesrÅ   r™   rš   r;  r<  Údescription_bitss	            rN   Úperenual_species_to_plant_dictrU  Ï  s;  € Ü! #§'¡'¨-Ó"8Ð^a×^eÑ^eÐfrÔ^s¸#¿'¹'À,ÐQUÐPVÓ:WÐXYÒ:ZÐy}ð  @Oó  P€KØ—w‘wÐ0Ó1Ò7°RÐÜÑ5EÐ.¨qÒ1È4ÐQ\Ó]€GÜ˜CŸG™G GÓ,Ó-€EÜ˜sŸw™w zÓ2Ó3€Hä6°xÓ@ÐØ
‡w�wÐ!Ó" dÑ*Ü Ð$5¸Ñ$9Ó:Ðà!Ÿg™g oÓ6¸$Ñ>™ÀAÐà
$ [ M°°G°9¸BÐ?ðÐñ Ø×Ñ +¨e¨W°AÐ 6Ô7ÙØ×ÑÐ"5°h°Z¸qÐ AÔBðØ�˜D˜SÐ!ðà�7˜4˜C�=ðð 	˜ðð 	Ð.ð	ð
 	Ð0ðð 	˜!ðð 	˜!ðð 	˜bðð 	˜#ðð 	˜#ðð 	%¨C°cÀÑ&Dðð 	Ô0°¸gÓF×LÑLðð 	Ô2°5Ó9ðð 	'¨ðð 	�s—x‘xÐ 0Ó1°%°4Ð8ðð  	Ô(¨Ó-ð!ð rP   c                ó|  — g }t        | «      D ]«  \  }}t        |«      }|t        |«      k  rt        ||   t        «      r||   ni }i |¥|¥}t        |j                  d«      |d   «      d d |d<   t        |j                  d«      |d   «      d d |d<   |j                  d«      |d<   |j                  |«       Œ­ |S )NrÆ   r9  rÅ   rP  )Ú	enumeraterU  rä   r‰   rŠ   r  rH   rR  )Ú	raw_batchÚenriched_batchÚmergedÚindexr�   ÚfallbackÚai_dataÚmerged_items           rN   Úmerge_enriched_plant_datar_  ÷  sÚ   € Ø#%€Fä 	Ó*ò #‰
ˆˆsÜ1°#Ó6ˆØ+0´3°~Ó3FÒ+FÌ:ÐVdÐejÑVkÔmqÔKr�. Ò'ÐxzˆØ-˜Ð- WÐ-ˆÜ-¨k¯o©o¸fÓ.EÀxÐPVÑGWÓXÐY]ÐZ]Ð^ˆ�FÑÜ!0°·±ÀÓ1KÈXÐV_ÑM`Ó!aÐbfÐcfÐ!gˆ�IÑØ#+§<¡<°Ó#<ˆ�KÑ Ø�‰�kÕ"ð#ð €MrP   c                ó
  — | j                  t        «      j                  t        j                  |j                  k(  t        j                  |j                  k(  t        j
                  |j
                  k(  «      j                  «       }|€| j                  |«       |S |j                  |_        |j                  |_	        |j                  |_
        |j                  |_        |j                  |_        |j                  |_        |j                  |_        |j                  |_        |j                   |_        |j"                  |_        |j$                  |_        |j&                  |_        |j(                  |_        t*        |_        |S ri   )rf   r   ÚfilterrÆ   rÅ   r:  Úone_or_noneÚaddr;  r<  r=  r?  r@  rA  rC  rE  rK  rL  rM  rO  rP  ÚNOWÚ
updated_at)ÚdbÚplantÚexistings      rN   Úupsert_plantri    s2  € à
�‰”‹ß	‰Ü�J‰J˜%Ÿ*™*Ñ$Ü�M‰M˜UŸ]™]Ñ*Ü×Ñ %×"4Ñ"4Ñ4ó

÷
 
‰‹ð ð ÐØ
�‰ˆuŒØˆà!&×!8Ñ!8€HÔØ"'×":Ñ":€HÔØ#×2Ñ2€HÔØ#×2Ñ2€HÔØ"'×":Ñ":€HÔØ#×2Ñ2€HÔØ#×2Ñ2€HÔØ*/×*JÑ*J€HÔ'Ø#(×#<Ñ#<€HÔ Ø!&×!8Ñ!8€HÔØ,1×,NÑ,N€HÔ)Ø ×,Ñ,€HÔØŸ™€HÔÜ€HÔØ€OrP   c                ó–   — g }|D ]1  }t        t        |«      «      }|j                  t        | |«      «       Œ3 | j	                  «        |S ri   )Údict_to_plantrU  rR  ri  Úcommit)rf  r¢   Ú	persistedÚitemrg  s        rN   Úpersist_raw_scionsro  &  sL   € Ø€Iàò 2ˆÜÔ<¸TÓBÓCˆØ×Ñœ b¨%Ó0Õ1ð2ð ‡I�I„KØÐrP   c                óú  — t        d!i dt        j                  «       “dt        | d   «      d d “dt        j                  | j                  dd«      t        j                  «      “dt        | j                  dd«      «      “dt        | j                  dd	«      «      “d
t        j                  | j                  d
d«      t        j                  «      “dt        j                  | j                  dd«      t        j                  «      “dt        | j                  dd«      «      “dt        | j                  dd«      «      “dt        | j                  dd«      «      “dt        | j                  dd«      «      “dt        | j                  dd«      «      “dt        | j                  dd«      «      “dt        | j                  dd«      xs d«      “dt        | j                  dd«      «      d d “dt        “d t        “ŽS )"NrØ   rÆ   r9  Ú	soil_typerö   Úph_levelg      @Úorganic_matter_percentç       @Údrainage_raterü   Úwater_retentionr   Únative_nitrogeng      4@Únative_phosphorusg      .@Únative_potassiumg     Àb@Úsalinity_levelg      à?Útemperature_range_minç      @Útemperature_range_maxg      >@rO  r  Úclimate_zoneÚ	temperateéd   Ú
created_atre  rR   )r   ÚuuidÚuuid4r
  Ú_STrH   r   rö   ÚfloatÚ_DRr   rü   Ú_WRr   r   rd  ©Úds    rN   Údict_to_soilrŠ  1  sÐ  € Üò Ü�:‰:Œ<ðä��6‘‹^˜D˜SÑ!ðô —'‘'˜!Ÿ%™% ¨VÓ4´h·m±mÔDðô �q—u‘u˜Z¨Ó-Ô.ð	ô
  % Q§U¡UÐ+CÀSÓ%IÔJðô —g‘g˜aŸe™e O°ZÓ@Ä,×BWÑBWÔXðô Ÿ™ §¡Ð&7¸Ó BÄN×DYÑDYÔZðô ˜aŸe™eÐ$5°tÓ<Ô=ðô   §¡Ð&9¸4Ó @ÔAðô ˜qŸu™uÐ%7¸Ó?Ô@ðô ˜QŸU™UÐ#3°SÓ9Ô:ðô $ A§E¡EÐ*AÀ3Ó$GÔHðô $ A§E¡EÐ*AÀ4Ó$HÔIðô ˜Ÿ™˜m¨RÓ0Ò6°BÔ7ðô ˜Ÿ™˜~¨{Ó;Ó<¸T¸cÑBðõ  ð!õ" ð#ð rP   c                óÂ  — t        d!i dt        j                  «       “dt        | d   «      d d “dt        | d   «      d d “dt        j                  | j                  dd«      t        j                  «      “dt        dt        d	t        | j                  dd
«      «      «      «      “dt        dt        d	t        | j                  dd
«      «      «      «      “dt        dt        d	t        | j                  dd
«      «      «      «      “dt        dt        d	t        | j                  dd
«      «      «      «      “d| j                  d«      xs i “dt        | j                  dd«      «      “dt        | j                  dd«      «      “d| j                  d«      xs ddddœ“dt        j                  | j                  dd«      t        j                  «      “dt        dt        | j                  dd«      «      «      “dt        dt        | j                  dd«      «      «      “dt        | j                  dd«      xs d«      “d| j                  d«      “dt        “d t        “ŽS )"NrØ   rÆ   r9  rÅ   r:  r  r;  rW   r6  r  r<  r=  r?  r@  rA  rB  rC  rD  rE  rF  rG  rK  r   rL  éZ   rM  rN  rO  r  rP  r�  re  rR   )r   r‚  rƒ  r
  Ú_VTrH   r   r  ÚmaxrQ  Úintr…  Ú_RDCr   r   rd  rˆ  s    rN   rk  rk  G  s?  € Üò Ü�:‰:Œ<ðä��6‘‹^˜D˜SÑ!ðô �A�i‘LÓ! $ 3Ñ'ðô —W‘W˜QŸU™U >°7Ó;¼[×=NÑ=NÔOð	ô
 ˜a¤ R¬¨Q¯U©UÐ3FÈÓ-JÓ)KÓ!LÔMðô ˜q¤# b¬#¨a¯e©eÐ4HÈ!Ó.LÓ*MÓ"NÔOðô ˜1œc "¤c¨!¯%©%Ð0@À!Ó*DÓ&EÓFÔGðô ˜1œc "¤c¨!¯%©%Ð0@À!Ó*DÓ&EÓFÔGðð Ÿ5™5Ð!5Ó6Ò<¸"øðô ˜QŸU™UÐ#3°SÓ9Ô:ðô ˜QŸU™UÐ#3°SÓ9Ô:ðð $%§5¡5Ð)EÓ#FÒ#hÐPSÐZ]ÐdgÑJhøðô !ŸH™H Q§U¡UÐ+@À(Ó%KÔM^×MeÑMeÔfðô ˜a¤ Q§U¡UÐ+>ÀÓ%CÓ!DÔEðô &)¨¬e°A·E±EÐ:XÐZ]Ó4^Ó._Ô%`ðô  ˜Ÿ™˜m¨RÓ0Ò6°BÔ7ð!ð" —%‘%˜Ô$ð#õ$ ð%õ& ð'ð rP   c                óÔ  ‡— t        «       }	 | rÕt        d«       |j                  t        «      j	                  «        |j                  t
        «      j	                  «        |j                  t        «      j	                  «        |j                  t        «      j	                  «        |j                  t        «      j	                  «        |j                  «        t        d«       t        «       }|r9t        d«       t        «       }t        |«       t        dt        |«      › d�«       nÜ|r|s|}t        dt        |«      › d�«       n½t        d«       g }t        «       }t        D ]z  }	 t!        |«      }d	}	|D ]>  }
|
d
   |vsŒ|	t"        k  sŒ|j%                  |
d
   «       |j'                  |
«       |	dz  }	Œ@ t        d|› d|	› d�«       t)        j*                  d«       Œ| t        |«       t        dt        |«      › d�«       t        d«       	 t/        ||«      }t        dt        |«      › d�«       t        d«       t3        |«      }d}t5        d	t        |«      |«      D ]–  }||||z    }	 t7        |«      }t9        ||«      }	 |D ]=  }t=        |t?        |«      «      ŠtA        ˆfd„|D «       «      sŒ-|j'                  ‰«       Œ? |j                  «        t        d||z  dz   › d t        |«      › d!�«       Œ˜ t        d#t        |«      › d�«       t        d$«       g }	 tC        «       }|D ]/  }t?        |«      Š|j%                  ‰«       |j'                  ‰«       Œ1 |j                  «        t        dt        |«      › d%�«       t        d'«       d	}	 tE        «       }|D ]  }|j%                  tG        |«      «       Œ |j                  «        t        |«      }t        d|› d(�«       t        d*«       d	}	 ||z   D �ch c]  }tI        |jJ                  «      ’Œ }}tM        ||«      }|D �]<  }tI        |jO                  d+d,«      «      }tI        |jO                  d-d,«      «      }||vs||vrŒC|j%                  t        tQ        jR                  «       tQ        jT                  |«      tQ        jT                  |«      tW        |jO                  d.d/«      «      tW        |jO                  d0d1«      «      tW        |jO                  d2d1«      «      |jO                  d3«      xs i tI        |jO                  d4d,«      «      tI        |jO                  d5d,«      «      tX        tX        ¬6«      «       |dz  }�Œ? |j                  «        t        d|› d7�«       t        d9«       t        d:|› d;�«       t        d:t        |«      › d<�«       t        d:t        |«      › d=�«       t        d:|› d>�«       	 |j_                  «        y # t,        $ r1}t        d|› d|› �«       t)        j*                  d«       Y d }~�ŒÆd }~ww xY w# t,        $ r%}|j1                  «        t        d|› d�«       ‚ d }~ww xY w# t,        $ r@}t        d||z  dz   › d|› �«       |D �cg c]  }t;        |«      ‘Œ nc c}w }}Y d }~�Œ"d }~ww xY w# t,        $ r2}|j1                  «        t        d||z  dz   › d"|› �«       Y d }~�Œƒd }~ww xY w# t,        $ r*}|j1                  «        t        d&|› d�«       Y d }~�Œ”d }~ww xY w# t,        $ r*}|j1                  «        t        d)|› d�«       Y d }~�Œgd }~ww xY wc c}w # t,        $ r*}|j1                  «        t        d8|› d�«       Y d }~�Œd }~ww xY w# t,        $ r4}|j1                  «        t        d?|› �tZ        j\                  ¬@«       ‚ d }~ww xY w# |j_                  «        w xY w)ANzClearing existing data...z	Cleared.
uK   [1/4] Skipping Perenual fetch â€” generating species list with Claude AI...z  Generated z	 species
z[1/4] Loaded z6 species from cache (use --refresh-cache to re-fetch)
z+[1/4] Fetching species from Perenual API...r   rØ   rW   z  'u   ' â†’ z speciesrt  z  Warning: 'u   ' fetch failed â€” r|  z	  Total: z species collected
z:[1.5/5] Saving fetched Perenual species to plants table...z  Saved u    raw scion plants âœ“
u&     Failed to save raw scion plants â€” r“   z*[2/5] Enriching and saving scion plants...r  z  Warning: batch u    AI enrichment failed â€” c              3  óP   •K  — | ]  }|j                   ‰j                   k7  –— Œ y ­wri   )rØ   )rŸ   rh  r    s     €rN   r¡   zmain.<locals>.<genexpr>ª  s   øè ø€ ÒL°8˜8Ÿ;™;¨!¯$©$Õ.ÑLùs   ƒ#&z  Batch z: saved u    plants âœ“u    failed to persist â€” z  Total scions saved: z2[3/5] Generating and saving rootstock cultivars...u    rootstocks âœ“
u"     Rootstock generation failed â€” z,[4/5] Generating and saving soil profiles...u    soil profiles âœ“
u     Soil generation failed â€” z1[5/5] Generating and saving graft combinations...Úrootstock_idr  Úscion_idÚcompatibility_scoregš™™™™™é?Úvigor_boostgš™™™™™ñ?Úyield_modifierÚstress_tolerance_overrideÚnotesÚsource_reference)rØ   r“  r”  r•  r–  r—  r˜  r™  rš  r�  re  u    graft combinations âœ“
u     Graft generation failed â€” zDone.z  z soil profilesz scion plantsz rootstock plantsz graft combinationsz	
Failed: )Úfile)0r   rv   rf   r   Údeleter   r   r   r   rl  rp   r`   rw   rä   ÚsetÚSEARCH_TERMSrg   ÚMAX_PER_TERMrc  rR  ÚtimeÚsleeprå   ro  ÚrollbackrŒ   rã   r¤   r_  rU  ri  rk  Úallr¬   r±   rŠ  r
  rØ   rô   rH   r‚  rƒ  ÚUUIDr…  rd  ÚsysÚstderrÚclose) ÚresetÚrefresh_cacheÚ
skip_fetchrf  Úcachedr�   ÚseenÚtermrì   ÚaddedÚrrñ   Úpersisted_scionsÚscion_plantsÚBATCHrí   ÚbatchÚenrichedÚplant_dictsrn  r‰  Úrootstock_plantsÚrootstock_dictsÚn_soilsÚ
soil_dictsÚinserted_graftsr    Úplant_id_setÚgraft_dictsÚgÚrs_idÚsc_ids                              `     rN   ÚmainrÀ  c  sB  ø€ Ü	‹€BðVÙÜÐ-Ô.Ø�H‰H”^Ó$×+Ñ+Ô-Ø�H‰H”XÓ×%Ñ%Ô'Ø�H‰HÔ%Ó&×-Ñ-Ô/Ø�H‰H”U‹O×"Ñ"Ô$Ø�H‰H”[Ó!×(Ñ(Ô*Ø�I‰IŒKÜ�,Ôô “ˆÙÜÐ_Ô`Ü.Ó0ˆCÜ�sŒOÜ�L¤ S£ 
¨*Ð5Õ6Ù™MØˆCÜ�M¤# c£( Ð+bÐcÕdäÐ?Ô@ØˆCÜ›ˆDä$ò $�ð$Ü0°Ó6�GØ�EØ$ò '˜Ø˜T™7¨$Ò.°5¼<Ó3GØ ŸH™H Q t¡WÔ-ØŸJ™J qœMØ! Q™J™Eð	'ô
 ˜C ˜v V¨E¨7°(Ð;Ô<Ü—J‘J˜s•Oð$ô �sŒOÜ�Iœc #›h˜ZÐ';Ð<Ô=äÐJÔKð	Ü1°"°cÓ:ÐÜ�HœSÐ!1Ó2Ð3Ð3JÐKÔLô 	Ð:Ô;Ü$(Ð)9Ó$:ˆØˆÜ�qœ#˜c›( EÓ*ò 	VˆAØ˜˜A ™IÐ&ˆEðWÜ(¨Ó/�Ü7¸¸xÓH�ð
	VØ$ò /�AÜ$ R¬°qÓ)9Ó:�AÜÓL¸|ÔLÕLØ$×+Ñ+¨AÕ.ð/ð —	‘	”Ü˜  e¡¨a¡Ð 0°¼¸[Ó9IÐ8JÈ+ÐVÕWð	Vô( 	Ð&¤s¨<Ó'8Ð&9¸Ð<Ô=ô 	ÐBÔCØ(*Ðð
	>Ü1Ó3ˆOØ$ò +�Ü! !Ó$�Ø—‘�q”	Ø ×'Ñ'¨Õ*ð+ð �I‰IŒKÜ�HœSÐ!1Ó2Ð3Ð3DÐEÔFô 	Ð<Ô=Øˆð		9Ü'Ó)ˆJØò (�Ø—‘”| A“Õ'ð(à�I‰IŒKÜ˜*“oˆGÜ�H˜W˜IÐ%9Ð:Ô;ô 	ÐAÔBØˆð	:Ø/;Ð>NÑ/NÖO¨!œC §¡�IÐOˆLÐOÜ5°lÐDTÓUˆKØ ó %�Ü˜AŸE™E .°"Ó5Ó6�Ü˜AŸE™E *¨bÓ1Ó2�Ø Ñ,°¸\Ñ0IØØ—‘Ô'Ü—z‘z“|Ü!%§¡¨5Ó!1Ü!ŸY™Y uÓ-Ü(-¨a¯e©eÐ4IÈ3Ó.OÓ(PÜ % a§e¡e¨M¸3Ó&?Ó @Ü#(¨¯©Ð/?ÀÓ)EÓ#FØ./¯e©eÐ4OÓ.PÒ.VÐTVÜ˜aŸe™e G¨RÓ0Ó1Ü%(¨¯©Ð/AÀ2Ó)FÓ%GÜ"Ü"ôô ð   1Ñ$’ð%%ð& �I‰IŒKÜ�H˜_Ð-Ð-FÐGÔHô
 	ˆgŒÜ��7�)˜>Ð*Ô+Ü�”3�|Ó$Ð% ]Ð3Ô4Ü�”3Ð'Ó(Ð)Ð):Ð;Ô<Ü��?Ð#Ð#6Ð7Õ8ð 	�‰�
øôc !ò $Ü˜L¨¨Ð.AÀ!ÀÐEÔFÜ—J‘J˜s—O’Oûð$ûô ò 	Ø�K‰KŒMÜÐ:¸1¸#¸RÐ@ÔAØûð	ûô ò WÜÐ)¨!¨u©*°q©.Ð)9Ð9SÐTUÐSVÐWÔXØPUÖVÈÔ=¸dÕCÑVùÒV�ÖVûðWûô ò VØ—‘”ÜÐ)¨!¨u©*°q©.Ð)9Ð9PÐQRÐPSÐT×UÒUûðVûô" ò 	>Ø�K‰KŒMÜÐ6°q°c¸Ð<×=Ò=ûð	>ûô ò 	9Ø�K‰KŒMÜÐ1°!°°BÐ7×8Ò8ûð	9üò Pøô. ò 	:Ø�K‰KŒMÜÐ2°1°#°RÐ8×9Ò9ûð	:ûô ò Ø
�‰ŒÜ�
˜1˜#Ð¤S§Z¡ZÕ0Øûðûð
 	�‰�
úst  �E^ Å)W6Æ	W6ÆAW6Ç 0^ È$X3 È59^ É/Y$Ê.Z0Ê6AZ0Ë:'^ Ì"A&[. Î^ ÎA\$ Ï+^ Ï9] Ð ]ÐE/] ÖA^ ×6	X0×?&X+Ø%^ Ø+X0Ø0^ Ø3	Y!Ø< YÙY!Ù!^ Ù$	Z-Ù-Z(ÚZÚZ(Ú"^ Ú(Z-Ú-^ Ú0	[+Ú9'[&Û ^ Û&[+Û+^ Û.	\!Û7\Ü^ Ü\!Ü!^ Ü$	]Ü-]Ý^ Ý]Ý^ Ý] Ý	^Ý(^Þ^ Þ^Þ^ Þ	_Þ/_ß_ß_ ß_'Ú__main__z(Enrich ACI database with real plant data)rO  z--resetÚ
store_truez=Clear all existing plants, soils, and grafts before enriching)ÚactionÚhelpz--refresh-cachez3Re-fetch from Perenual even if a local cache existsz--skip-fetchuB   Skip Perenual entirely â€” use Claude to generate the species list)r¨  r©  rª  )rL   r
  rD   r   rá   r   )rS   r
  rT   r�  rá   r
  )rá   ú
List[Dict])rf   r
  rá   rÅ  )re   rÅ  rá   ÚNone)i   )r�   r
  rZ   r�  rá   rÅ  )r¢   rÅ  rá   rÅ  )r§   r
  r¨   r
  rá   r
  )r®   r
  rá   r
  )r³   r
  r´   r
  rµ   r
  rá   r
  )ræ   úList[Plant]rç   rÇ  rá   rÅ  )r  r   rá   r
  )r‹   r   rá   r
  )r�   úDict[str, Any]rá   zOptional[str])rš   r
  rá   r�  )r™   r
  rá   r�  )rÆ   r
  rÅ   r
  rá   r   )r�   rÈ  rá   rÈ  )rX  úList[Dict[str, Any]]rY  rÉ  rá   rÉ  )rg  r   rá   r   )r¢   rÉ  rá   rÇ  )r‰  r   rá   r   )r‰  r   rá   r   )FFF)r¨  râ   r©  râ   rª  râ   rá   rÆ  )qÚ__doc__Ú
__future__r   ÚargparserK   rj   r¥  r   r‚  r  r   r   Útypingr   r   r   r	   rG   Údotenvr
   Ú	anthropicÚapp.databaser   Úapp.models.graft_combinationr   Úapp.models.plantr   r   r   Úapp.models.scenarior   r   Úapp.models.soil_profiler   r   r   r   ÚgetenvrF   ÚANTHROPIC_KEYrI   rƒ   ÚnowÚutcrd  Ú	Anthropicr€   rL   r�   ÚdirnameÚ__file__rl   rž  rŸ  rO   rU   r`   rg   rp   rw   r\   r¤   r©   r¬   r¯   r±   r¶   rô   rõ   rö   r÷   rø   rù   rú   r„  rû   rü   rý   rþ   r†  rÿ   r   r  r‡  r  r  r�  r  r  r  r�  r  r  r  r#  r+  r3  rU  r_  ri  ro  rŠ  rk  rÀ  Ú__name__ÚArgumentParserÚparserÚadd_argumentÚ
parse_argsÚargsr¨  r©  rª  rR   rP   rN   ú<module>râ     sâ  ðñõ #ã Û Û 	Û 
Û Û Û 	ß 'ß ,Ó ,ã õ Ù „ã å %Ý 9ß BÑ Bß 8ß WÓ Wð ˆr�y‰yÐ*Ó+€Ø�—	‘	Ð-Ó.€Ø*€Ø€Ø€h‡l�l�8—<‘<Ó €á4AÐ€i×Ñ -Õ0Àt€ð �W‰W�\‰\˜"Ÿ'™'Ÿ/™/¨(Ó3Ð5JÓK€
ò€ð$ €óóóó& ó
ó-ôó<(óVó0'ó(#ó0ó"ð26Øð6Ø%0ð6àó6ð| �^‰^ X§]¡]¸H¿M¹MØ�M‰M 8§=¡=¸H¿O¹Oñ€ð
 ×Ñ¨<×+@Ñ+@Ø×Ñ¨L×,BÑ,Bñ€ð
 ×Ñ¨×)>Ñ)>È×H[ÑH[ñ€ð
 !×(Ñ(Ø×&Ñ&Ø×"Ñ"ñ€ð ×ÑØ×&Ñ&Ø×Ññ€ó%ó
ó	óóó$ó%óPóó@óó,ô8Xðv ˆzÒØ$ˆX×$Ñ$Ð1[Ô\€FØ
×Ñ˜	¨,Ø\ð ô ^à
×ÑÐ)°,ØRð ô Tà
×Ñ˜¨|Øað ô cà×ÑÓ€DÙˆt�z‰z¨×);Ñ);ÈÏÉÖXð rP   