import { describe, expect, test, vi } from "vitest";
import { TocToolbarState } from "../src/svelte/components/codeblock/TocToolbarState.svelte.ts";
import type { TocBlockItem } from "../src/types";

describe("TocToolbarState", () => {
    test("syncFoldsFromItems preserves existing fold state without persisting and prunes removed keys", () => {
        // Arrange
        const persistedFoldStateSpy = vi.fn();
        const persistTocCollapsedSpy = vi.fn();
        const toolbarState = new TocToolbarState(persistedFoldStateSpy, persistTocCollapsedSpy);
        const items: TocBlockItem[] = [ {
            key: "note.md:0",
            text: "Parent",
            href: "note#parent",
            children: [ {
                key: "note.md:1",
                text: "Child",
                href: "note#child",
                children: [],
                foldKey: null,
                initialCollapsed: false
            } ],
            foldKey: "note.md::1",
            initialCollapsed: false
        }, {
            key: "note.md:2",
            text: "Second parent",
            href: "note#second-parent",
            children: [ {
                key: "note.md:3",
                text: "Nested child",
                href: "note#nested-child",
                children: [],
                foldKey: null,
                initialCollapsed: false
            } ],
            foldKey: "note.md::2",
            initialCollapsed: false
        } ];

        toolbarState.setCollapsed("note.md::1", true);
        persistedFoldStateSpy.mockClear();

        // Act
        toolbarState.syncFoldsFromItems(items);
        toolbarState.syncFoldsFromItems([ items[1] ]);

        // Assert
        expect(toolbarState.foldsByKey.has("note.md::1")).toBe(false);
        expect(toolbarState.foldsByKey.has("note.md::2")).toBe(true);
        expect(toolbarState.isCollapsed("note.md::2")).toBe(false);
        expect(persistedFoldStateSpy).not.toHaveBeenCalled();
        expect(persistTocCollapsedSpy).not.toHaveBeenCalled();
    });
});
