#!/usr/bin/env bash
# ============================================================================
# Пилот: POST /api/v1/files/ с knowledge_id — проверка double-embedding (задача 8a)
# ============================================================================
# Проверяем гипотезу из rag-double-embedding.md: если сразу передать knowledge_id
# в metadata при upload, вызовется ли process_file только ОДИН раз (вместо двух)?
#
# Ставится: /home/oswold/rag-tests/upload-with-kid-pilot.sh
# Прогон: разовый, ручной
#
# Требования:
#   - Open WebUI API token в OW_API_TOKEN (env или из Vaultwarden)
#   - Тестовый knowledge collection создан заранее (см. шаг 1)
#   - jq установлен: sudo apt install jq
#
# Что делает:
#   1. Создаёт тестовый Markdown файл /tmp/pilot-8a.md
#   2. Читает начальное состояние Qdrant (колво коллекций и точек)
#   3. Загружает через POST /api/v1/files/ с knowledge_id в multipart
#   4. Ждёт 5 сек (process_file асинхронно)
#   5. Смотрит логи rag-openwebui — сколько раз process_file вызвался
#   6. Читает финальное состояние Qdrant
#   7. Отчёт: одна или две коллекции?
# ============================================================================

set -euo pipefail

# --- Config ---
OW_HOST="http://192.168.1.200:3000"        # локально на ragserver
OW_API_TOKEN="${OW_API_TOKEN:?Set OW_API_TOKEN (from Vaultwarden \"OpenWebUI API · admin\")}"
QDRANT_HOST="http://192.168.1.200:6333"
QDRANT_KEY="${QDRANT_KEY:?Set QDRANT_KEY (from Vaultwarden \"Qdrant API key\")}"
KNOWLEDGE_ID="${KNOWLEDGE_ID:?Set KNOWLEDGE_ID (создай тестовую коллекцию через UI, скопируй ID)}"

TEST_FILE="/tmp/pilot-8a-$(date +%s).md"
LOG="/tmp/pilot-8a.log"

log() { echo "[$(date '+%H:%M:%S')] $*" | tee -a "$LOG"; }

# --- 1. Создать тестовый файл ---
cat > "$TEST_FILE" <<'EOF'
# Pilot Test 8a

Это тестовый файл для проверки double-embedding поведения Open WebUI.

## Содержание

- Проверяем ходит ли process_file 1 раз или 2 при указании knowledge_id в metadata.
- Если 1 раз — экономим эмбеддинг-токены ×2 при массовом sync KB.
- Смотрим коллекции в Qdrant после загрузки.

## Ссылка

См. подробности в [[rag-double-embedding]] секция "Вариант C".
EOF

log "Создан тестовый файл: $TEST_FILE ($(wc -c < "$TEST_FILE") байт)"

# --- 2. Начальное состояние Qdrant ---
log "=== Baseline: коллекции в Qdrant ДО загрузки ==="
BEFORE_JSON=$(curl -sS -H "api-key: $QDRANT_KEY" "$QDRANT_HOST/collections")
BEFORE_COUNT=$(echo "$BEFORE_JSON" | jq -r '.result.collections | length')
log "Коллекций всего: $BEFORE_COUNT"
echo "$BEFORE_JSON" | jq -r '.result.collections[].name' | tee -a "$LOG"

# --- 3. Очистить логи rag-openwebui — потом посмотрим свежие ---
log "=== Метка в логах rag-openwebui ==="
docker exec rag-openwebui sh -c "echo '=== PILOT 8a START ===' >> /app/backend/logs/webui.log 2>/dev/null" 2>/dev/null || true

# --- 4. Загрузить файл ---
log "=== Загружаю файл через POST /api/v1/files/ с knowledge_id=$KNOWLEDGE_ID ==="

# Multipart с metadata (в спецификации docs.openwebui.com):
UPLOAD_RESPONSE=$(curl -sS -X POST \
    -H "Authorization: Bearer $OW_API_TOKEN" \
    -F "file=@$TEST_FILE" \
    -F "metadata={\"knowledge_id\":\"$KNOWLEDGE_ID\"}" \
    "$OW_HOST/api/v1/files/")

log "Ответ upload:"
echo "$UPLOAD_RESPONSE" | jq . | tee -a "$LOG"

