
    ADj                     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#?Ma1779	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OaQWWY	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_URLiQ 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)71#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 6Hc5K$K$E4 #M3"D#D# ZL#YN49 N N &NC%NCPT#Y P P 0J/!#3# ZL#YL#OSGT 0Is/#(S( 8s7!;3;"$C$')) &Is%M3  s(Is(NC!!OS IsIsM3M3L$99&OS&M4 IsGSHd J  NDL#]#S S   $ ()s s   *
 0t 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0T h  r^   