o
    z­j$R  ã                
   @   sÔ  U d dl mZmZ d dlmZ d dlZd dlZd dlZ	d dl
mZmZmZmZ d dlZd dlZd dlZej ej e¡¡Zej ej e¡¡Zej ed¡Zej ed¡Zej ed¡Zej ed¡Zdadag aee  e!d	< d
a"d7dd„Z#e#ƒ  ej ed¡Z$e %e$¡Z&ej ed¡Z'e(e'ddd��Z)e *e)¡Z+W d  ƒ n1 s£w   Y  ej ed¡Z,e %e,¡Z-e.de-j/ 0¡ ƒ ej ed¡Z1z(e(e1ddd��Z)e *e)¡Z2W d  ƒ n1 sÛw   Y  e.de3e2ƒ› d�ƒ W n e4�y Z5 ze.de5› �ƒ g Z2W Y dZ5[5ndZ5[5ww eƒ Z6G dd„ deƒZ7G dd„ deƒZ8G dd„ deƒZ9G dd „ d eƒZ:G d!d"„ d"eƒZ;de7fd#d$„Z<d%e d&e d'e=fd(d)„Z>d*d+„ Z?d,d-„ Z@d.d/„ ZAe6jBd0e;d1�de7fd2d3„ƒZCe6 Dd4¡d5d6„ ƒZEdS )8é    )Ú	APIRouterÚHTTPException)Ú	BaseModelN)ÚListÚOptionalÚDictÚAnyÚmodelsÚdataz	model.pklzmodel_meta.pklÚmodel_featuresFÚreturnc               
   C   s>  t durdS zddl} W n ty   tstdƒ daY dS w z_tj t¡rAt	tdƒ�}t
 |¡a W d  ƒ n1 s;w   Y  ntdt› �ƒ tj t¡rut	tdƒ�}t
 |¡att dg ¡ƒaW d  ƒ W dS 1 smw   Y  W dS tdt› �ƒ W dS  tyž } ztd	|› �ƒ da dag aW Y d}~dS d}~ww )
zILoad XGBoost pickle once xgboost is importable (required for unpickling).Nr   zbWARNING: xgboost is not installed; microfarm ML ROI is disabled. Install with: pip install xgboostTÚrbz)WARNING: Microfarm model file not found: Úfeaturesz(WARNING: Microfarm meta file not found: z0WARNING: Could not load microfarm model assets: )ÚmodelÚxgboostÚImportErrorÚ_microfarm_xgboost_warnedÚprintÚosÚpathÚisfileÚ
model_pathÚopenÚpickleÚloadÚ	meta_pathÚ
model_metaÚlistÚgetr   Ú	Exception)r   ÚfÚe© r"   úC/var/www/html/CropPilot/backend/app/api/endpoints/microfarm_main.pyÚ_load_microfarm_model   s@   ÿùÿ€
&þ€ür$   zsystem_costs.csvzsoil_ph_ranges.jsonÚrzutf-8)Úencodingzagmarknet_prices.csvzPrice data columns:zsubsidies.jsonzSuccessfully loaded z subsidy recordszError loading subsidies: c                   @   sÆ   e Zd ZU eed< eed< dZee ed< dZee ed< dZ	ee ed< d	Z
ee ed
< dZee ed< dZeee  ed< dZeee  ed< dZee ed< dZee ed< dZee ed< dS )ÚRecommendationRequestÚ	plot_sizeÚbudgetÚKolhapurÚdistrictÚloamÚ	soil_typeg      @Úsoil_phÚwellÚwater_sourceé   Úsunlight_hoursNÚpreferred_cropsÚpreferred_systemsé   Úrisk_appetiteÚlabor_availabilityÚMaharashtraÚstate)Ú__name__Ú
__module__Ú__qualname__ÚfloatÚ__annotations__r+   r   Ústrr-   r.   r0   r2   Úintr3   r   r4   r6   r7   r9   r"   r"   r"   r#   r'   Y   s   
 r'   c                   @   sn   e Zd ZU eed< eed< dZee ed< dZee ed< dZ	ee ed< dZ
ee ed< dZee ed< dS )	ÚSubsidyÚnameÚsubsidy_pctNÚmax_capÚeligibilityÚ	apply_urlÚcategoryr9   )r:   r;   r<   r?   r>   r=   rD   r   rE   rF   rG   r9   r"   r"   r"   r#   rA   h   s   
 rA   c                   @   s&   e Zd ZU eed< eed< eed< dS )ÚMarketPriceÚlocationÚprice_per_quintalÚdateN)r:   r;   r<   r?   r>   r=   r"   r"   r"   r#   rH   r   s   
 rH   c                   @   sš   e Zd ZU eed< eed< eed< eed< eed< eed< ee ed< eed< eed	< d
