Ë
      Dj’  ã                   ó.  — d Z ddlmZ ddl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 dd	lmZmZmZ dd
lmZ ddlmZmZmZ  e«       Z ee«      Z G d„ de«      Z G d„ de«      Zdedede	defd„Z dede	dedz  fd„Z!d*dededz  defd„Z"ejG                  ded¬«       ee«       ee«      fdedede	defd„«       Z$ejK                  de&e   ¬ «      d! ee«       ee«      fd"e'dede	de&e   fd#„«       Z(ejK                  d$e¬ «       ee«       ee«      fdedede	defd%„«       Z)ejU                  d$e¬ «       ee«       ee«      fdededede	def
d&„«       Z+ejY                  d$d'¬(«       ee«       ee«      fdedede	ddfd)„«       Z-y)+uf  
Crop plan endpoints â€” saved planning scenarios for a logged-in customer.

POST   /crop-plans          create a new plan
GET    /crop-plans          list the current user's plans
GET    /crop-plans/{id}     get one plan, with its latest analysis status
PATCH  /crop-plans/{id}     rename, change risk tolerance, or archive
DELETE /crop-plans/{id}     hard delete (only if no analyses reference it)

All endpoints are scoped to the logged-in user â€” a customer can only
ever see or modify their own plans, enforced by filtering every query
on CropPlan.user_id == current_user.id, never trusting a plan id alone.
é    )Údatetime)Ú	APIRouterÚDepends)ÚdescÚselect)ÚAsyncSession)Úget_current_user)ÚAppException)Ú
get_logger)ÚAnalysisRecordÚCropPlanÚUser)Úget_db_session)ÚCropPlanCreateRequestÚCropPlanResponseÚCropPlanUpdateRequestc                   ó   — e Zd ZdZdZy)ÚCropPlanNotFoundErrori”  ÚCROP_PLAN_NOT_FOUNDN©Ú__name__Ú
__module__Ú__qualname__Ústatus_codeÚ
error_code© ó    úLC:\Crop_Prediction\Backend\crop-ai-system\app\api\v1\endpoints\crop_plans.pyr   r       s   „ Ø€KØ&�Jr   r   c                   ó   — e Zd ZdZdZy)ÚCropPlanHasAnalysesErrori™  ÚCROP_PLAN_HAS_ANALYSESNr   r   r   r   r    r    %   s   „ Ø€KØ)�Jr   r    Úplan_idÚuser_idÚdbÚreturnc              ƒ   óþ   K  — |j                  t        t        «      j                  t        j                  | k(  t        j
                  |k(  «      «      ƒ d {  –—† }|j                  «       }|€t        d¬«      ‚|S 7 Œ$­w)NzCrop plan not found©Úmessage)Úexecuter   r   ÚwhereÚidr#   Úscalar_one_or_noner   )r"   r#   r$   ÚresultÚplans        r   Ú_get_owned_planr/   *   sm   è ø€ Ø—:‘:ÜŒxÓ×ÑœxŸ{™{¨gÑ5´x×7GÑ7GÈ7Ñ7RÓSó÷ €Fð ×$Ñ$Ó&€DØ€|Ü#Ð,AÔBÐBØ€Kðús   ‚AA=ÁA;Á%A=Nc              ƒ   ó$  K  — |j                  t        t        «      j                  t        j                  | k(  «      j                  t        t        j                  «      «      j                  d«      «      ƒ d {  –—† }|j                  «       S 7 Œ­w)Né   )
r)   r   r   r*   Úcrop_plan_idÚorder_byr   Ú
created_atÚlimitr,   )r"   r$   r-   s      r   Ú_latest_analysis_for_planr6   4   sj   è ø€ Ø—:‘:ÜŒ~Óß	‰Œ~×*Ñ*¨gÑ5Ó	6ß	‰”$”~×0Ñ0Ó1Ó	2ß	‰ˆq‹ó	÷ €Fð ×$Ñ$Ó&Ð&ðús   ‚A7BÁ9BÁ:Br.   Úlatest_analysisc                 óx  — t        | j                  | j                  | j                  | j                  | j
                  | j                  | j                  | j                  j                  «       | j                  j                  «       |r|j                  nd |r|j                  j                  «       ¬«      S d ¬«      S )N)r+   ÚnameÚcropÚlocationÚplanting_monthÚrisk_toleranceÚis_archivedr4   Ú
