Ë
    wÇðiÄ  ã                  óT  — d dl mZ d dlZd dlmZmZmZ d dlmZmZm	Z	 d dl
mZmZmZmZ d dlmZmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZ d dlmZ d dlmZmZm Z m!Z! d dl"m#Z#  eddg¬«      Z$ eejJ                  «       eejL                  «       eejN                  «      j#                  ejP                  «       eejN                  «      j#                  ejR                  «       eejT                  «      gZ+dd„Z,d d„Z-d!d„Z.	 	 	 	 	 	 	 	 	 	 d"d„Z/e$ja                  de d¬«       ee«      f	 	 	 	 	 d#d„«       Z1e$je                  de	e!   ¬«       ee«      fd$d„«       Z3e$je                  de ¬«       ee«      fd%d„«       Z4e$ja                  dee5ef   ¬«       ee«      fd&d„«       Z6y)'é    )ÚannotationsN)ÚdatetimeÚ	timedeltaÚtimezone)ÚAnyÚDictÚList)Ú	APIRouterÚDependsÚHTTPExceptionÚRequest)ÚSessionÚ
joinedload)Úget_db)ÚGraftCombination)ÚPlant)ÚScenarioÚScenarioResult)ÚSoilProfile)ÚAnalyzeRequestÚScenarioCreateÚScenarioResponseÚScenarioSummary)Úaiz/api/scenariosÚ	scenarios)ÚprefixÚtagsc                óª   — | j                  t        «      j                  t        j                  |k(  «      j	                  «       }|st        dd¬«      ‚|S )Né”  zSoil profile not found©Ústatus_codeÚdetail)Úqueryr   ÚfilterÚidÚfirstr   )ÚdbÚsoil_idÚsoils      úJ/var/www/acinvestment.org/public_html/aci/backend/app/routers/scenarios.pyÚ_fetch_soilr+   #   sC   € Ø�8‰8”KÓ ×'Ñ'¬¯©¸'Ñ(AÓB×HÑHÓJ€DÙÜ¨Ð4LÔMÐMØ€Kó    c                ó&  — | j                  t        «      j                  t        t        j                  «      t        t        j
                  «      «      j                  t        j                  |k(  «      j                  «       }|st        dd¬«      ‚|S )Nr   zGraft combination not foundr    )
r#   r   Úoptionsr   Ú	rootstockÚscionr$   r%   r&   r   )r'   Úgraft_idÚgrafts      r*   Ú_fetch_graftr3   *   ss   € à
�‰Ô!Ó"ß	‰ÜÔ'×1Ñ1Ó2ÜÔ'×-Ñ-Ó.ó

÷ 
‰Ô ×#Ñ# xÑ/Ó	0ß	‰‹ð 
ñ Ü¨Ð4QÔRÐRØ€Lr,   c                óª   — | j                  t        «      j                  t        j                  |k(  «      j	                  «       }|st        dd¬«      ‚|S )Nr   zPlant not foundr    )r#   r   r$   r%   r&   r   )r'   Úplant_idÚplants      r*   Ú_fetch_plantr7   9   sB   € Ø�H‰H”U‹O×"Ñ"¤5§8¡8¨xÑ#7Ó8×>Ñ>Ó@€EÙÜ¨Ð4EÔFÐFØ€Lr,   c                óô   — t        j                  || j                  | j                  | j                  | j
                  j                  | j                  | j                  j                  | j                  ||¬«
      S )N)
r)   Ú	applied_nÚ	applied_pÚ	applied_kÚirrigation_methodÚirrigation_frequency_daysÚseasonÚduration_daysr6   r2   )
r   Úrun_analysisÚapplied_nitrogenÚapplied_phosphorusÚapplied_potassiumr<   Úvaluer=   r>   r?   )Úpayloadr)   r6   r2   s       r*   Ú_run_airF   @   sg   € ô �?‰?ØØ×*Ñ*Ø×,Ñ,Ø×+Ñ+Ø!×3Ñ3×9Ñ9Ø")×"CÑ"CØ�~‰~×#Ñ#Ø×+Ñ+ØØôð r,   Ú éÉ   )Úresponse_modelr!   c                ó,  — | j                   j                  d«      }|r#|j                  d«      d   j                  «       }n$| j                  r| j                  j
                  nd}t        j                  t        j                  «      t        d¬«      z
  }|j                  t        «      j                  t        j                  |k(  t        j                  |k\  «      j!                  «       }|dk\  rt#        dd	¬
