import assert from "node:assert/strict";
import { describe, test } from "node:test";
import {
  DEFAULT_MEMORY_SETTINGS,
  normalizeMemorySettings,
  toMemoryRetrievalConfig,
  toMemorySettingsUpdates,
} from "../../src/lib/memory/settings.ts";

describe("memory settings helpers", () => {
  test("normalizeMemorySettings applies defaults and clamps persisted values", () => {
    const settings = normalizeMemorySettings({
      memoryEnabled: "yes",
      memoryMaxTokens: 20001,
      memoryRetentionDays: 0,
      memoryStrategy: "unsupported",
      skillsEnabled: true,
    });

    assert.deepEqual(settings, {
      enabled: DEFAULT_MEMORY_SETTINGS.enabled,
      maxTokens: 16000,
      retentionDays: 1,
      strategy: DEFAULT_MEMORY_SETTINGS.strategy,
      skillsEnabled: true,
      // Plan 21 — Memory Engine Redesign extended fields (default values)
      embeddingSource: DEFAULT_MEMORY_SETTINGS.embeddingSource,
      embeddingProviderModel: DEFAULT_MEMORY_SETTINGS.embeddingProviderModel,
      transformersEnabled: DEFAULT_MEMORY_SETTINGS.transformersEnabled,
      staticEnabled: DEFAULT_MEMORY_SETTINGS.staticEnabled,
      rerankEnabled: DEFAULT_MEMORY_SETTINGS.rerankEnabled,
      rerankProviderModel: DEFAULT_MEMORY_SETTINGS.rerankProviderModel,
      vectorStore: DEFAULT_MEMORY_SETTINGS.vectorStore,
    });
  });

  test("toMemorySettingsUpdates maps UI fields to persisted keys", () => {
    assert.deepEqual(
      toMemorySettingsUpdates({
        enabled: false,
        maxTokens: 4096,
        retentionDays: 21,
        strategy: "hybrid",
        skillsEnabled: true,
      }),
      {
        memoryEnabled: false,
        memoryMaxTokens: 4096,
        memoryRetentionDays: 21,
        memoryStrategy: "hybrid",
        skillsEnabled: true,
      }
    );
  });

  test("toMemoryRetrievalConfig disables injection when memory is off and remaps recent strategy", () => {
    assert.deepEqual(
      toMemoryRetrievalConfig({
        enabled: true,
        maxTokens: 0,
        retentionDays: 10,
        strategy: "recent",
        skillsEnabled: false,
      }),
      {
        enabled: false,
        maxTokens: 0,
        retrievalStrategy: "exact",
        autoSummarize: false,
        persistAcrossModels: false,
        retentionDays: 10,
        scope: "apiKey",
      }
    );
  });
});
