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

vi.mock('../lib/api', () => ({
  api: { get: vi.fn(), post: vi.fn(), patch: vi.fn(), put: vi.fn(), delete: vi.fn() },
  ApiError: class extends Error {},
}));

import { api } from '../lib/api';
import { useServiceCategories } from './useServiceCategories';

const get = api.get as ReturnType<typeof vi.fn>;

function Probe() {
  const { categories } = useServiceCategories();

  return <div data-testid="labels">{categories.map((c) => c.label).join('|')}</div>;
}

beforeEach(() => get.mockReset());

describe('useServiceCategories', () => {
  /** کنترلر با success(['data' => …]) پاسخ می‌دهد، پس آرایه یک لایه تودرتوست. */
  it('آرایه را از پاسخ تودرتوی کنترلر بیرون می‌کشد', async () => {
    get.mockResolvedValue({ success: true, data: { data: [
      { key: 'outpatient', label: 'خدمات سرپایی' },
      { key: 'inpatient', label: 'خدمات بستری' },
    ] } });

    renderWithProviders(<Probe />);

    await waitFor(() => expect(screen.getByTestId('labels')).toHaveTextContent('خدمات سرپایی|خدمات بستری'));
  });

  it('پاسخ تخت (بدون لایهٔ اضافه) هم پذیرفته می‌شود', async () => {
    get.mockResolvedValue({ success: true, data: [{ key: 'outpatient', label: 'خدمات سرپایی' }] });

    renderWithProviders(<Probe />);

    await waitFor(() => expect(screen.getByTestId('labels')).toHaveTextContent('خدمات سرپایی'));
  });

  it('پاسخ نامعتبر → لیست خالی، بدون خطا', async () => {
    get.mockResolvedValue({ success: true, data: { insurances: [] } });

    renderWithProviders(<Probe />);

    await waitFor(() => expect(screen.getByTestId('labels')).toHaveTextContent(''));
  });
});