«      ‚t%        ||j&                  «      }|j(                  rt+        ||j(                  «      nd }|j,                  rt/        ||j,                  «      nd }	t1        |||	|«      }
t        |j2                  |j(                  |j,                  |j&                  |j4                  |j6                  |j8                  |j:                  |j<                  |j>                  |j@                  |¬«      }|jC                  |«       |jE                  «        tG        |jH                  |
j                  d«      |
j                  d«      |
j                  dg «      |
j                  di «      |
j                  dg «      |
j                  d«      |
j                  d«      ¬«      }|jC                  |«       |jK                  «         |j                  t        «      jL                  tN        Ž j                  t        jH                  |jH                  k(  «      jQ                  «       S )NzX-Forwarded-Forú,r   Úunknowné   )Údaysé   i­  zEDaily limit reached. You can create up to 5 scenarios every 24 hours.r    )ÚnameÚgraft_combination_idr5   Úsoil_profile_idrA   rB   rC   r<   r=   r>   r?   Ú	client_ipÚpredicted_yieldÚsurvival_probabilityÚrisk_factorsÚrecommended_adjustmentsÚgrowth_timelineÚconfidence_scoreÚai_analysis)Úscenario_idrT   rU   rV   rW   rX   rY   rZ   ))ÚheadersÚgetÚsplitÚstripÚclientÚhostr   Únowr   Úutcr   r#   r   r$   rS   Ú
created_atÚcountr   r+   rR   rQ   r3   r5   r7   rF   rP   rA   rB   rC   r<   r=   r>   r?   ÚaddÚflushr   r%   Úcommitr.   Ú
_full_loadÚone)ÚrequestrE   r'   Ú	forwardedrS   Úone_day_agoÚrecent_countr)   r2   r6   ÚanalysisÚscenarioÚresults                r*   Úcreate_scenariorr   T   ss  € ð
 —‘×#Ñ#Ð$5Ó6€IÙØ—O‘O CÓ(¨Ñ+×1Ñ1Ó3‰	à+2¯>ª>�G—N‘N×'Ò'¸yˆ	ô —,‘,œxŸ|™|Ó,¬y¸aÔ/@Ñ@€Kà
�‰”Óß	‰”×"Ñ" iÑ/´×1DÑ1DÈÑ1SÓ	Tß	‰‹ð ð �qÒÜØØZô
ð 	
ô
 �r˜7×2Ñ2Ó3€Dð ×'Ò'ô 	�R˜×5Ñ5Ô6àð 
ð
 3:×2BÒ2BŒL˜˜W×-Ñ-Ô.È€Eä�w  e¨UÓ3€HäØ�\‰\Ø$×9Ñ9Ø×!Ñ!Ø×/Ñ/Ø ×1Ñ1Ø"×5Ñ5Ø!×3Ñ3Ø!×3Ñ3Ø")×"CÑ"CØ�~‰~Ø×+Ñ+Øô€Hð ‡F�Fˆ8ÔØ‡H�H„JäØ—K‘KØ Ÿ™Ð%6Ó7Ø%Ÿ\™\Ð*@ÓAØ—\‘\ .°"Ó5Ø (§¡Ð-FÈÓ KØ Ÿ™Ð%6¸Ó;Ø!Ÿ™Ð&8Ó9Ø—L‘L Ó/ô	€Fð ‡F�Fˆ6„NØ‡I�I„Kð	ˆ�‰”Óß	‰”*ð	ç	‰”—‘˜xŸ{™{Ñ*Ó	+ß	‰‹ð	r,   )rI   c                ót  — | j                  t        «      j                  t        t        j                  «      «      j                  t        j                  j                  «       «      j                  «       }g }|D ]¼  }|j                  t        |j                  |j                  |j                  |j                  |j                  |j                  r|j                  j                  nd |j                  r|j                  j                   nd |j                  r|j                  j"                  nd ¬«      «       Œ¾ |S )N)r%   rP   r>   r?   rd   rT   rU   rY   )r#   r   r.   r   ÚresultsÚorder_byrd   ÚdescÚallÚappendr   r%   rP   r>   r?   rT   rU   rY   )r'   r   Ú	summariesÚss       r*   Úlist_scenariosr{   ž   sá   € ð 	�‰”Óß	‰”œH×,Ñ,Ó-Ó	.ß	‰”(×%Ñ%×*Ñ*Ó,Ó	-ß	‰‹ð	 ð €IØò 
