# Preprocess Text + Stats

Fuente conceptual: MiroFish `backend/app/services/text_processor.py` (AGPL-3.0)
Reimplementar desde cero. No copiar codigo.

## Funciones a implementar

### 1. preprocess_text

- **Dominio:** core
- **Lang:** Python
- **Purity:** pure
- **Signature:** `preprocess_text(text: str) -> str`
- **Descripcion:** Normaliza whitespace y newlines de un texto crudo. Util como paso previo a chunking o indexing.
- **Algoritmo:**
  1. Normalizar line endings: `\r\n` → `\n`, `\r` → `\n`
  2. Reducir 3+ newlines consecutivos a maximo 2: `\n{3,}` → `\n\n`
  3. Strip whitespace de cada linea
  4. Strip global
- **Deps:** `re`
- **Tests:** texto con \r\n (Windows), texto con muchos newlines, texto con espacios leading/trailing

### 2. get_text_stats

- **Dominio:** core
- **Lang:** Python
- **Purity:** pure
- **Signature:** `get_text_stats(text: str) -> dict`
- **Retorno:** `{"total_chars": int, "total_lines": int, "total_words": int}`
- **Descripcion:** Estadisticas basicas de un texto: caracteres, lineas, palabras.
- **Algoritmo:**
  1. `total_chars = len(text)`
  2. `total_lines = text.count('\n') + 1`
  3. `total_words = len(text.split())`
- **Deps:** ninguna
- **Tests:** texto normal, texto vacio, texto con solo newlines
