import { describe, expect, it } from 'vitest';
import { getColumnTypeRegistry } from '@ablogcms/plugins/core';
import type { ColumnTypeDef } from '@ablogcms/components/dataview/types';
import { MODULE_COLUMN_TYPES } from '../constants';
import { getModuleColumnTypes } from './index';

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

  it('レジストリに登録したカラム型がマージ結果に含まれる', () => {
    const customColumnType: ColumnTypeDef = { getValue: () => 'custom' };
    const unsubscribe = getColumnTypeRegistry().add('custom-column', customColumnType);

    expect(getModuleColumnTypes()).toEqual({
      ...MODULE_COLUMN_TYPES,
      'custom-column': customColumnType,
    });

    unsubscribe();
  });

  it('登録解除後はマージ結果から除外される', () => {
    const customColumnType: ColumnTypeDef = { getValue: () => 'custom' };
    const unsubscribe = getColumnTypeRegistry().add('custom-column', customColumnType);
    unsubscribe();

    expect(getModuleColumnTypes()).toEqual(MODULE_COLUMN_TYPES);
  });

  it('キーが衝突した場合はレジストリ（プラグイン）側を優先する', () => {
    const overrideColumnType: ColumnTypeDef = { getValue: () => 'override' };
    const unsubscribe = getColumnTypeRegistry().add('media', overrideColumnType);

    expect(getModuleColumnTypes().media).toBe(overrideColumnType);

    unsubscribe();
  });
});