ˆØ×ÑÜØ—4‘4Ø—V‘VØ—x‘xØŸo™oØŸ<™<Ø=>¿YºY §	¡	× 9Ò 9ÈDØGHÇyÂy Q§Y¡Y×%CÒ%CÐVZØ?@¿yºy §¡×!;Ò!;Èdô	õ	
ð
ð Ðr,   z/{scenario_id}c                óÌ   —  |j                  t        «      j                  t        Ž j	                  t        j
                  | k(  «      j                  «       }|st        dd¬«      ‚|S )Nr   zScenario not foundr    )r#   r   r.   ri   r$   r%   r&   r   )r[   r'   rp   s      r*   Úget_scenarior}   ·   sU   € ð	ˆ�‰”Óß	‰”*ð	ç	‰”—‘˜{Ñ*Ó	+ß	‰‹ð	 ñ Ü¨Ð4HÔIÐIØ€Or,   z/analyzec                óÚ   — t        || j                  «      }| j                  rt        || j                  «      nd}| j                  rt        || j                  «      nd}t        | |||«      S )uE   Ephemeral analysis â€” runs AI and returns the result without saving.N)r+   rR   rQ   r3   r5   r7   rF   )rE   r'   r)   r2   r6   s        r*   Úanalyzer   Ä   s`   € ô �r˜7×2Ñ2Ó3€DØ>E×>ZÒ>ZŒL˜˜W×9Ñ9Ô:Ð`d€EØ29×2BÒ2BŒL˜˜W×-Ñ-Ô.È€EÜ�7˜D %¨Ó/Ð/r,   )r'   r   r(   ú	uuid.UUIDÚreturnr   )r'   r   r1   r€   r�   r   )r'   r   r5   r€   r�   r   )
rE   r   r)   r   r6   zPlant | Noner2   zGraftCombination | Noner�   zDict[str, Any])rk   r   rE   r   r'   r   )r'   r   )r[   r€   r'   r   )rE   r   r'   r   )7Ú
__future__r   Úuuidr   r   r   Útypingr   r   r	   Úfastapir
   r   r   r   Úsqlalchemy.ormr   r   Úapp.databaser   Úapp.models.graft_combinationr   Úapp.models.plantr   Úapp.models.scenarior   r   Úapp.models.soil_profiler   Úapp.schemas.scenarior   r   r   r   Úapp.servicesr   ÚrouterÚsoil_profiler6   Úgraft_combinationr/   r0   rt   ri   r+   r3   r7   rF   Úpostrr   r]   r{   r}   Ústrr   © r,   r*   ú<module>r”      sÑ  ðÝ "ã ß 2Ñ 2ß "Ñ "ç >Ó >ß .å Ý 9Ý "ß 8Ý /÷ó õ á	Ð*°+°Ô	?€ñ ˆx×$Ñ$Ó%Ùˆx�~‰~ÓÙˆx×)Ñ)Ó*×5Ñ5Ð6F×6PÑ6PÓQÙˆx×)Ñ)Ó*×5Ñ5Ð6F×6LÑ6LÓMÙˆx×ÑÓ ð€
óóóðØðà
ðð ðð #ð	ð
 óð( ‡�ˆRÐ 0¸c€ÓBá=DÀV»_ðFØðFØ-ðFØ3:òFó CðFðR ‡�ˆB˜t OÑ4€Ó5Ù!(¨£ó ó 6ðð0 ‡�ÐÐ-=€Ó>Ù7>¸v³ó 	ó ?ð	ð ‡�ˆZ¨¨S°#¨X©€Ó7Ù3:¸6³?ó 0ó 8ñ0r,   