# 5_enrich_fulltext_emails_v1.3.py

**Krok 5 pipeline** — vytáhne plain-text z emailů v Mongu (`emaily.<schránka>`) a uloží do PostgreSQL (`MongoEmaily.emails`) s tsvector GIN indexem nad konfigurací `soubory` (simple + unaccent).

## Co dělá

1. Vybere první dostupné tělo v tomto pořadí:
   - `smime_body_text/html` (rozbaleno krokem 4)
   - `body_html` → strip HTML přes BeautifulSoup
   - `body_text` (legacy plain)
   - `body_preview` (jako fallback)
2. Naplní řádek v PG `emails` (mailbox, subject, sender, recipients, body, attachments_summary, ...) + tsvector se vygeneruje sám.
3. Upsert (`ON CONFLICT (mailbox, message_id) DO UPDATE`).

## Inkrementální logika

Pokud `(mailbox, message_id)` už je v PG a:
- `extractor_version == EXTRACTOR_VERSION` (aktuálně `1.2`)
- `ok = true`
- `modified_at` v Mongo není novější než v PG

→ **skip**. Nemusíš se bát opakovaného spuštění — vladimirovo přepsání 73k záznamů co teď probíhá je proto, že `EXTRACTOR_VERSION` byl povýšen z 1.1 → 1.2, takže všechny řádky v PG jsou „zastaralé". Po doběhnutí bude další běh skipovat všechno až na nově přibyvší.

## Změny v1.3 vs v1.2

- **Bugfix** `NON_MAILBOX_COLLECTIONS = {"attachments_index", "sync_state"}` — předtím `sync_state` (přibyla s delta syncem) projížděla jako mailbox.
- **`--index-reset`** — před zpracováním schránky `DELETE FROM emails WHERE mailbox=%s`. Force re-extract bez nutnosti povyšovat verzi.
- **Vylepšený per-mailbox header** — ukáže `v Mongu N, v PG M (uptodate K), k zpracovani K`.
- Když `to_process_estimate == 0` → schránku přeskočí úplně (bez iterace cursorem).

## Argumenty

| Argument | Povinný | Hodnoty | Default | Popis |
|---|---|---|---|---|
| `--mailbox` | ne | e-mail | (všechny) | Bez argumentu projede všechny kolekce mimo `NON_MAILBOX_COLLECTIONS` |
| `--limit N` | ne | int | (bez limitu) | Per schránka, jen prvních N emailů (test) |
| `--index-reset` | ne | flag | false | Před zpracováním **smaže** všechny emaily dané schránky v PG. **Bez `--mailbox` smaže CELÝ index!** |

## Varianty volání

```bash
# Všechny schránky, inkrementální:
docker exec -it python-runner python /scripts/5_enrich_fulltext_emails_v1.3.py

# Jedna schránka:
docker exec -it python-runner python /scripts/5_enrich_fulltext_emails_v1.3.py --mailbox ordinace@buzalkova.cz

# Test 500 emailů:
docker exec -it python-runner python /scripts/5_enrich_fulltext_emails_v1.3.py --mailbox ordinace@buzalkova.cz --limit 500

# Force reindex jedné schránky:
docker exec -it python-runner python /scripts/5_enrich_fulltext_emails_v1.3.py --mailbox ordinace@buzalkova.cz --index-reset

# DANGEROUS: smaže celý index a postaví znovu (POMALÉ — typicky 30+ minut):
docker exec -it python-runner python /scripts/5_enrich_fulltext_emails_v1.3.py --index-reset

# Na pozadí, log do souboru:
docker exec -d python-runner bash -c "python /scripts/5_enrich_fulltext_emails_v1.3.py > /scripts/enrich_fulltext.log 2>&1"
```

## Sledování průběhu

```bash
docker exec -it python-runner tail -f /scripts/enrich_fulltext.log
```

V průběhu skript vypisuje každých 200 zpracovaných emailů:
```
[ 38800|p=  5800] OK  html       2831ch  | CLEAR/RA payment information for invoice #22FV049
```
- první číslo = pozice v cursoru (počet všech emailů co prošlo)
- `p=N` = počet skutečně zprocesovaných (zbytek byl skipnut jako už-aktuální)
- `OK / ERR`, `body_source`, délka, subject

## Závislosti

```bash
docker exec python-runner pip install psycopg[binary] beautifulsoup4 lxml pymongo
```