FILE_ID=$(echo "$UPLOAD_RESPONSE" | jq -r '.id // empty')
[[ -z "$FILE_ID" ]] && { log "FATAL: не получил file_id из ответа"; exit 1; }
log "file_id: $FILE_ID"

# --- 5. Подождать пока process_file отработает ---
log "Жду 8 сек чтобы process_file завершился..."
sleep 8

# --- 6. Проверить логи rag-openwebui на предмет process_file вызовов ---
log "=== Записи process_file в логах после метки ==="
PROCESS_CALLS=$(docker logs --since 30s rag-openwebui 2>&1 | grep -c "process_file" || true)
log "Количество вызовов 'process_file' в логах за последние 30 сек: $PROCESS_CALLS"
docker logs --since 30s rag-openwebui 2>&1 | grep -i "process_file\|embedding" | tee -a "$LOG" || true

# --- 7. Финальное состояние Qdrant ---
log "=== Qdrant ПОСЛЕ загрузки ==="
sleep 2
AFTER_JSON=$(curl -sS -H "api-key: $QDRANT_KEY" "$QDRANT_HOST/collections")
AFTER_COUNT=$(echo "$AFTER_JSON" | jq -r '.result.collections | length')
log "Коллекций всего: $AFTER_COUNT (было $BEFORE_COUNT, дельта: $((AFTER_COUNT - BEFORE_COUNT)))"
echo "$AFTER_JSON" | jq -r '.result.collections[].name' | tee -a "$LOG"

# --- 8. Точки в целевой коллекции + возможной file-коллекции ---
log "=== Точки в knowledge collection ($KNOWLEDGE_ID) ==="
curl -sS -H "api-key: $QDRANT_KEY" \
    "$QDRANT_HOST/collections/$KNOWLEDGE_ID" | \
    jq '.result.points_count, .result.status' | tee -a "$LOG"

# Ищем коллекцию по file_id (open-file-XXXX или похожее)
POSSIBLE_FILE_COLLECTIONS=$(echo "$AFTER_JSON" | jq -r ".result.collections[].name" | \
    grep -iE "$FILE_ID|open-|file-" || true)

if [[ -n "$POSSIBLE_FILE_COLLECTIONS" ]]; then
    log "=== Найдены возможные file-scoped коллекции: ==="
    echo "$POSSIBLE_FILE_COLLECTIONS" | tee -a "$LOG"
    for col in $POSSIBLE_FILE_COLLECTIONS; do
        log "Точки в $col:"
        curl -sS -H "api-key: $QDRANT_KEY" \
            "$QDRANT_HOST/collections/$col" | \
            jq '.result.points_count' | tee -a "$LOG"
    done
else
    log "=== ✅ File-scoped коллекций НЕ создано — double-embedding НЕ произошло! ==="
fi

# --- 9. Вывод ---
log ""
log "======================================================================"
log "ИТОГ ПИЛОТА:"
log "  process_file вызвался: $PROCESS_CALLS раз(а)"
log "  Коллекций создано: $((AFTER_COUNT - BEFORE_COUNT))"
log "  file_id: $FILE_ID"
log ""
if [[ "$((AFTER_COUNT - BEFORE_COUNT))" -eq 0 ]] && [[ "$PROCESS_CALLS" -le 1 ]]; then
    log "✅ ГИПОТЕЗА ПОДТВЕРДИЛАСЬ: knowledge_id в metadata предотвращает double-embedding"
    log "→ Переписываем sync-to-openwebui.sh на этот путь (экономия ×2 токенов)"
elif [[ "$((AFTER_COUNT - BEFORE_COUNT))" -ge 1 ]]; then
    log "❌ ГИПОТЕЗА НЕ ПОДТВЕРДИЛАСЬ: double-embedding всё ещё случается"
    log "→ Оставляем текущий Вариант A (смириться)"
else
    log "⚠️ Неоднозначный результат — читай логи $LOG и решай глазами"
fi
log "======================================================================"

# --- Уборка ---
rm -f "$TEST_FILE"
log ""
log "Лог сохранён: $LOG"
log "Тестовый файл удалён из /tmp"
log "Тестовый файл в OpenWebUI (file_id=$FILE_ID) не удалялся — удали через UI если не нужен"
