import { SvelteMap } from "svelte/reactivity";
import type { FileKey } from "../../../types";
import type UiStateManager from "../../../uiStateManager";
import { TocToolbarState } from "./TocToolbarState.svelte";

type SharedToolbarStateEntry = { refs: number; state: TocToolbarState; };

const toolbarStateByPath = new SvelteMap<string, SharedToolbarStateEntry>();

export function acquireTocToolbarState(sourcePath: FileKey, settingsManager: UiStateManager): TocToolbarState {
    const existing = toolbarStateByPath.get(sourcePath);

    if (existing) {
        existing.refs += 1;
        return existing.state;
    }

    const state = new TocToolbarState((key, collapsed) => {
        settingsManager.setTocFoldState(key, collapsed);
    }, (collapsed) => {
        settingsManager.setTocBlockCollapsed(sourcePath, collapsed);
    });

    toolbarStateByPath.set(sourcePath, { refs: 1, state });

    return state;
}

export function releaseTocToolbarState(sourcePath: string): void {
    const existing = toolbarStateByPath.get(sourcePath);

    if (!existing) return;

    if (existing.refs <= 1) {
        toolbarStateByPath.delete(sourcePath);
        return;
    }

    existing.refs -= 1;
}

export function clearTocToolbarStates(): void {
    toolbarStateByPath.clear();
}
