import { describe, it, expect, beforeEach, vi } from 'vitest';
import { screen, fireEvent, 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 InsuranceServiceCategoriesCard from './InsuranceServiceCategoriesCard';

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

function mockCategories(enabled: Record<string, boolean>) {
  get.mockResolvedValue({
    success: true,
    data: {
      service_categories: [
        { key: 'outpatient', label: 'خدمات سرپایی', enabled: enabled.outpatient },
        { key: 'inpatient', label: 'خدمات بستری', enabled: enabled.inpatient },
      ],
    },
  });
}

beforeEach(() => {
  get.mockReset();
  put.mockReset();
  put.mockResolvedValue({ success: true, data: {} });
});

describe('InsuranceServiceCategoriesCard', () => {
  it('سوییچ هر نوع خدمت را با وضعیت سرور نشان می‌دهد', async () => {
    mockCategories({ outpatient: true, inpatient: false });
    renderWithProviders(<InsuranceServiceCategoriesCard />);

    expect(await screen.findByText('نوع خدمات بیمه')).toBeInTheDocument();
    expect(screen.getByLabelText('خدمات سرپایی')).toBeChecked();
    expect(screen.getByLabelText('خدمات بستری')).not.toBeChecked();
  });

  it('تغییر سوییچ فقط همان نوع را PUT می‌کند', async () => {
    mockCategories({ outpatient: true, inpatient: true });
    renderWithProviders(<InsuranceServiceCategoriesCard />);
    await screen.findByText('نوع خدمات بیمه');

    fireEvent.click(screen.getByLabelText('خدمات بستری'));

    await waitFor(() => expect(put).toHaveBeenCalledWith('/api/v1/insurance-pricing', {
      service_categories: [
        { key: 'outpatient', enabled: true },
        { key: 'inpatient', enabled: false },
      ],
    }));
  });

  it('غیرفعال‌کردن آخرین نوع فعال ارسال نمی‌شود', async () => {
    mockCategories({ outpatient: true, inpatient: false });
    renderWithProviders(<InsuranceServiceCategoriesCard />);
    await screen.findByText('نوع خدمات بیمه');

    fireEvent.click(screen.getByLabelText('خدمات سرپایی'));

    expect(put).not.toHaveBeenCalled();
    expect(screen.getByLabelText('خدمات سرپایی')).toBeChecked();
  });
});