updated_atÚlatest_feasibility_labelÚlatest_analysis_at)r   r+   r9   r:   r;   r<   r=   r>   r4   Ú	isoformatr?   Úfeasibility_label)r.   r7   s     r   Ú_to_responserD   >   s™   € ÜØ�7‰7Ø�Y‰YØ�Y‰YØ—‘Ø×*Ñ*Ø×*Ñ*Ø×$Ñ$Ø—?‘?×,Ñ,Ó.Ø—?‘?×,Ñ,Ó.ÙFU ×!BÒ!BÐ[_ÙET˜?×5Ñ5×?Ñ?ÓAôð ð [_ôð r   z/crop-planséÉ   )Úresponse_modelr   ÚpayloadÚcurrent_userc              ƒ   ó  K  — t        |j                  | j                  | j                  j	                  «       j                  «       | j                  j	                  «       j                  «       | j                  | j                  ¬«      }|j                  |«       |j                  «       ƒ d {  –—†  |j                  |«      ƒ d {  –—†  t        j                  d|j                  › d|j                  › �«       t        |«      S 7 ŒW7 Œ@­w)N)r#   r9   r:   r;   r<   r=   zCreated crop plan z for user_id=)r   r+   r9   r:   ÚstripÚlowerr;   r<   r=   ÚaddÚcommitÚrefreshÚloggerÚinforD   )rG   rH   r$   r.   s       r   Úcreate_crop_planrQ   N   sË   è ø€ ô Ø—‘Ø�\‰\Ø�\‰\×ÑÓ!×'Ñ'Ó)Ø×!Ñ!×'Ñ'Ó)×/Ñ/Ó1Ø×-Ñ-Ø×-Ñ-ô€Dð ‡F�Fˆ4„LØ
�)‰)‹+×ÐØ
�*‰*�TÓ
×Ðä
‡K�KÐ$ T§W¡W I¨]¸<¿?¹?Ð:KÐLÔMÜ˜ÓÐð	 øØús$   ‚B*DÂ,DÂ-DÃDÃ?DÄD)rF   FÚinclude_archivedc              ƒ   ó*  K  — t        t        «      j                  t        j                  |j                  k(  «      }| s.|j                  t        j
                  j                  d«      «      }|j                  t        t        j                  «      «      }|j                  |«      ƒ d {  –—† }|j                  «       j                  «       }g }|D ];  }t        |j                  |«      ƒ d {  –—† }|j                  t        ||«      «       Œ= |S 7 Œf7 Œ%­w)NF)r   r   r*   r#   r+   r>   Úis_r3   r   r?   r)   ÚscalarsÚallr6   ÚappendrD   )	rR   rH   r$   Úqueryr-   ÚplansÚ	responsesr.   Úlatests	            r   Úlist_crop_plansr\   d   sÜ   è ø€ ô ”8Ó×"Ñ"¤8×#3Ñ#3°|·±Ñ#FÓG€EÙØ—‘œH×0Ñ0×4Ñ4°UÓ;Ó<ˆØ�N‰Nœ4¤× 3Ñ 3Ó4Ó5€Eà—:‘:˜eÓ$×$€FØ�N‰NÓ× Ñ Ó"€Eà€IØò 5ˆÜ0°·±¸"Ó=×=ˆØ×Ñœ d¨FÓ3Õ4ð5ð Ðð %øð
 >ús%   ‚B&DÂ(DÂ)ADÃ+DÃ,$DÄDz/crop-plans/{plan_id}c              ƒ   ó¤   K  — t        | |j                  |«      ƒ d {  –—† }t        |j                  |«      ƒ d {  –—† }t        ||«      S 7 Œ.7 Œ­w©N)r/   r+   r6   rD   )r"   rH   r$   r.   r[   s        r   Úget_crop_planr_   y   sF   è ø€ ô ! ¨,¯/©/¸2Ó>×>€DÜ,¨T¯W©W°bÓ9×9€FÜ˜˜fÓ%Ð%ð ?øØ9ús   ‚A�AžA»A¼AÁAc              ƒ   óî  K  — t        | |j                  |«      ƒ d {  –—† }|j                  �|j                  |_        |j                  �|j                  |_        |j                  �|j                  |_        t        j                  «       |_        |j                  «       ƒ d {  –—†  |j                  |«      ƒ d {  –—†  t        |j                  |«      ƒ d {  –—† }t        ||«      S 7 ŒÏ7 ŒI7 Œ27 Œ­wr^   )r/   r+   r9   r=   r>   r   Úutcnowr?   rM   rN   r6   rD   )r"   rG   rH   r$   r.   r[   s         r   Úupdate_crop_planrb   „   sÊ   è ø€ ô ! ¨,¯/©/¸2Ó>×>€Dà‡|�|ÐØ—L‘LˆŒ	Ø×ÑÐ)Ø%×4Ñ4ˆÔØ×ÑÐ&Ø"×.Ñ.ˆÔô —o‘oÓ'€D„OØ
