Ë
    AŸDj  ã                   óh   — d Z ddlmZ ddlmZ ddlmZ ddlmZm	Z	  G d„ de«      Z
ede
fd	„«       Zy
)u  
Central configuration for the AI Crop Decision Support System.

All settings are loaded from environment variables (.env file in development,
real environment variables in production on the VPS). Nothing is hardcoded
here â€” this file only defines defaults and types, never secrets.

Why this matters for production:
- A missing or malformed env var fails LOUDLY at startup (via Pydantic
  validation), not silently three hours later when a request hits it.
- Secrets (API keys, DB passwords) never live in source control.
é    )Ú	lru_cache)ÚList)Úfield_validator)ÚBaseSettingsÚSettingsConfigDictc                   ó.  — e Zd ZU  edddd¬«      ZdZeed<   dZeed	<   d
Z	eed<   dZ
eed<   dZeed<   dZeed<   dZeed<   dZeed<   edee   fd„«       ZdZeed<   dZeed<   edee   fd„«       ZdZeed<   dZeed<   d Zeed!<   d"Zeed#<   d$Zeed%<   dZeed&<   d'Zeed(<   d)Zeed*<   d+Zeed,<   d-Z eed.<   d/Z!eed0<   d1Z"eed2<   d3Z#eed4<   d5Z$eed6<   dZ%eed7<   d8Z&eed9<   d:Z'eed;<   dZ(eed<<   d=Z)eed><   dZ*eed?<   d@Z+eedA<   dZ,eedB<   dZ-eedC<   dDZ.eedE<   dFZ/eedG<   dHZ0eedI<   dZ1eedJ<   dKZ2eedL<   dMZ3eedN<   dDZ4eedO<   dZ5eedP<   dDZ6eedQ<   dRZ7eedS<    e8d«      e9dTedefdU„«       «       Z: e8d7«      e9dTedefdV„«       «       Z;edefdW„«       Z<yX)YÚSettingsz.envzutf-8FÚignore)Úenv_fileÚenv_file_encodingÚcase_sensitiveÚextrazAI Crop Decision Support SystemÚAPP_NAMEz1.0.0ÚAPP_VERSIONÚdevelopmentÚENVIRONMENTÚDEBUGz/api/v1ÚAPI_V1_PREFIXz0.0.0.0ÚHOSTi@  ÚPORTz?http://localhost:3000,http://127.0.0.1:3000,http://0.0.0.0:3000ÚCORS_ORIGINSÚreturnc                 óœ   — | j                   j                  d«      D �cg c]#  }|j                  «       sŒ|j                  «       ‘Œ% c}S c c}w ©Nú,)r   ÚsplitÚstrip)ÚselfÚos     ú<C:\Crop_Prediction\Backend\crop-ai-system\app\core\config.pyÚcors_origins_listzSettings.cors_origins_list+   s5   € à#'×#4Ñ#4×#:Ñ#:¸3Ó#?ÖM˜aÀ1Ç7Á7Å9�—‘•	ÒMÐMùÒMó
   žA	´A	z	X-API-KeyÚAPI_KEY_HEADERÚ ÚVALID_API_KEYSc                 óœ   — | j                   j                  d«      D �cg c]#  }|j                  «       sŒ|j                  «       ‘Œ% c}S c c}w r   )r%   r   r   )r   Úks     r    Úvalid_api_keys_listzSettings.valid_api_keys_list3   s5   € à#'×#6Ñ#6×#<Ñ#<¸SÓ#AÖO˜aÀQÇWÁWÅY�—‘•	ÒOÐOùÒOr"   ÚCHANGE_ME_IN_PRODUCTIONÚ
