import { useMemo } from 'react';
import useSWRImmutable from 'swr/immutable';
import { normalizeSettings } from '@ablogcms/block-editor/normalize-settings';
import type { BlockDefinition, EditorSettings } from '@ablogcms/block-editor/types';
import { fetchBlockEditorSettings } from '../api';

/**
 * ブロックエディター設定の SWR キャッシュキー。ブログ・カテゴリー単位でキャッシュを分ける
 * （旧 `@ablogcms/block-editor` の `settingCacheKey` から移設。値の形はそのまま維持する）。
 */
export function getBlockEditorSettingsCacheKey(): string {
  return `block-editor-settings:${ACMS.Config.bid}:${ACMS.Config.cid}`;
}

/**
 * ブロックエディターの設定を取得し、EditorSettings に正規化して返す。
 *
 * `@ablogcms/block-editor` パッケージ自体はデータを取得しない方針のため、fetch はここ（コア側）が担う。
 * 取得前・取得中も `normalizeSettings(undefined)` の既定値を返すため、呼び出し側は常に完全な
 * EditorSettings を受け取れる（読み込み中の undefined 分岐が不要）。
 *
 * `blockDefinitions`（プラグインが `registerBlockDefinition` で登録した追加マスター）を渡すと、
 * `normalizeSettings` の第2引数としてそのまま合成される。呼び出し元は、この引数を
 * 渡せる場所（ブロックエディターのチャンク内、Tiptap ランタイムが解決済みの時点）でこのフックを
 * 呼ぶこと。渡さなければ従来どおりコアの `BLOCK_DEFINITIONS` のみでマスターが解決される。
 */
export default function useBlockEditorSettingsSWR(blockDefinitions?: Record<string, BlockDefinition>): EditorSettings {
  const { data } = useSWRImmutable<Parameters<typeof normalizeSettings>[0]>(
    getBlockEditorSettingsCacheKey(),
    fetchBlockEditorSettings
  );

  return useMemo<EditorSettings>(() => normalizeSettings(data, blockDefinitions), [data, blockDefinitions]);
}
