import { describe, it, expect, beforeEach, vi } from 'vitest';
import { screen } from '@testing-library/react';
import { renderWithProviders } from '../test/utils';
import PracticeDomainSettingsPage from './PracticeDomainSettingsPage';
import { useAuthStore } from '../stores/authStore';
import { api } from '../lib/api';

const DOMAINS = [
  { uuid: 'd-1', name: 'دندانپزشکی', has_workflow: true },
  { uuid: 'd-2', name: 'کلینیک زیبایی', has_workflow: false },
];

beforeEach(() => {
  useAuthStore.setState({
    primaryRole: 'clinic',
    context: { scope: 'clinic', db_uuid: 'clinic-1' } as never,
  });

  vi.spyOn(api, 'get').mockImplementation(async (path: string) => {
    if (path.startsWith('/api/v1/practice-domains')) return { data: DOMAINS } as never;
    return { data: { data: { practice_domain: DOMAINS[1] } } } as never;
  });
});

describe('PracticeDomainSettingsPage', () => {
  /**
   * این صفحه تنها عضو منوی تنظیمات بود که پوستهٔ تنظیمات را نداشت: کاربر برای رفتن
   * به بخش بعدی مجبور بود «بازگشت» بزند.
   */
  it('داخل پوستهٔ تنظیمات رندر می‌شود و منوی تنظیمات را نشان می‌دهد', async () => {
    renderWithProviders(<PracticeDomainSettingsPage />);

    expect(await screen.findByLabelText('منوی تنظیمات')).toBeInTheDocument();
  });

  it('همین آیتم در منو فعال است', async () => {
    renderWithProviders(<PracticeDomainSettingsPage />);

    // عنوان صفحه هم همین متن را دارد، پس آیتم منو با نقش link گرفته می‌شود.
    const active = await screen.findByRole('link', { name: 'حوزهٔ فعالیت' });

    expect(active).toHaveAttribute('aria-current', 'page');
    expect(active).toHaveAttribute('href', '/admin/settings/practice-domain');
  });

  it('عنوان صفحه یک بار می‌آید، نه هم در هدر هم در کارت', async () => {
    renderWithProviders(<PracticeDomainSettingsPage />);

    expect(await screen.findByRole('heading', { name: 'حوزهٔ فعالیت' })).toBeInTheDocument();
    expect(screen.getAllByRole('heading', { name: 'حوزهٔ فعالیت' })).toHaveLength(1);
  });

  it('حوزهٔ بدون فرآیند، هشدارش را نشان می‌دهد', async () => {
    renderWithProviders(<PracticeDomainSettingsPage />);

    expect(
      await screen.findByText(/برای این حوزه هنوز فرآیند اختصاصی تعریف نشده است/),
    ).toBeInTheDocument();
  });
});
