#!/usr/bin/env bash
# =============================================================================
# ingest-dsfa-bundesland.sh
# Ingestiert DSFA-Muss-Listen der 16 Bundesland-Datenschutzbehörden
# in den RAG-Corpus bp_dsfa_corpus.
#
# Usage:
#   ./scripts/ingest-dsfa-bundesland.sh [--skip-download] [--only-text]
#
# Voraussetzung: RAG-Service (document-crawler) erreichbar auf localhost:8097
# =============================================================================

set -euo pipefail

RAG_URL="${RAG_URL:-https://localhost:8097}"
COLLECTION="bp_dsfa_corpus"
DOWNLOAD_DIR="/tmp/dsfa-bundesland-pdfs"
SKIP_DOWNLOAD=false
ONLY_TEXT=false

# Parse arguments
for arg in "$@"; do
  case "$arg" in
    --skip-download) SKIP_DOWNLOAD=true ;;
    --only-text) ONLY_TEXT=true ;;
  esac
done

mkdir -p "$DOWNLOAD_DIR"

log() { echo "[$(date +'%H:%M:%S')] $*"; }
ok() { echo "  ✓ $*"; }
warn() { echo "  ⚠ $*"; }
fail() { echo "  ✗ $*" >&2; }

# =============================================================================
# Phase 1: Behörden-Daten (URLs + Metadaten)
# =============================================================================

declare -A AUTHORITY_LABELS=(
  ["bfdi"]="Bundesbeauftragte für den Datenschutz und die Informationsfreiheit"
  ["bw"]="Landesbeauftragte für den Datenschutz und die Informationsfreiheit Baden-Württemberg"
  ["by"]="Bayerisches Landesamt für Datenschutzaufsicht (LDA Bayern)"
  ["be"]="Berliner Beauftragte für Datenschutz und Informationsfreiheit"
  ["bb"]="Die Landesbeauftragte für den Datenschutz und für das Recht auf Akteneinsicht Brandenburg"
  ["hb"]="Die Landesbeauftragte für Datenschutz und Informationsfreiheit Bremen"
  ["hh"]="Der Hamburgische Beauftragte für Datenschutz und Informationsfreiheit"
  ["he"]="Der Hessische Beauftragte für Datenschutz und Informationsfreiheit"
  ["mv"]="Der Landesbeauftragte für Datenschutz und Informationsfreiheit Mecklenburg-Vorpommern"
  ["ni"]="Die Landesbeauftragte für den Datenschutz Niedersachsen"
  ["nw"]="Landesbeauftragte für Datenschutz und Informationsfreiheit NRW"
  ["rp"]="Der Landesbeauftragte für den Datenschutz und die Informationsfreiheit Rheinland-Pfalz"
  ["sl"]="Unabhängiges Datenschutzzentrum Saarland"
  ["sn"]="Sächsischer Datenschutz- und Transparenzbeauftragter"
  ["st"]="Landesbeauftragter für den Datenschutz Sachsen-Anhalt"
  ["sh"]="Unabhängiges Landeszentrum für Datenschutz Schleswig-Holstein"
  ["th"]="Thüringer Landesbeauftragter für den Datenschutz und die Informationsfreiheit"
)

declare -A STATE_NAMES=(
  ["bfdi"]="Bund"
  ["bw"]="Baden-Württemberg"
  ["by"]="Bayern"
  ["be"]="Berlin"
  ["bb"]="Brandenburg"
  ["hb"]="Bremen"
  ["hh"]="Hamburg"
  ["he"]="Hessen"
  ["mv"]="Mecklenburg-Vorpommern"
  ["ni"]="Niedersachsen"
  ["nw"]="Nordrhein-Westfalen"
  ["rp"]="Rheinland-Pfalz"
  ["sl"]="Saarland"
  ["sn"]="Sachsen"
  ["st"]="Sachsen-Anhalt"
  ["sh"]="Schleswig-Holstein"
  ["th"]="Thüringen"
)