Ze	ee
eef   ed< d
Ze	ee
eef   ed< eed< d
S )ÚSystemRecommendationÚsystemrG   Úexpected_roi_percentÚsetup_cost_totalÚmonthly_costÚpayback_period_monthsÚsuitable_cropsÚwater_usage_per_dayÚelectricity_usage_per_dayNÚmarket_pricesÚ	subsidiesÚcompatibility_score)r:   r;   r<   r?   r>   r=   r@   r   rU   r   r   r   rV   r"   r"   r"   r#   rL   x   s   
 rL   c                   @   s6   e Zd ZU eed< ee ed< ee ed< eed< dS )ÚRecommendationResponseÚsuccessÚrecommendationsÚcrop_suggestionsÚmessageN)r:   r;   r<   Úboolr>   r   rL   r?   r"   r"   r"   r#   rX   †   s
   
 rX   c                 C   sd   t t d | jkt d | jk@  }||d | j | jd k }t|ƒdkr0tdƒ t  d¡ d¡S |S )NÚmin_area_sqftÚmax_area_sqftÚcapex_per_sqftç333333ó?r   zBNo systems matched constraints. Returning most affordable options.é   )Úsystem_costsr(   r)   Úlenr   Úsort_valuesÚhead)r
   Úsize_filteredÚbudget_filteredr"   r"   r#   Úfilter_suitable_systems�   s   ÿÿÿri   Úsystem_typer-   r.   c           
      C   s¬   t t d | k }t|ƒdkrg S dd„ |jd d  d¡D ƒ}g }td D ].}|d }||vr0q%||d	 v rS|d
 d }|d
 d }	||  krL|	krSn q%| |¡ q%|S )NrM   r   c                 S   ó   g | ]}|  ¡ ‘qS r"   ©Ústrip©Ú.0Úcropr"   r"   r#   Ú
<listcomp>£   ó    z,get_crop_recommendations.<locals>.<listcomp>rR   Ú,ÚcropsrB   Ú
soil_typesÚoptimal_ph_rangeÚminÚmax)rc   rd   ÚilocÚsplitÚ	soil_dataÚappend)
rj   r-   r.   Ú
system_rowÚsystem_cropsÚcompatible_cropsÚ	crop_dataÚ	crop_nameÚmin_phÚmax_phr"   r"   r#   Úget_crop_recommendationsž   s    
€r„   c                 C   sŠ   t stdƒ g S g }|  ¡  ¡ }t D ]}| dd¡ ¡  ¡ }|r(|dks(||kr-| |¡ qtdt|ƒ› d| › �ƒ t|dd„ d	d
�}|S )z,Get subsidies applicable to the user's stateúNo subsidies data availabler9   Ú ÚallúFound z subsidies applicable for c                 S   s   |   dd¡S )NrC   r   ©r   )Úsr"   r"   r#   Ú<lambda>É   s    z#get_top_subsidies.<locals>.<lambda>T©ÚkeyÚreverse)Úsubsidies_datar   rm   Úlowerr   r|   rd   Úsorted)r9   Ústate_subsidiesÚstate_lowerÚsubsidyÚsubsidy_stateÚsorted_subsidiesr"   r"   r#   Úget_top_subsidies´   s"   
€ýr—   c                    sÄ  |sg S |   ¡  ¡ }|  ¡  ¡ }g d¢g d¢g d¢g d¢g d¢g d¢g d¢dœ}g }| ¡ D ]\}}||v s:||v r?| |¡ q.| ¡ | ¡  }	| |	¡ g }
g }g }|D ]]}| d	d
¡  ¡  ¡ }| dd
¡  ¡  ¡ }| dd
¡  ¡  ¡ }|› d|› d|› �‰ |ˆ v s‡|ˆ v r�|
 |¡ qUt‡ fdd„|D ƒƒrž| |¡ qUg d¢}t‡ fdd„|D ƒƒr²| |¡ qU|