SECRET_KEYé   ÚRATE_LIMIT_PER_MINUTEz?postgresql+asyncpg://crop_user:crop_pass@localhost:5432/crop_dbÚDATABASE_URLé
   ÚDB_POOL_SIZEé   ÚDB_MAX_OVERFLOWÚDB_ECHOzredis://localhost:6379/0Ú	REDIS_URLi€Q ÚREDIS_CACHE_TTL_SECONDSzredis://localhost:6379/1ÚCELERY_BROKER_URLzredis://localhost:6379/2ÚCELERY_RESULT_BACKENDé<   ÚCELERY_TASK_TIME_LIMITé-   ÚCELERY_TASK_SOFT_TIME_LIMITzdata/models/v1Ú	MODEL_DIRÚv1ÚMODEL_VERSIONÚANTHROPIC_API_KEYzclaude-sonnet-4-6Ú	LLM_MODELiè  ÚLLM_MAX_TOKENSÚLLM_TIMEOUT_SECONDSé   ÚLLM_MAX_RETRIESÚ	SMTP_HOSTiK  Ú	SMTP_PORTÚSMTP_USERNAMEÚSMTP_PASSWORDTÚSMTP_USE_TLSznoreply@agrifield.exampleÚEMAIL_FROM_ADDRESSÚ	AgriFieldÚEMAIL_FROM_NAMEÚEMAIL_ENABLEDÚINFOÚ	LOG_LEVELÚlogsÚLOG_DIRÚLOG_JSONÚ
SENTRY_DSNÚENABLE_METRICSi‚#  ÚMETRICS_PORTÚvc                 ó:   — h d£}||vrt        d|› d|› d�«      ‚|S )N>   ÚstagingÚ
productionr   zENVIRONMENT must be one of z, got 'ú')Ú
ValueError)ÚclsrU   Úalloweds      r    Úvalidate_environmentzSettings.validate_environmentk   s1   € ò ;ˆØ�GÑÜÐ:¸7¸)À7È1È#ÈQÐOÓPÐPØˆó    c                 ó   — |S )N© )r[   rU   s     r    Úvalidate_anthropic_keyzSettings.validate_anthropic_keys   s	   € ð
 ˆr^   c                 ó    — | j                   dk(  S )NrX   )r   )r   s    r    Úis_productionzSettings.is_productionz   s   € à×Ñ <Ñ/Ð/r^   N)=Ú__name__Ú
__module__Ú__qualname__r   Úmodel_configr   ÚstrÚ__annotations__r   r   r   Úboolr   r   r   Úintr   Úpropertyr   r!   r#   r%   r(   r*   r,   r-   r/   r1   r2   r3   r4   r5   r6   r8   r:   r;   r=   r>   r?   r@   rA   rC   rD   rE   rF   rG   rH   rI   rK   rL   rN   rP   rQ   rR   rS   rT   r   Úclassmethodr]   ra   rc   r`   r^   r    r	   r	      s¥  … Ù%ØØ!ØØô	€Lð 6€HˆcÓ5Ø€K�ÓØ$€K�Ó$Ø€Eˆ4Óð #€M�3Ó"Ø€Dˆ#ÓØ€Dˆ#Óð Z€L�#ÓYàðN 4¨¡9ò Nó ðNð &€N�CÓ%Ø€N�CÓàðP T¨#¡Yò Pó ðPð 0€J�Ó/Ø!#Ð˜3Ó#ð Z€L�#ÓYØ€L�#ÓØ€O�SÓØ€GˆTÓð 0€IˆsÓ/Ø#(Ð˜SÓ(ð 8Ð�sÓ7Ø!;Ð˜3Ó;Ø"$Ð˜CÓ$Ø')Ð Ó)ð &€IˆsÓ%Ø€M�3Óð  Ð�sÓØ(€IˆsÓ(Ø€N�CÓØ!Ð˜Ó!Ø€O�SÓð €IˆsÓØ€IˆsÓØ€M�3ÓØ€M�3ÓØ€L�$ÓØ9Ð˜Ó9Ø&€O�SÓ&Ø€M�4Óð €IˆsÓØ€GˆSÓØ€HˆdÓð €J�Óð  €N�DÓØ€L�#Óá�]Ó#Øð Sð ¨Sò ó ó $ðñ Ð(Ó)Øð sð ¨sò ó ó *ðð
 ð0˜tò 0ó ñ0r^   r	   r   c                  ó   — t        «       S )uK   Cached settings instance â€” env is read once per process, not per request.)r	   r`   r^   r    Úget_settingsro      s   € ô ‹:Ðr^   N)Ú__doc__Ú	functoolsr   Útypingr   Úpydanticr   Úpydantic_settingsr   r   r	   ro   r`   r^   r    ú<module>ru      sB   ðñõ  Ý å $ß >ôg0ˆ|ô g0ðT ð�hò ó ñr^   