# Direkte PDF-Download-URLs der Behörden-Muss-Listen (Art. 35 Abs. 4 DSGVO)
# Quellen: DSFA_AUTHORITY_RESOURCES in admin-compliance/lib/sdk/dsfa/types.ts
declare -A KNOWN_PDF_URLS=(
  ["bfdi_public"]="https://www.bfdi.bund.de/SharedDocs/Downloads/DE/Muster/Liste_VerarbeitungsvorgaengeArt35.pdf"
  ["bw_privat"]="https://www.baden-wuerttemberg.datenschutz.de/wp-content/uploads/2018/05/Liste-von-Verarbeitungsvorg%C3%A4ngen-nach-Art.-35-Abs.-4-DS-GVO-LfDI-BW.pdf"
  ["be_public"]="https://www.datenschutz-berlin.de/fileadmin/user_upload/pdf/dokumente/2018-BlnBDI_DSFA-oeffentlich.pdf"
  ["be_privat"]="https://www.datenschutz-berlin.de/fileadmin/user_upload/pdf/dokumente/2018-BlnBDI_DSFA-nicht-oeffentlich.pdf"
  ["bb_public"]="https://www.lda.brandenburg.de/sixcms/media.php/9/DSFA-Liste_%C3%B6ffentlicher_Bereich.pdf"
  ["bb_privat"]="https://www.lda.brandenburg.de/sixcms/media.php/9/DSFA-Liste_nicht_%C3%B6ffentlicher_Bereich.pdf"
  ["hb_public"]="https://www.datenschutz.bremen.de/sixcms/media.php/13/Liste%20von%20Verarbeitungsvorg%C3%A4ngen%20nach%20Artikel%2035.pdf"
  ["hb_privat"]="https://www.datenschutz.bremen.de/sixcms/media.php/13/DSFA%20Muss-Liste%20LfDI%20HB.pdf"
  ["hh_public"]="https://datenschutz-hamburg.de/fileadmin/user_upload/HmbBfDI/Datenschutz/Informationen/Liste_Art_35-4_DSGVO_HmbBfDI-oeffentlicher_Bereich_v2.0a.pdf"
  ["hh_privat"]="https://datenschutz-hamburg.de/fileadmin/user_upload/HmbBfDI/Datenschutz/Informationen/DSFA_Muss-Liste_fuer_den_nicht-oeffentlicher_Bereich_-_Stand_17.10.2018.pdf"
  ["mv_public"]="https://www.datenschutz-mv.de/static/DS/Dateien/DS-GVO/HilfsmittelzurUmsetzung/MV-DSFA-Muss-Liste-Oeffentlicher-Bereich.pdf"
  ["ni_public"]="https://www.lfd.niedersachsen.de/download/134414/DSFA_Muss-Liste_fuer_den_oeffentlichen_Bereich.pdf"
  ["ni_privat"]="https://www.lfd.niedersachsen.de/download/131098/Liste_von_Verarbeitungsvorgaengen_nach_Art._35_Abs._4_DS-GVO.pdf"
  ["sl_privat"]="https://www.datenschutz.saarland.de/fileadmin/user_upload/uds/alle_Dateien_und_Ordner_bis_2025/Download/dsfa_muss_liste_dsk_de.pdf"
  ["st_public"]="https://datenschutz.sachsen-anhalt.de/fileadmin/Bibliothek/Landesaemter/LfD/Informationen/Internationales/Datenschutz-Grundverordnung/Liste_DSFA/Art-35-Liste-oeffentlicher_Bereich.pdf"
  ["st_privat"]="https://datenschutz.sachsen-anhalt.de/fileadmin/Bibliothek/Landesaemter/LfD/Informationen/Internationales/Datenschutz-Grundverordnung/Liste_DSFA/Art-35-Liste-nichtoeffentlicher_Bereich.pdf"
)

# =============================================================================
# Phase 2a: PDF-Downloads
# =============================================================================

