# Extract Text from File (PDF/MD/TXT)

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

## Funcion a implementar

### extract_text_from_file

- **Dominio:** core
- **Lang:** Python
- **Purity:** impure (I/O: lee archivos)
- **Signature:** `extract_text_from_file(file_path: str) -> str`
- **Descripcion:** Extrae texto plano de un archivo. Soporta PDF (PyMuPDF), Markdown y TXT (con deteccion automatica de encoding).
- **Algoritmo:**
  1. Verificar que archivo existe
  2. Determinar tipo por extension:
     - `.pdf`: abrir con PyMuPDF (fitz), extraer texto de cada pagina, unir con `\n\n`
     - `.md`, `.markdown`, `.txt`: leer con deteccion de encoding
  3. Extension no soportada: raise ValueError
- **Deteccion de encoding (para texto):**
  1. Intentar UTF-8
  2. Si falla: `charset_normalizer.from_bytes(data).best().encoding`
  3. Si falla: `chardet.detect(data)["encoding"]`
  4. Ultimo recurso: UTF-8 con `errors='replace'`
- **Deps:** `PyMuPDF` (fitz), opcionalmente `charset_normalizer`, `chardet`
- **Error type:** FileNotFoundError, ValueError (extension no soportada), ImportError (PyMuPDF no instalado)
- **Diferencia con OpenViking:** OpenViking tiene parsers completos que convierten a markdown estructurado. Esta funcion es mas simple: solo extrae texto plano sin preservar estructura.
- **Tests:** PDF con texto, archivo MD UTF-8, archivo TXT latin-1, archivo inexistente (error), extension no soportada (error)
