import assert from "node:assert/strict";
import test from "node:test";
import {
  knowledgeStoresForStep,
  loadStore,
  storesForStep,
  verticalStoresForStep,
} from "@/lib/rag/stores";
import { retrieve, retrieveKnowledge, retrieveRag, retrieveVertical } from "@/lib/rag/retrieve";

test("storesForStep concatenates knowledge and verticals", () => {
  const mixed = storesForStep(0);
  assert.ok(mixed.includes("data/knowledge/mortgage/embeddings.json"));
  assert.ok(mixed.includes("data/verticals/mortgage/embeddings.json"));
});

test("step 3 and 4/6 store routing", () => {
  assert.ok(knowledgeStoresForStep(3)[0].includes("bmi"));
  assert.ok(verticalStoresForStep(3).some((p) => p.includes("bmi")));
  assert.ok(knowledgeStoresForStep(4)[0].includes("health"));
  assert.ok(verticalStoresForStep(4).some((p) => p.includes("health")));
  assert.ok(verticalStoresForStep(6).some((p) => p.includes("health")));
});

test("loadStore caches JSON", () => {
  const a = loadStore("data/knowledge/mortgage/embeddings.json");
  const b = loadStore("data/knowledge/mortgage/embeddings.json");
  assert.equal(a, b);
  assert.ok(a.items?.length);
});

test("retrieveKnowledge skips empty vectors and dedupes", () => {
  const hits = retrieveKnowledge("mortgage protection opening conversation", 0, 3);
  assert.ok(hits.length <= 3);
  assert.equal(new Set(hits.map((h) => h.id)).size, hits.length);
});

test("retrieveVertical and retrieveRag lanes", () => {
  const v = retrieveVertical("loan_balance", 2, 2);
  assert.ok(v.every((h) => h.lane === "vertical"));
  const rag = retrieveRag("hello", 0, []);
  assert.ok(rag.knowledge.length);
  assert.ok(rag.verticals.length);
});

test("retrieve alias is knowledge lane", () => {
  const hits = retrieve("faq mortgage protection", 1, 4);
  assert.ok(hits.every((h) => h.lane === "knowledge"));
});
