"use client";

import { create } from "zustand";
import type { ReferenceTarget } from "@/types/search";
import type { Json } from "@/types/supabase";
import type { MediaAsset } from "@/types/media";

export interface EditorReferenceBridgeResult {
  blockId: string | null;
}

export interface EditorReferenceBridge {
  insertInlineReference: (target: ReferenceTarget, alias?: string) => EditorReferenceBridgeResult;
  insertEmbedReference: (target: ReferenceTarget) => EditorReferenceBridgeResult;
  undo?: () => void;
  redo?: () => void;
  getCursorBlockId?: () => string | null;
  /**
   * 向当前打开的文档插入一个“附件/媒体”块。
   * 主要用于侧边栏文件树拖拽上传后，把文件显示到主编辑区。
   */
  insertMediaAsset?: (asset: MediaAsset) => void;
  /**
   * 向当前打开的文档插入一个“思维导图”块（使用 mindmapId 作为 block.id）。
   * 主要用于侧边栏垃圾桶“恢复思维导图”后，把导图重新显示到主编辑区。
   */
  insertMindmapAsset?: (args: { documentId: string; mindmapId: string }) => void;
  /**
   * 向当前打开的文档插入一个“在线表格（luckysheet）”块。
   * 主要用于侧边栏垃圾桶“恢复表格”后，把表格重新显示到主编辑区。
   */
  insertOnlineTableAsset?: (args: { documentId: string; tableId: string }) => void;
  replaceWithSnapshot: (blocks: Json) => void;
  openTableFullScreen?: (tableId: string) => void;
  requestFallbackToBlockNote?: () => void;
}

interface EditorBridgeState {
  bridge: EditorReferenceBridge | null;
  registerBridge: (bridge: EditorReferenceBridge | null) => void;
}

export const useEditorBridgeStore = create<EditorBridgeState>((set) => ({
  bridge: null,
  registerBridge: (bridge) =>
    set((state) => {
      if (state.bridge === bridge) {
        return state;
      }
      return { bridge };
    }),
}));
