# Import Organization Constraints

## Standard Order

Organize imports in three groups with blank lines between:

```python
# 1. Standard library imports (alphabetical within group)
import json
import logging
import os
from datetime import datetime, timedelta
from typing import Dict, List, Optional, Tuple

# 2. Third-party packages (alphabetical within group)
import duckdb
import requests
from config import config

# 3. Local application modules (can use relative imports)
from database import db
from summarizer import summarizer
```

## Alphabetical Ordering

Within each group, sort imports alphabetically:

```python
# GOOD - alphabetical
import json
import logging
from datetime import datetime
from typing import Dict, List, Optional

# BAD - random order
from typing import Optional
import json
from datetime import datetime
import logging
from typing import Dict, List
```

## Grouping Rules

### Standard Library
- `json`, `logging`, `os`, `sys`, `time`
- `datetime`, `timedelta` from `datetime`
- `Dict`, `List`, `Optional`, etc. from `typing`
- `argparse`, `pathlib`, `re`, `uuid`

### Third-Party
- `duckdb`, `requests`, `streamlit`
- `numpy`, `scipy`, `sklearn`
- `plotly`, `beautifulsoup4`
- `pytest`

### Local Application
- Modules from same package
- Relative imports when appropriate

## When to Use `from X import Y`

### Prefer `from module import specific_items` for:
- Constants and config
- Single classes or functions used frequently
- Type annotations

```python
# GOOD - clear about what we're using
from config import config
from database import db

# GOOD - type hints
from typing import Dict, List, Optional
```

### Use `import module` when:
- You need multiple items from the module
- Using module.namespace is clearer

```python
# GOOD - duckdb used for types and module access
import duckdb

conn = duckdb.connect(...)
result = conn.execute(...)

# Also acceptable for types
from typing import Dict
```

## Relative Imports

In package modules, prefer relative imports:

```python
# pipeline/svd_pipeline.py
from ..database import MotionDatabase  # relative import
from .text_pipeline import process_text  # relative import
```

## Circular Imports

Avoid circular imports by:
1. Moving shared code to a third module
2. Using TYPE_CHECKING for type hints only

```python
# types.py - shared type definitions
from typing import TypedDict

class MotionDict(TypedDict):
    id: int
    title: str
    ...

# module_a.py
from .types import MotionDict

# module_b.py - if needed here too
from .types import MotionDict
```

## Import Patterns to Avoid

### Wildcard Imports
```python
# BAD
from database import *

# GOOD
from database import db, MotionDatabase
```

### Import in Function Scope (unless necessary)
```python
# AVOID - delays import, makes dependencies unclear
def some_function():
    import pandas as pd  # Late import
    return pd.DataFrame(...)

# PREFER - import at module level
import pandas as pd

def some_function():
    return pd.DataFrame(...)
```

### Reassigning Imported Names
```python
# BAD - confusing
from module import process
process = something_else  # Reassigning

# GOOD - clear naming
from module import process as process_data
```

## Type Checking Imports

For type hints only, use TYPE_CHECKING:

```python
from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from .models import Motion

def get_motion(motion_id: int) -> "Motion":  # String quote for forward ref
    ...
```

## Optional Dependency Imports

Handle optional dependencies gracefully:

```python
try:
    import duckdb
except Exception:
    duckdb = None  # Will be checked later

class MotionDatabase:
    def __init__(self):
        if duckdb is None:
            self._file_mode = True  # Fallback mode
```

## Example: Complete Import Block

```python
# Complete example from database.py
import json
import logging
import uuid
from datetime import datetime, timedelta
from typing import Dict, List, Optional, Tuple

import duckdb

from config import config

from database import db
```