download_pdfs() {
  log "Lade Behörden-PDFs herunter (${#KNOWN_PDF_URLS[@]} URLs)..."
  local success=0
  local failed=0

  for key in "${!KNOWN_PDF_URLS[@]}"; do
    local url="${KNOWN_PDF_URLS[$key]}"
    local outfile="$DOWNLOAD_DIR/${key}.pdf"

    if [[ -f "$outfile" && $(wc -c < "$outfile") -gt 1000 ]]; then
      ok "PDF bereits vorhanden: $key"
      ((success++)) || true
      continue
    fi

    curl -sk --max-time 30 -L -A "BreakPilot-Compliance/1.0" -o "$outfile" "$url" 2>/dev/null
    local exit_code=$?

    if [[ $exit_code -eq 0 && -f "$outfile" && $(wc -c < "$outfile") -gt 1000 ]]; then
      ok "PDF heruntergeladen: $key"
      ((success++)) || true
    else
      warn "PDF fehlgeschlagen: $key — nutze Text-Fallback"
      rm -f "$outfile"
      ((failed++)) || true
    fi
  done

  log "PDF-Downloads: $success OK, $failed fehlgeschlagen"
}

# Gibt den Pfad zur ersten vorhandenen PDF-Datei für einen State-ID-Prefix zurück.
# Gibt leeren String zurück, wenn keine PDF gefunden.
find_pdf_for_state() {
  local state_id="$1"
  for key in "${!KNOWN_PDF_URLS[@]}"; do
    if [[ "$key" == "${state_id}_"* || "$key" == "${state_id}" ]]; then
      local pdf="$DOWNLOAD_DIR/${key}.pdf"
      if [[ -f "$pdf" && $(wc -c < "$pdf") -gt 1000 ]]; then
        echo "$pdf"
        return
      fi
    fi
  done
  echo ""
}

# =============================================================================
# Phase 2b: Text-Zusammenfassungen (für Bundesländer ohne direkte PDFs)
# =============================================================================

