import { describe, it, expect, vi, beforeEach } from 'vitest';
import { render, screen } from '@testing-library/react';
import { MemoryRouter } from 'react-router';
import type { Column } from '@ablogcms/components/dataview/types';
import EntryFilter from './index';
import type { EntryType } from '../../types';

// CategorySelect/BlogSelect/UserSelect は SWR 経由の取得を持つため、Button 置き換え確認に
// 不要な非同期処理を避けるためスタブ化する
vi.mock('../../../category/components/category-select/category-select', () => ({
  default: () => <div data-testid="category-select-stub" />,
}));
vi.mock('../../../blog/components/blog-select/blog-select', () => ({
  default: () => <div data-testid="blog-select-stub" />,
}));
vi.mock('../../../user/components/user-select/user-select', () => ({
  default: () => <div data-testid="user-select-stub" />,
}));

describe('EntryFilter', () => {
  beforeEach(() => {
    // useLocalStorage のキー生成が ACMS.Config を参照するため、ACMS モックに補う
    (window as unknown as { ACMS: { Config: Record<string, unknown> } }).ACMS.Config = {
      root: 'root',
      suid: 1,
      bid: 1,
    };
  });

  it('検索ボタンが unstyled な Button 由来で acms-admin-btn-admin 系クラスと type=submit を維持する', () => {
    render(
      <MemoryRouter>
        <EntryFilter columns={[] as Column<EntryType>[]} />
      </MemoryRouter>
    );

    const searchButton = screen.getByRole('button', { name: 'entry_index.filter.submit' });
    // acms-admin-btn-admin 系は Button の variant 合成モデルとは独立したクラス体系のため、
    // unstyled + className でそのまま再現している（button.tsx のコメント参照）
    expect(searchButton).toHaveClass(
      'acms-admin-btn-admin',
      'acms-admin-btn-admin-info',
      'acms-admin-btn-admin-search'
    );
    expect(searchButton).toHaveAttribute('type', 'submit');
    expect(searchButton).toHaveAttribute('name', 'intent');
    expect(searchButton).toHaveAttribute('value', 'search');
  });

  it('クリアボタンが unstyled な Button 由来で acms-admin-btn-admin クラスと type=submit を維持する', () => {
    render(
      <MemoryRouter>
        <EntryFilter columns={[] as Column<EntryType>[]} />
      </MemoryRouter>
    );

    const clearButton = screen.getByRole('button', { name: 'entry_index.filter.clear' });
    expect(clearButton).toHaveClass('acms-admin-btn-admin');
    expect(clearButton).toHaveAttribute('type', 'submit');
    expect(clearButton).toHaveAttribute('name', 'intent');
    expect(clearButton).toHaveAttribute('value', 'clear');
  });
});
