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

const BOOKABLE_LABEL = 'نمایش در نوبت‌دهی آنلاین';

beforeEach(() => {
  vi.spyOn(api, 'get').mockImplementation(async (path: string) => {
    if (path.startsWith('/api/v1/staff')) return { data: [] } as never;
    if (path.startsWith('/api/v1/inventory-packages')) return { data: [] } as never;
    if (path.startsWith('/api/v1/inventory-items')) return { data: { items: [] } } as never;
    return { data: [] } as never;
  });
});

const renderModal = () =>
  renderWithProviders(
    <ServiceItemFormModal item="create" sectionUuid="section-1" onClose={() => {}} />,
  );

describe('ServiceItemFormModal', () => {
  it('سوییچ رزرو آنلاین برچسب صریح دارد', () => {
    renderModal();

    expect(screen.getByRole('switch', { name: BOOKABLE_LABEL })).toBeInTheDocument();
    // برچسب قدیمی مبهم بود: معلوم نبود «نوبت‌دهی» یعنی تقویم داخلی یا رزرو بیمار.
    expect(screen.queryByRole('switch', { name: 'نمایش در نوبت‌دهی' })).not.toBeInTheDocument();
  });

  it('متن راهنما می‌گوید فعال بودنش یعنی چه', () => {
    renderModal();

    expect(
      screen.getByText(/بیمار می‌تواند این سرویس را به‌صورت آنلاین رزرو کند/),
    ).toBeInTheDocument();
  });

  it('راهنما نامِ دسترسی‌پذیرِ سوییچ را آلوده نمی‌کند', () => {
    renderModal();

    // نام باید همان برچسب کوتاه بماند، نه برچسب + یک جملهٔ کامل.
    expect(screen.getByRole('switch').getAttribute('aria-label')).toBe(BOOKABLE_LABEL);
  });

  it('قیمت و زمان متوسط یک ردیف‌اند و پرسنل تمام‌عرض', () => {
    renderModal();

    // مودال در portal رندر می‌شود، پس جستجو از document است نه container.
    const grids = Array.from(document.querySelectorAll('div'))
      .filter((el) => (el as HTMLElement).style.gridTemplateColumns === '1fr 1fr');

    // تنها ردیفِ دوستونی همان جفتِ عددی است؛ پرسنل با چیپ‌هایش ردیف را می‌شکست.
    expect(grids).toHaveLength(1);
    expect(within(grids[0] as HTMLElement).getByText('قیمت پایه (تومان) *')).toBeInTheDocument();
    expect(within(grids[0] as HTMLElement).getByText('زمان متوسط (دقیقه)')).toBeInTheDocument();
  });

  it('دکمهٔ انصراف واریانت دارد و نامرئی نیست', () => {
    renderModal();

    expect(screen.getByRole('button', { name: 'انصراف' })).toHaveClass('secondary');
  });
});