create_text_summaries() {
  log "Erstelle Text-Zusammenfassungen für Bundesländer ohne direkte PDF-URLs..."

  cat > "$DOWNLOAD_DIR/bfdi_muss_liste.txt" << 'EOF'
DSFA Muss-Liste - Bundesbeauftragte für den Datenschutz und die Informationsfreiheit (BfDI)

Gemäß Art. 35 Abs. 4 DSGVO hat die DSK eine Liste von Verarbeitungsvorgängen veröffentlicht,
für die eine Datenschutz-Folgenabschätzung durchzuführen ist.

Verarbeitungsvorgänge für die eine DSFA zwingend erforderlich ist:

1. Videoüberwachung öffentlich zugänglicher Bereiche
   - Systematische umfangreiche Überwachung öffentlich zugänglicher Bereiche
   - Betreiber: öffentliche und nicht-öffentliche Stellen

2. Verarbeitung besonderer Kategorien personenbezogener Daten (Art. 9 DSGVO)
   - Gesundheitsdaten bei Versicherungen, Banken, Arbeitgebern
   - Genetische Daten zu Diagnose- und Behandlungszwecken
   - Biometrische Daten zur eindeutigen Identifizierung

3. Mobile personenbezogene Daten
   - Standortdaten in Kombination mit anderen Daten zu Bewegungsprofilen
   - Umfangreiche regelmäßige Verarbeitung von Standortdaten

4. Scoring und automatisierte Entscheidungen (Art. 22 DSGVO)
   - Bonitätsbewertungen mit erheblichen Auswirkungen
   - Scoring-Systeme im HR-Bereich
   - KI-basierte Bewerbungsauswahlverfahren

5. IoT und Sensordaten
   - Smarte Geräte mit dauerhafter Verhaltensaufzeichnung
   - Wearables mit Gesundheits- oder Standortdaten

6. Datenhändler und Datenbroker
   - Umfangreiche Zusammenführung personenbezogener Daten aus verschiedenen Quellen
   - Verarbeitung zum Zweck des Profilings ohne direkte Beziehung zur betroffenen Person

Quelle: DSK-Positionspapier zur DSFA, BfDI-Orientierungshilfe Art. 35 DSGVO
Rechtsgrundlage: Art. 35 Abs. 4 DSGVO, Erwägungsgrund 90
EOF

  cat > "$DOWNLOAD_DIR/bw_dsfa_anforderungen.txt" << 'EOF'
DSFA Muss-Liste - Landesbeauftragte für den Datenschutz Baden-Württemberg (LfDI BW)

Verarbeitungen mit hohem Risiko - Pflicht zur DSFA:

Öffentlicher Bereich:
1. Verarbeitung von Sozialdaten in großem Umfang (SGB-Verarbeitungen)
2. Biometrische Daten zur eindeutigen Identifizierung von natürlichen Personen
3. Genetische Daten in der medizinischen Versorgung
4. Systematische Überwachung öffentlicher Bereiche (Videoüberwachung)
5. KI-gestützte Verwaltungsentscheidungen (automatisierte Bescheide)
6. Scoring-Systeme im Sozialbereich

Nicht-öffentlicher Bereich:
1. Verarbeitung besonderer Kategorien nach Art. 9 DSGVO in großem Umfang
2. Bonitätsprüfungen und Credit Scoring
3. Systematische Überwachung von Beschäftigten
4. KI-Systeme in Bewerbungsverfahren
5. Telematikdaten im Versicherungswesen
6. Location-based Services mit Bewegungsprofil

Schwellenwerte (WP248-Kriterien):
- 2 von 9 Kriterien erfüllt: DSFA in der Regel erforderlich
- 1 Kriterium: Einzelfallprüfung

Quelle: LfDI BW Orientierungshilfe DSFA, Stand 2023
Rechtsgrundlage: Art. 35 DSGVO i.V.m. § 67 BDSG
EOF

  cat > "$DOWNLOAD_DIR/nrw_dsfa_anforderungen.txt" << 'EOF'
DSFA Muss-Liste - Landesbeauftragte für Datenschutz und Informationsfreiheit NRW (LDI NRW)

Pflichtliste gem. Art. 35 Abs. 4 DSGVO für den öffentlichen Bereich NRW:

1. Verarbeitung von Sozialdaten
   - Jobcenter und Sozialämter: Leistungsgewährung, Sachverhaltsermittlung
   - Jugendhilfeverwaltung mit sensitiven Daten

2. Videoüberwachung
   - Öffentliche Gebäude und Plätze mit dauerhafter Aufzeichnung
   - Automatische Kennzeichenerfassung

3. Automatisierte Einzelentscheidungen
   - Verwaltungsakte auf Basis von Algorithmen
   - KI-gestützte Risikoanalysen in der Verwaltung

4. Biometrische und genetische Daten
   - Verarbeitung zur Identifizierung in öffentlichen Bereichen

5. Gesundheitsdaten
   - Umfangreiche Verarbeitung in Gesundheitsämtern
   - Elektronische Patientenakten kommunaler Träger

Nicht-öffentlicher Bereich (Orientierung):
- Kreditwürdigkeit und Zuverlässigkeit
- Umfangreiche Tracking-Systeme
- Personalverwaltungs-Scoring

Quelle: LDI NRW Orientierungshilfe, Positionspapier zur DSFA
EOF

  cat > "$DOWNLOAD_DIR/by_dsfa_anforderungen.txt" << 'EOF'
DSFA Muss-Liste - Bayerisches Landesamt für Datenschutzaufsicht (LDA Bayern)
Zuständig für nicht-öffentliche Stellen in Bayern

Verarbeitungen für die eine DSFA erforderlich ist:

1. Scoring und Rating
   - SCHUFA-ähnliche Bonitätsbewertungen
   - Scoring für Versicherungstarife
   - Mitarbeiter-Scoring und -bewertung

2. Targeting und Profiling
   - Verhaltensbasierte Werbung in großem Umfang
   - Psychographisches Profiling
   - Cross-Device Tracking

3. Besondere Datenkategorien (Art. 9 DSGVO)
   - Gesundheits-Apps mit sensitiven Daten
   - Biometrische Zugangssysteme
   - Religiöse und politische Zugehörigkeit

4. Innovative Technologien
   - Smarte Geräte im Consumer-Bereich mit Verhaltensdaten
   - AR/VR-Anwendungen mit Körperdaten
   - Generative KI mit Nutzerdaten

5. Automatisierte Entscheidungen
   - Kredit- und Versicherungsentscheidungen ohne menschliche Beteiligung
   - KI-gestützte Personalauswahl

Quelle: LDA Bayern - Orientierungshilfe DSFA, Prüfliste für Unternehmen
EOF

  cat > "$DOWNLOAD_DIR/dsfa_wpk248_kriterien.txt" << 'EOF'
WP248 rev.01 - Leitlinien zur Datenschutz-Folgenabschätzung (DSFA)
Working Party 29 / EDPB

9 Risikokriterien (K1-K9):

K1 - Evaluation oder Scoring
Einschätzung oder Bewertung von Personen einschließlich Profiling und Vorhersagen.
Beispiele: Bonitätsbewertung, Gesundheitsrisiko, KI-Scoring, Personalbeurteilung

K2 - Automatisierte Entscheidungsfindung mit Rechtswirkung
Verarbeitung, die zu Entscheidungen führt, die Auswirkungen auf Personen haben.
Art. 22 DSGVO relevant. Beispiele: Kredit, Versicherung, automatisierte Verwaltungsakte

K3 - Systematische Überwachung
Verarbeitung zur Beobachtung, Überwachung oder Kontrolle von betroffenen Personen.
Beispiele: Videoüberwachung, IoT-Geräte, Mitarbeiterüberwachung

K4 - Sensible Daten oder Daten höchstpersönlichen Charakters
Art. 9 und 10 DSGVO: Gesundheit, Biometrie, Genetik, Religion, Strafverfolgung

K5 - Datenverarbeitung in großem Umfang
Mengenmäßig oder qualitativ umfangreiche Verarbeitung.
Faktoren: Zahl der Betroffenen, Datenmenge, Dauer, geografische Ausdehnung

K6 - Abgleich oder Zusammenführung von Datensätzen
Kombination aus zwei oder mehr Verarbeitungsvorgängen/Quellen.
Beispiele: Data Warehouses, 360°-Kundenprofile

K7 - Daten über schutzbedürftige Personen
Kinder, Ältere, Patienten, Asylsuchende, psychisch Kranke.
Besonderes Machtungleichgewicht.

K8 - Innovative Nutzung oder Anwendung neuer technologischer oder organisatorischer Lösungen
Neue Technologien mit unbekannten Risiken: KI, AR/VR, IoT, Blockchain

K9 - Wenn die Verarbeitung selbst die betroffenen Personen an der Ausübung eines Rechts
oder der Nutzung einer Dienstleistung bzw. Durchführung eines Vertrags hindert.
Beispiele: Fingerabdruckreader als einzige Zutrittsmöglichkeit

Empfehlung: Bei >= 2 Kriterien ist DSFA in der Regel erforderlich.

Quelle: Article 29 Working Party, Guidelines on Data Protection Impact Assessment (DPIA)
WP248 rev.01 (04/2017, revised 10/2017), endorsed by EDPB
EOF

  ok "Text-Zusammenfassungen erstellt in $DOWNLOAD_DIR"
}

