/**
 * Compliance-Advisor RAG-Suche.
 *
 * Fragt den Authority Router der ai-compliance-sdk (`/sdk/v1/rag/retrieve`) mit NUR der
 * Query ab — der Router waehlt selbst die Collections (Broad-Authority-Base + KB-2026.1-Slice
 * bei in-scope), embeddet mit bge-m3 (prod: ollama-embed), merged + authority-ranked. Der
 * Advisor bleibt damit collection-agnostisch (Vertrag: Compiler -> Collections -> Retriever
 * -> Advisor); die fruehere Multi-Collection-Logik liegt jetzt im Retriever.
 *
 * Fehler werden geschluckt (graceful: Antwort ohne RAG-Kontext).
 * Fundstellen via article_label sind live ab dem Prod-Re-Ingest 2026-06.
 */

const SDK_URL =
  process.env.SDK_API_URL || process.env.SDK_URL || 'http://ai-compliance-sdk:8090'

const DEFAULT_USER = '00000000-0000-0000-0000-000000000001'
const DEFAULT_TENANT =
  process.env.DEFAULT_TENANT_ID || '9282a473-5c95-4b3a-bf78-0ecc0ec71d3e'

interface SdkRagResult {
  text?: string
  regulation_code?: string
  regulation_name?: string
  regulation_short?: string
  article_label?: string
  article?: string
  paragraph?: string
  sub?: string
  citation_style?: string
  is_recital?: boolean
  category?: string
  source_url?: string
  score?: number
}

interface ScoredPassage {
  content: string
  source: string
  score: number
}

/** Normalisiert eine ai-sdk-RAG-Antwort auf {content, source, score}. */
export function mapSdkResults(results: SdkRagResult[] | undefined): ScoredPassage[] {
  return (results || [])
    .map((r) => ({
      content: r.text || '',
      // Fundstelle: article_label ist die fertig formatierte, druckbare Quelle aus der
      // Ingestion ("BDSG § 38 Abs. 1"); Fallback baut sie aus den strukturierten Feldern
      // (bzw. alt-ingestierte Chunks ohne Legal-Metadaten). Siehe rag_reingest_spec.md §2/§7.
      source:
        (r.article_label && r.article_label.trim()) ||
        [r.regulation_short || r.regulation_name || r.regulation_code, r.article, r.paragraph, r.sub]
          .filter(Boolean)
          .join(' ') ||
        'Unbekannt',
      score: typeof r.score === 'number' ? r.score : 0,
    }))
    .filter((p) => p.content)
}

/**
 * Authority Router: EIN collection-agnostischer Aufruf an die ai-sdk (`/sdk/v1/rag/retrieve`).
 * Der Router waehlt die Collections (Broad-Authority-Base + KB-2026.1-Slice bei in-scope),
 * merged + authority-ranked sie und liefert die Top-Passagen. Der Advisor weiss damit nichts
 * mehr ueber einzelne Collections — die fruehere Multi-Collection-Logik liegt jetzt im Retriever.
 * Fehler werden geschluckt (graceful: Antwort ohne RAG-Kontext).
 */
export async function queryAdvisorRAG(query: string): Promise<string> {
  let passages: ScoredPassage[] = []
  try {
    const res = await fetch(`${SDK_URL}/sdk/v1/rag/retrieve`, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'X-User-ID': DEFAULT_USER,
        'X-Tenant-ID': DEFAULT_TENANT,
      },
      body: JSON.stringify({ query, top_k: 8 }),
      signal: AbortSignal.timeout(15000),
    })
    if (res.ok) {
      const data = await res.json()
      passages = mapSdkResults(data.results)
    }
  } catch {
    // graceful: keine Verbindung -> Antwort ohne RAG-Kontext
  }
  // Der Router liefert bereits authority-geordnete Top-K; Reihenfolge bewahren.
  if (passages.length === 0) return ''
  return passages
    .map((r, i) => `[Quelle ${i + 1}: ${r.source}]\n${r.content}`)
    .join('\n\n---\n\n')
}
