import { describe, expect, it } from 'vitest';
import { getUnitDefinitionRegistry } from '@ablogcms/plugins/core';
import type { UnitDefInterface } from '@ablogcms/unit-editor/core/types/unit';
import RichEditorUnitDef from '@features/rich-editor/unit-def';
import { getUnitDefinitions } from './unit-definitions';
import CustomUnitDef from './unit-defs/custom';

const CORE_UNIT_DEFS = { 'rich-editor': RichEditorUnitDef, custom: CustomUnitDef };

// 拡張基盤フェーズD: レジストリ統合配線の特徴付けテスト。
// unit-editor / inplace-editor / config-editor の unitDefs prop に渡す値の組み立てを検証する
// （design.md「レジストリ（機能登録）」節）。プラグインが無い（レジストリが空の）状態でも
// react-19-migration フェーズ3-1a のコア注入（rich-editor / custom）が従来どおり機能することを保証する。
describe('getUnitDefinitions', () => {
  it('レジストリが空ならコア組み込みの rich-editor / custom 定義のみを返す（回帰なし）', () => {
    expect(getUnitDefinitions()).toEqual(CORE_UNIT_DEFS);
  });

  it('レジストリに登録したユニット定義がマージ結果に含まれる', () => {
    const customUnitDef: UnitDefInterface = { type: 'custom-unit', name: 'カスタムユニット', edit: () => null };
    const unsubscribe = getUnitDefinitionRegistry().add('custom-unit', customUnitDef);

    expect(getUnitDefinitions()).toEqual({
      ...CORE_UNIT_DEFS,
      'custom-unit': customUnitDef,
    });

    unsubscribe();
  });

  it('登録解除後はマージ結果から除外される', () => {
    const customUnitDef: UnitDefInterface = { type: 'custom-unit', name: 'カスタムユニット', edit: () => null };
    const unsubscribe = getUnitDefinitionRegistry().add('custom-unit', customUnitDef);
    unsubscribe();

    expect(getUnitDefinitions()).toEqual(CORE_UNIT_DEFS);
  });

  it('レジストリ側で "rich-editor" という名前を登録すると、コア定義より優先される', () => {
    const overrideUnitDef: UnitDefInterface = { type: 'rich-editor', name: '上書き', edit: () => null };
    const unsubscribe = getUnitDefinitionRegistry().add('rich-editor', overrideUnitDef);

    expect(getUnitDefinitions()['rich-editor']).toBe(overrideUnitDef);

    unsubscribe();
  });
});
