import { LocalKnowledgeService } from "../packages/knowledge/dist/index.js";
import { createMetadataStore } from "../packages/metadata/dist/index.js";
import { rmSync } from "node:fs";
import { createVerifiedTestIdentity } from "./lib/metadata-test-identity.mjs";

const databasePath = `storage/metadata/memory-recall-shadow-${Date.now()}.sqlite`;

const sessionId = "memory-recall-shadow-session";
const runId = "memory-recall-shadow-run";
const datasourceId = "api-duckdb-demo";
const collectionId = "memory-shadow-kb";
const query = "GMV refund rate orders";
const store = createMetadataStore({ database_path: databasePath });
const __testIdentity = createVerifiedTestIdentity(store);
const userId = __testIdentity.userId;
const workspaceId = __testIdentity.workspaceId;

const knowledge = new LocalKnowledgeService(store);

try {
  store.sessions.create({
    user_id: userId,
    id: sessionId,
    title: "memory recall shadow",
    selected_datasource_id: datasourceId
  });
  store.runs.create({
    user_id: userId,
    id: runId,
    session_id: sessionId,
    request_fingerprint: "memory-recall-shadow",
    user_input: query,
    status: "running",
    datasource_id: datasourceId
  });
  store.longTermMemories.upsert({
    id: "shadow-memory-user",
    user_id: userId,
    scope: "user",
    kind: "user_preference",
    content_text: "用户分析 GMV 时希望默认同时关注 refund rate。",
    confidence: 0.9,
    source_run_id: runId
  });
  store.longTermMemories.upsert({
    id: "shadow-memory-datasource",
    user_id: userId,
    scope: "datasource",
    datasource_id: datasourceId,
    kind: "analysis_finding",
    content_text: "orders 表适合按 category 汇总 GMV 并补充退款率分析。",
    confidence: 0.8,
    source_run_id: runId
  });
  await knowledge.ingestText({
    user_id: userId,
    collection_id: collectionId,
    filename: "orders-analysis-notes.md",
    content: [
      "orders 表包含订单金额、类目和退款相关字段。",
      "分析 GMV 时可以同时计算 refund rate。",
      "这些知识库内容来自用户上传资料,不等同于长期对话记忆。"
    ].join("\n")
  });

  const memoryHits = store.longTermMemories.listRelevant({
    user_id: userId,
    session_id: sessionId,
    datasource_id: datasourceId,
    query,
    limit: 5
  });
  const knowledgeHits = await knowledge.retrieve({
    user_id: userId,
    collection_id: collectionId,
    query,
    top_k: 5
  });
  const report = {
    query,
    localLongTermMemory: {
      count: memoryHits.length,
      ids: memoryHits.map((memory) => memory.id)
    },
    knowledge: {
      count: knowledgeHits.length,
      chunkIds: knowledgeHits.map((chunk) => chunk.chunk_id)
    },
    mastraSemanticRecall: {
      reason: "Vector store and embedder are not enabled for production memory recall.",
      status: "not_configured"
    }
  };

  if (report.localLongTermMemory.count < 2) {
    throw new Error("Expected local long-term memory hits in shadow report");
  }
  if (report.knowledge.count < 1) {
    throw new Error("Expected Knowledge hits in shadow report");
  }

  console.log(
    `Memory recall shadow smoke OK: ltm=${report.localLongTermMemory.count}, knowledge=${report.knowledge.count}, ` +
      `mastra=${report.mastraSemanticRecall.status}`
  );
} finally {
  store.close();
  rmSync(databasePath, { force: true });
}