import { defineStore } from "pinia";
import {computed, reactive, ref, watch} from "vue";
import { useSpaceStore } from "@/stores/spaceStore";

export interface ToolbarButton {
    id?: string;
    text?: string;
    icon?: string;
    to?: string;
    onClickId?: string;
    disabled?: boolean;
    class?: string;
    title?: string;
}

export type ToolbarConfig =
    | ToolbarButton[]
    | ((ctx: { spaceStore: ReturnType<typeof useSpaceStore> }) => ToolbarButton[]);
export const useToolbarStore = defineStore("toolbar", () => {
    const spaceStore = useSpaceStore();

    // === храним КОНФИГ, а не готовый массив
    const _config = ref<ToolbarConfig | undefined>(undefined);

    const setByConfig = (config?: ToolbarConfig) => {
        _config.value = config;
    };
    const clear = () => void (_config.value = undefined);

    // дефолты — уже реактивны
    const defaults = computed<ToolbarButton[]>(() => [
        {
            id: "space",
            text: spaceStore.selectedSpaceName ?? "Select Space",
            icon: "",
            onClickId: "openSpacePicker",
        },
    ]);

    // текущие — вычисляем МГНОВЕННО из функции-конфига
    const current = computed<ToolbarButton[]>(() => {
        const extra =
            typeof _config.value === "function"
                ? _config.value({ spaceStore }) // выполняется на каждый рендер
                : _config.value ?? [];

        // требуйте у всех кнопок стабильный id; ИНАЧЕ НЕ ИСПОЛЬЗУЙТЕ randomUUID в ключах!
        const map = new Map<string, ToolbarButton>();
        for (const b of defaults.value) map.set(b.id ?? b.text ?? "", b);
        for (const b of extra) map.set(b.id ?? b.text ?? "", b);
        return Array.from(map.values());
    });

    // обработчики
    const handlers: Record<string, () => void> = reactive({});
    const registerHandler = (key: string, fn: () => void) => (handlers[key] = fn);
    const unregisterHandler = (key: string) => delete handlers[key];
    const invoke = (key?: string) => {
        if (!key) return;
        const fn = handlers[key];
        if (typeof fn === "function") fn();
    };

    return {
        current,
        setByConfig,
        clear,
        registerHandler,
        unregisterHandler,
        invoke,
    };
});