# 03 - Configuration Management (`app/config.py`)

Is document me hum `app/config.py` ke code ko line-by-line samjhenge aur dekhenge ki application configuration aur environment variables kaise manage kiye jaate hain.

---

## 1. What are Environment Variables & `.env`? (The "WHY")

Software development me ek mashhoor rule hai: **"Never hardcode configuration or secrets in source code."**

### Problem with Hardcoding:
If you write `mongodb_uri = "mongodb+srv://admin:secretpassword@cluster.mongodb.net"` inside Python code:
1. Agar code GitHub par push ho gaya, toh password compromise ho jayega.
2. Agar development se production deployment me switch karna ho, toh source code modify karna padega.

### Solution: `.env` File & Environment Variables
- Environment variables Operating System ya process level settings hoti hain.
- Hum `.env` file me key-value pairs rakhte hain:
  ```env
  MONGODB_URI=mongodb://localhost:27017
  DATABASE_NAME=chatbot_db
  ```
- Code runtime par `.env` file se parameters automatically read kar leta hai.

---

## 2. Line-by-Line Code Breakdown of `app/config.py`

Here is the exact code in `app/config.py`:

```python
1: from pydantic_settings import BaseSettings, SettingsConfigDict
2: 
3: class Settings(BaseSettings):
4:     mongodb_uri: str = "mongodb://localhost:27017"
5:     database_name: str = "chatbot_db"
6: 
7:     model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8", extra="ignore")
8: 
9: settings = Settings()
```

---

### Line 1: `from pydantic_settings import BaseSettings, SettingsConfigDict`
- **What it does:** `pydantic_settings` library se `BaseSettings` aur `SettingsConfigDict` import karta hai.
- **Why it is used:** Pydantic environment variables ko parse aur type-check karne ka sabse clean tareeka deta hai.

---

### Line 3-5: `class Settings(BaseSettings):`
```python
class Settings(BaseSettings):
    mongodb_uri: str = "mongodb://localhost:27017"
    database_name: str = "chatbot_db"
```
- **What it does:** `Settings` naam ki class banata hai jo `BaseSettings` se inherit karti hai.
- **Field Definitions:**
  - `mongodb_uri: str`: Expects a string. Default value is `"mongodb://localhost:27017"`.
  - `database_name: str`: Expects a string. Default value is `"chatbot_db"`.
- **How Pydantic settings work:**
  Pydantic check karta hai: *Kya system environment me ya `.env` file me `MONGODB_URI` variable maujood hai?*
  - Agar hai, toh wo `.env` ki value use karega.
  - Agar nahi hai, toh fallback default value (`"mongodb://localhost:27017"`) use karega.

---

### Line 7: `model_config = SettingsConfigDict(...)`
```python
model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8", extra="ignore")
```
- **`env_file=".env"`:** Pydantic ko bolta hai ki `.env` file se variables read kare.
- **`env_file_encoding="utf-8"`:** File encoding specify karta hai.
- **`extra="ignore"`:** Agar `.env` file me koi aisa variable ho jo `Settings` class me defined nahi hai, toh crash hone ki jagah use ignore kar de.

---

### Line 9: `settings = Settings()`
```python
settings = Settings()
```
- **What it does:** Class ka singleton object `settings` create karta hai.
- **How it is used in other files:**
  Kisi bhi file me hum directly import kar sakte hain:
  ```python
  from app.config import settings
  print(settings.mongodb_uri)  # Outputs: mongodb://localhost:27017 (or .env value)
  ```

---

## 3. Summary Checkpoint
- Configuration source code ke bahar `.env` me rahti hai.
- `app/config.py` Pydantic `BaseSettings` ke dwara settings load karta hai.
- Application pure backend me `settings.mongodb_uri` aur `settings.database_name` access karti hai.