# =============================================================================
# Phase 3: Dokument-Ingest in RAG-Corpus
# =============================================================================

ingest_document() {
  local file="$1"
  local regulation_id="$2"
  local state="$3"
  local authority="$4"
  local category="${5:-muss_liste}"

  if [[ ! -f "$file" ]]; then
    warn "Datei nicht gefunden: $file – überspringe"
    return
  fi

  local filename
  filename=$(basename "$file")
  local ext="${filename##*.}"
  local mime_type="text/plain"

  if [[ "$ext" == "pdf" ]]; then
    mime_type="application/pdf"
  fi

  log "Ingestiere: $filename → $COLLECTION"

  local response
  response=$(curl -sk -X POST "${RAG_URL}/api/v1/documents/upload" \
    -H "X-Tenant-ID: default" \
    -F "file=@${file};type=${mime_type}" \
    -F "collection=${COLLECTION}" \
    -F "data_type=compliance" \
    -F "use_case=legal_reference" \
    -F "metadata={\"regulation_id\":\"${regulation_id}\",\"state\":\"${state}\",\"category\":\"${category}\",\"authority\":\"${authority}\",\"license\":\"public_law\",\"source\":\"authority_publication\"}" \
    --connect-timeout 30 \
    -w "\n%{http_code}" 2>&1 || echo "CONNECTION_ERROR")

  local http_code
  http_code=$(echo "$response" | tail -1)

  if [[ "$http_code" == "200" || "$http_code" == "201" ]]; then
    ok "Ingestiert: $filename (HTTP $http_code)"
  else
    warn "HTTP $http_code bei $filename – RAG-Service erreichbar?"
  fi
}