| | }tƒ }g }|D ]}| d	d
¡}||vrß| 	|¡ | |¡ t
|ƒdkrß |S qÀ|S )z<Match subsidies specifically relevant to this farming system)ÚhydroponicsÚ
hydroponicÚsoillessÚnftÚdwczwater culture)Ú
aquaponicsÚ	aquaponicÚfishÚaquaculture)Úmicrogreenszmicro greensÚsproutÚseedling)ÚverticalÚtowerzgarden tower)Ú
greenhousezprotected cultivationÚ	polyhouseÚshadenet)Ú
aeroponicsÚ	aeroponicÚmistÚfog)Úorganicznatural farmingÚjaivik)r˜   r�   r¡   r¤   r¦   r©   r­   rB   r†   rG   ÚdescriptionÚ c                 3   ó   � | ]}|ˆ v V  qd S ©Nr"   )ro   Úkeyword©Útext_to_checkr"   r#   Ú	<genexpr>  ó   € z-match_subsidies_for_system.<locals>.<genexpr>)ÚfarmingÚagricultureÚcultivationrp   Úfarmc                 3   r±   r²   r"   )ro   Útermr´   r"   r#   r¶     r·   r5   )rm   r�   ÚitemsÚextendrz   r   r|   ÚanyÚsetÚaddrd   )Úsystem_namerG   rV   Úsystem_name_stdÚcategory_stdÚsystem_keywordsÚapplicable_keywordsr�   ÚkeywordsÚsystem_wordsÚexact_matchesÚpartial_matchesÚgeneral_matchesr”   Úsubsidy_nameÚsubsidy_categoryÚsubsidy_descriptionÚgeneral_termsÚresultÚseenÚunique_subsidiesÚ
subsidy_idr"   r´   r#   Úmatch_subsidies_for_systemÐ   sd   ù
€



€

€ rÔ   c           
      C   s  | sg S dd„ | D ƒ}|d j  ¡ j  ¡ |d< |d j  ¡ j  ¡ |d< | ¡  ¡ }g }|d  ¡  ¡ }|D ]}||v rA| |¡ q5tj||ddd	�}|rS| |d
 ¡ q5|sXg S ||d  |¡|d j  	|¡@  }	|	j
