import type { ReactNode } from 'react';
import { SettingsProvider } from '@ablogcms/block-editor/editor-settings';
import type { BlockDefinition } from '@ablogcms/block-editor/types';
import useBlockEditorSettingsSWR from '../hooks/use-block-editor-settings-swr';

/**
 * ブロックエディターの設定 (EditorSettings) を取得し、`@ablogcms/block-editor` の Context 経由で
 * 子孫コンポーネントへ流し込む。
 *
 * `@ablogcms/unit-editor` はユニット種別ごとに任意の深さへ動的にコンポーネントを差し込む
 * プラグイン的な構造（unitDefs レジストリ）を持ち、`block-editor` ユニット定義
 * （`@ablogcms/unit-editor` の `core/unit-defs/block-editor/`）は unit-editor 自体が
 * データ取得を持ち込まないよう、この Context を経由して EditorSettings を受け取る
 * （`useSettingsContext()` で読み出し、`<BlockEditor editorSettings={...}>` にそのまま渡す）。
 * fetch はこの Provider（コア側）が一度だけ行い、SWR の共有キャッシュにより同一ページ内の
 * 複数マウント（unit-editor 本体 / config-editor / inplace-editor）でも二重取得は起きない。
 *
 * `blockDefinitions`（プラグイン提供の追加マスター）を受け取り `useBlockEditorSettingsSWR` へ
 * そのまま渡す。呼び出し元（`mount-unit-*.tsx`）は `BlockEditorExtensionsProvider` が解決した値を
 * ここへ流し込むこと。渡し忘れると `normalizeSettings` がコアの `BLOCK_DEFINITIONS` のみで
 * マスターを解決し、プラグイン提供の type がメニューから除外されたままになる。
 */
function BlockEditorSettingsProvider({
  children,
  blockDefinitions,
}: {
  children: ReactNode;
  blockDefinitions?: Record<string, BlockDefinition>;
}) {
  const settings = useBlockEditorSettingsSWR(blockDefinitions);
  return <SettingsProvider settings={settings}>{children}</SettingsProvider>;
}

export default BlockEditorSettingsProvider;