# =============================================================================
# Phase 4: Alle Dateien ingestieren
# =============================================================================

ingest_all() {
  log "Starte Ingest in Corpus: $COLLECTION"
  log "RAG-URL: $RAG_URL"

  # WP248-Dokument (für alle Bundesländer relevant — kein PDF verfügbar)
  ingest_document \
    "$DOWNLOAD_DIR/dsfa_wpk248_kriterien.txt" \
    "wp248_rev01" "EU" "Article 29 Working Party / EDPB" "leitlinie"

  # BfDI — PDF bevorzugen, Text als Fallback
  local bfdi_pdf
  bfdi_pdf=$(find_pdf_for_state "bfdi")
  if [[ -n "$bfdi_pdf" ]]; then
    ingest_document "$bfdi_pdf" "muss_liste_bfdi" "Bund" "BfDI" "muss_liste"
  else
    ingest_document "$DOWNLOAD_DIR/bfdi_muss_liste.txt" "muss_liste_bfdi" "Bund" "BfDI" "muss_liste"
  fi

  # Baden-Württemberg — PDF bevorzugen, Text als Fallback
  local bw_pdf
  bw_pdf=$(find_pdf_for_state "bw")
  if [[ -n "$bw_pdf" ]]; then
    ingest_document "$bw_pdf" "muss_liste_bw" "Baden-Württemberg" "LfDI BW" "muss_liste"
  else
    ingest_document "$DOWNLOAD_DIR/bw_dsfa_anforderungen.txt" "muss_liste_bw" "Baden-Württemberg" "LfDI BW" "muss_liste"
  fi

  # Bayern — kein direktes PDF bekannt, Text
  ingest_document \
    "$DOWNLOAD_DIR/by_dsfa_anforderungen.txt" \
    "muss_liste_by" "Bayern" "LDA Bayern" "muss_liste"

  # NRW — kein direktes PDF bekannt, Text
  ingest_document \
    "$DOWNLOAD_DIR/nrw_dsfa_anforderungen.txt" \
    "muss_liste_nw" "Nordrhein-Westfalen" "LDI NRW" "muss_liste"

  # Weitere Bundesländer — PDF bevorzugen, Text als Fallback
  for state_id in be bb hb hh he mv ni rp sl sn st sh th; do
    local txt_file="$DOWNLOAD_DIR/${state_id}_dsfa_anforderungen.txt"
    if [[ ! -f "$txt_file" ]]; then
      # Generische Zusammenfassung erstellen
      cat > "$txt_file" << EOF
DSFA Anforderungen - ${STATE_NAMES[$state_id]:-$state_id}

Behörde: ${AUTHORITY_LABELS[$state_id]:-Aufsichtsbehörde $state_id}

Gemäß Art. 35 DSGVO und den Orientierungshilfen der Datenschutzkonferenz (DSK)
ist für folgende Verarbeitungsvorgänge in ${STATE_NAMES[$state_id]:-$state_id} eine
Datenschutz-Folgenabschätzung durchzuführen:

Bundesweit geltende Pflichten:
- Verarbeitung besonderer Kategorien (Art. 9 DSGVO) in großem Umfang
- Systematische Überwachung öffentlich zugänglicher Bereiche
- Automatisierte Entscheidungen mit Rechtswirkung (Art. 22 DSGVO)
- Neue Technologien mit unbekannten Risiken
- Profiling in großem Umfang

Für länderspezifische Listen besuchen Sie bitte die Website der Behörde.

Quelle: DSK-Positionspapier, WP248, Art. 35 Abs. 4 DSGVO
EOF
    fi

    # PDF bevorzugen, Text als Fallback
    local state_pdf
    state_pdf=$(find_pdf_for_state "$state_id")
    if [[ -n "$state_pdf" ]]; then
      ingest_document \
        "$state_pdf" \
        "muss_liste_${state_id}" \
        "${STATE_NAMES[$state_id]:-$state_id}" \
        "${AUTHORITY_LABELS[$state_id]:-Datenschutzbehörde $state_id}" \
        "muss_liste"
    else
      ingest_document \
        "$txt_file" \
        "muss_liste_${state_id}" \
        "${STATE_NAMES[$state_id]:-$state_id}" \
        "${AUTHORITY_LABELS[$state_id]:-Datenschutzbehörde $state_id}" \
        "muss_liste"
    fi
  done

  log "Ingest abgeschlossen"
}

