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

test("step 0-2 knowledge is mortgage playbook only", () => {
  const s = knowledgeStoresForStep(2);
  assert.deepEqual(s, ["data/knowledge/mortgage/embeddings.json"]);
  assert.ok(!s.some((p) => p.includes("verticals")));
});

test("step 0-2 verticals are mortgage dataset/process only", () => {
  const s = verticalStoresForStep(2);
  assert.deepEqual(s, ["data/verticals/mortgage/embeddings.json"]);
});

test("step 3 knowledge is bmi playbook", () => {
  assert.ok(knowledgeStoresForStep(3)[0].includes("knowledge/bmi"));
});

test("step 4 knowledge is health playbook", () => {
  assert.ok(knowledgeStoresForStep(4)[0].includes("knowledge/health"));
});

test("knowledge retrieve prefers knowledge_base talk tracks not HTML", () => {
  const hits = retrieveKnowledge("opening mortgage protection conversation name and state", 0, 6);
  assert.ok(hits.length > 0);
  assert.ok(hits.every((h) => !h.source_path.includes(".html")));
  assert.ok(hits.some((h) => /communication|faq|objection/i.test(h.source_path)));
});

test("vertical retrieve uses process/dataset HTML for fields", () => {
  const hits = retrieveVertical("loan_balance coverage_on_whom ApplicantProfile", 2, 4);
  assert.ok(hits.length > 0);
  assert.ok(hits.some((h) => h.source_path.includes("html") || h.source_path.includes("dataset")));
});

test("dual-lane RAG does not mix ranked lists", () => {
  const rag = retrieveRag("Hi I am Sunil, Texas", 0, ["name_or_phone", "state"]);
  assert.ok(rag.knowledge.length > 0);
  assert.ok(rag.verticals.length > 0);
  assert.ok(rag.knowledge.every((h) => h.lane === "knowledge"));
  assert.ok(rag.verticals.every((h) => h.lane === "vertical"));
});