ru||d  |¡ }	|	j
s�|	g d¢  d¡S g S )Nc                 S   ó   g | ]}|  ¡  ¡ ‘qS r"   )rm   r�   )ro   Úcr"   r"   r#   rq   !  ó    z%get_market_prices.<locals>.<listcomp>rp   Úcrop_stdrI   Úlocation_stdé   çffffffæ?)ÚnÚcutoffr   )rI   rJ   rK   Úrecords)r?   rm   r�   ÚuniqueÚtolistr|   ÚdifflibÚget_close_matchesÚisinÚcontainsÚemptyÚto_dict)
rt   r+   Úprices_dataÚstandardized_cropsÚdistrict_stdÚmatched_cropsÚall_market_cropsrÖ   ÚfuzzyÚcrop_pricesr"   r"   r#   Úget_market_prices  s6   €ÿÿrî   z
/recommend)Úresponse_modelc           !      ƒ   s.  ��zpt ƒ  td| j› d| j› d| j› �ƒ t| ƒ}tt|ƒ› d�ƒ |jr/tdg g dd�W S | j	r7| j	 
¡ nd}t|ƒ}td	t|ƒ› d
|› �ƒ g }| ¡ D �]Ê\}}|d | j }|d }t|d | j| jƒ}	|	swdd„ |d  d¡D ƒ}	| jr™dd„ | jD ƒ‰ ‡ fdd„|	D ƒ}	|	s™dd„ |d  d¡D ƒ}	|d | j }
|d | j }zO| j| j|d | j| j| j| j| jdœ}td urítrít| ¡ ƒ ttƒ¡rít |g¡t }t |¡d }td|d › d|d›d�ƒ |}nd|d  d  }W n" t�y } ztd!|› �ƒ d|d  d  }W Y d }~nd }~ww d"t|d# d | jd$  ƒ }d"t|d d% | jd$  ƒ }d&d'd(d&d)œd'd&d&d*d)œd+d+d'd,d)œd(d'd(d(d)œd-œ}|  | j !¡ i ¡  |d  !¡ d*¡}|d. |d.  |d/  |d d0  d }t"dt#d|ƒƒ}| j$�r”|d | j$v �r”|d19 }t#d|ƒ}t%|	| jt&ƒ}t'|d |d |ƒ}|�rät(d2d3„ |d d4… D ƒƒ}t#|d5ƒ}|d"|d   }|| }|dk�rÓ|| }||9 }td6|› d7|d › d8|d›d�ƒ | )t*|d |d t+|d9ƒt+|d9ƒt+|d9ƒt+|d dƒ|	d d:… t+|
d9ƒt+|d9ƒt+|d9ƒ|d d4… |d;�¡ qO|j,d<d=„ d>d?� |d d4… }g }|D ])}|j-�rVt|j-ƒdk�rV|j-D ]}||v�rT| )|¡ t|ƒd:k�rT n�q?�q.td>||d d:… d	t|ƒ› d@| j› dA| j› dB�d�W S  t�y– } ztdC|› �ƒ dd l.} |  /¡  t0dDt1|ƒdE�‚d }~ww )FNzReceived request for u    sqft & â‚¹z budget in z$ systems matched initial constraintsFzpNo suitable farming systems found for your constraints. Please try increasing your budget or reducing plot size.)rY   rZ   r[   r\   r8   rˆ   z applicable subsidies for r`   Úopex_per_monthrM   c                 S   rk   r"   rl   rn   r"   r"   r#   rq   g  rr   z$recommend_system.<locals>.<listcomp>rR   rs   c                 S   rÕ   r"   )r�   rm   rn   r"   r"   r#   rq   k  r×   c                    s&   g | ]‰ t ‡ fd d„ˆD ƒƒrˆ ‘qS )c                 3   s   � | ]	}|ˆ   ¡ v V  qd S r²   )r�   )ro   Ú	user_crop©rp   r"   r#   r¶   m  ó   € z.recommend_system.<locals>.<listcomp>.<genexpr>)r¿   )ro   ©Ú
user_cropsrò   r#   rq   l  s    
ÿc                 S   rk   r"   rl   rn   r"   r"   r#   rq   o  rr   Ú!water_use_litres_per_day_per_sqftÚ$electricity_use_kwh_per_day_per_sqftrG   )r(   r)   rj   r-   r0   r2   r6   r7   r   zModel predicted ROI for z: z.2fú%éd   rQ   é   zError predicting ROI: rÚ   Úlabour_per_monthé
   é   gÍÌÌÌÌÌì?gš™™™™™é?g      ð?)r˜   r�   r¡   r©   rÛ   g333333ã?g      à?)r/   ÚcanalÚ	rainwaterÚ	municipalg      Ð?gš™™™™™É?g333333Ó?ra   c                 s   s   � | ]	}|  d d¡V  qdS )rC   r   Nr‰   )ro   rŠ   r"   r"   r#   r¶   º  ró   z#recommend_system.<locals>.<genexpr>rb   éF   zApplied z% subsidies to z, ROI adjusted to é   r5   )rM   rG   rN   rO   rP   rQ   rR   rS   rT   rW   rU   rV   c                 S   s   | j S r²   )rW   )Úxr"   r"   r#   r‹   Ú  s    z"recommend_system.<locals>.<lambda>TrŒ   z% best micro-farming systems for your z sqft plot in Ú.z"Error generating recommendations: iô  )Ústatus_codeÚdetail)2r$   r   r(   r)   r+   ri   rd   rå   rX   r9   rm   r—   Úiterrowsr„   r-   r.   rz   r3   r0   r2   r6   r7   r   r   rÀ   ÚkeysÚissubsetÚpdÚ	DataFrameÚpredictr   Úabsr   r�   rx   rw   r4   rî   rç   rÔ   Úsumr|   rL   ÚroundÚsortrR   Ú	tracebackÚ	print_excr   r?   )!r
   Úsuitable_systemsÚ
user_stateÚavailable_subsidiesrZ   Ú_rM   Útotal_setup_costrP   rR   Úwater_usageÚelectricity_usageÚinput_featuresÚXÚpredicted_roiÚexpected_roir!   Úlabor_matchÚ
risk_matchÚwater_source_scoresÚwater_scorerW   Úmarket_prices_listÚsystem_subsidiesÚtotal_subsidy_pctÚsubsidized_setup_costÚsubsidy_savingsÚadjustment_factorÚtop_recommendationsr[   r%   rp   r  r"   rô   r#   Úrecommend_systemF  s   € üøÿþ€€þüÿÿþ
ýû


"


ô


€
ü€ür)  z/debug/subsidiesc               
   Ã   s\   �zt s
dg dœW S dtt ƒ› d�t dœW S  ty- }  zdt| ƒiW  Y d} ~ S d} ~ ww )z+Debug endpoint to view all loaded subsidiesr…   )r\   rV   rˆ   z
 subsidiesÚerrorN)r�   rd   r   r?   )r!   r"   r"   r#   Úlist_all_subsidiesö  s   €þ€ÿr+  )r   N)FÚfastapir   r   Úpydanticr   r   Úpandasr
  ÚnumpyÚnpÚtypingr   r   r   r   r   Újsonrá   r   ÚdirnameÚabspathÚ__file__Ú
script_dirÚproject_rootÚjoinÚ
models_dirÚdata_dirr   r   r   r   r   r?   r>   r   r$   Úsystem_costs_pathÚread_csvrc   Úsoil_ph_pathr   r    r   r{   Úprices_pathrç   r   Úcolumnsrà   Úsubsidies_pathr�   rd   r   r!   Úrouterr'   rA   rH   rL   rX   ri   r=   r„   r—   rÔ   rî   Úpostr)  r   r+  r"   r"   r"   r#   Ú<module>   sr    
"
ÿ
ÿ€þ
L* 0