# =============================================================================
# Phase 5: Verifikation
# =============================================================================

verify_corpus() {
  log "Verifiziere Corpus $COLLECTION..."

  local response
  response=$(curl -sk -X POST "${RAG_URL}/api/v1/search" \
    -H "Content-Type: application/json" \
    -H "X-Tenant-ID: default" \
    -d "{\"query\":\"DSFA Muss-Liste Bundesland\",\"collection\":\"${COLLECTION}\",\"limit\":3}" \
    --connect-timeout 15 2>&1 || echo "CONNECTION_ERROR")

  if echo "$response" | grep -q "results"; then
    local count
    count=$(echo "$response" | grep -o '"total_results":[0-9]*' | grep -o '[0-9]*' || echo "?")
    ok "Corpus $COLLECTION erreichbar – $count Ergebnisse für Testsuche"
  else
    warn "Konnte Corpus nicht verifizieren. Response: ${response:0:200}"
  fi
}

# =============================================================================
# Main
# =============================================================================

main() {
  log "=== DSFA Bundesland RAG-Ingest ==="
  log "Collection: $COLLECTION"
  log "Download-Dir: $DOWNLOAD_DIR"
  log "Skip-Download: $SKIP_DOWNLOAD"

  # Schritt 1: Text-Zusammenfassungen erstellen (immer als Fallback)
  create_text_summaries

  # Schritt 2: PDFs herunterladen (wenn nicht --skip-download oder --only-text)
  if [[ "$SKIP_DOWNLOAD" == false && "$ONLY_TEXT" == false ]]; then
    download_pdfs
  else
    log "PDF-Downloads übersprungen (--skip-download oder --only-text gesetzt)"
  fi

  # Schritt 3: Ingest (PDF bevorzugt, Text als Fallback)
  ingest_all

  # Schritt 4: Verifikation
  verify_corpus

  log "=== Fertig ==="
  log "Corpus: $COLLECTION"
  log "Um zu suchen: curl -sk -X POST '${RAG_URL}/api/v1/search' -H 'Content-Type: application/json' -d '{\"query\":\"DSFA\",\"collection\":\"${COLLECTION}\",\"limit\":5}'"
}

main "$@"