�)‰)‹+×ÐØ
�*‰*�TÓ
×Ðä,¨T¯W©W°bÓ9×9€FÜ˜˜fÓ%Ð%ð ?øð øØøà9úsF   ‚C5�C-žBC5Â%C/Â&C5Â>C1Â?C5ÃC3ÃC5Ã/C5Ã1C5Ã3C5éÌ   )r   c              ƒ   ó  K  — t        | |j                  |«      ƒ d {  –—† }t        |j                  |«      ƒ d {  –—† }|�t        d¬«      ‚|j	                  |«      ƒ d {  –—†  |j                  «       ƒ d {  –—†  y 7 Œb7 ŒF7 Œ!7 Œ­w)NzkThis plan has analysis history and cannot be deleted. Archive it instead to hide it from your active plans.r'   )r/   r+   r6   r    ÚdeleterM   )r"   rH   r$   r.   Úexisting_analysiss        r   Údelete_crop_planrg   �   s   è ø€ ô ! ¨,¯/©/¸2Ó>×>€Dä7¸¿¹ÀÓD×DÐØÐ$Ü&ðLô
ð 	
ð
 �)‰)�D‹/×ÐØ
�)‰)‹+×Ñð ?øàDøð øØúsC   ‚B�B žB»B¼&BÁ"BÁ#BÁ:BÁ;BÂBÂBÂBr^   ).Ú__doc__r   Úfastapir   r   Ú
sqlalchemyr   r   Úsqlalchemy.ext.asyncior   Úapp.core.current_userr	   Úapp.core.exceptionsr
   Úapp.core.logging_configr   Úapp.db.modelsr   r   r   Úapp.db.sessionr   Úapp.schemas.crop_planr   r   r   Úrouterr   rO   r   r    Ústrr/   r6   rD   ÚpostrQ   ÚgetÚlistÚboolr\   r_   Úpatchrb   re   rg   r   r   r   ú<module>ry      s•  ðñõ ç &ß #Ý /å 2Ý ,Ý .ß 8Ñ 8Ý )ß `Ñ `á	‹€Ù	�HÓ	€ô'˜Lô 'ô
*˜|ô *ð
 3ð °ð ¸,ð È8ó ð'¨Sð '°lð 'À~ÐX\ÑG\ó 'ñ�xð °.À4Ñ2Gð ÐScó ð  ‡�ˆ]Ð+;È€ÓMñ !Ð!1Ó2Ù˜~Ó.ñØ"ðàðð 	ðð ò	ó Nðð* ‡�ˆM¨$Ð/?Ñ*@€ÓAà"Ù Ð!1Ó2Ù˜~Ó.ñØðàðð 	ðð 
Ð
Ñò	ó Bðð( ‡�Ð#Ð4D€ÓEñ !Ð!1Ó2Ù˜~Ó.ñ&Øð&àð&ð 	ð&ð ò	&ó Fð&ð ‡�Ð%Ð6F€ÓGñ !Ð!1Ó2Ù˜~Ó.ñ	&Øð&à"ð&ð ð&ð 	ð	&ð
 ò&ó Hð&ð0 ‡�Ð&°C€Ó8ñ !Ð!1Ó2Ù˜~Ó.ñØðàðð 	ðð 
ò	ó 9ñr   