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 RecordNumberSettingsPage from './RecordNumberSettingsPage';

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

function mockSettings(overrides: Record<string, unknown> = {}) {
  get.mockResolvedValue({
    success: true,
    data: {
      enabled: false, pattern: '{YY}-{SEQ:4}', reset_policy: 'none',
      counter: 0, next_preview: '05-0001', can_edit: true, ...overrides,
    },
  });
}

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

describe('RecordNumberSettingsPage', () => {
  it('الگو و پیش‌نمایش سرور را نشان می‌دهد', async () => {
    mockSettings({ enabled: true, pattern: 'MD-{YY}-{SEQ:4}', reset_policy: 'yearly', counter: 12, next_preview: 'MD-05-0013' });
    renderWithProviders(<RecordNumberSettingsPage />);

    expect(await screen.findByDisplayValue('MD-{YY}-{SEQ:4}')).toBeInTheDocument();
    expect(screen.getByText('MD-05-0013')).toBeInTheDocument();
    expect(screen.getByText(/12 پرونده را شماره‌گذاری کرده/)).toBeInTheDocument();
  });

  /** ✅ موفق: تغییر الگو و ذخیره با همان سه فیلد. */
  it('الگوی تغییریافته را ذخیره می‌کند', async () => {
    mockSettings();
    renderWithProviders(<RecordNumberSettingsPage />);

    const input = await screen.findByLabelText('الگوی شماره');
    fireEvent.change(input, { target: { value: 'P-{SEQ:3}' } });
    fireEvent.click(screen.getByRole('switch', { name: 'شماره‌گذاری خودکار پرونده' }));

    fireEvent.click(screen.getByText('ذخیره تنظیمات'));
    await waitFor(() => expect(put).toHaveBeenCalled());

    expect(put.mock.calls[0][0]).toBe('/api/v1/patient-record-number-settings');
    expect(put.mock.calls[0][1]).toEqual({ enabled: true, pattern: 'P-{SEQ:3}', reset_policy: 'none' });
  });

  /** ⚠️ مرزی: بدون تغییر، دکمهٔ ذخیره غیرفعال است. */
  it('تا تغییری نباشد دکمهٔ ذخیره غیرفعال است', async () => {
    mockSettings();
    renderWithProviders(<RecordNumberSettingsPage />);

    const btn = await screen.findByText('ذخیره تنظیمات');
    expect(btn).toBeDisabled();
  });

  /** ❌ خطا: کاربری که صاحب مجموعه نیست فقط می‌بیند. */
  it('بدون can_edit فرم فقط خواندنی است', async () => {
    mockSettings({ can_edit: false, enabled: true });
    renderWithProviders(<RecordNumberSettingsPage />);

    expect(await screen.findByText(/تغییر الگو فقط با حساب صاحب مجموعه/)).toBeInTheDocument();
    expect(screen.getByLabelText('الگوی شماره')).toHaveAttribute('readonly');
    expect(screen.queryByText('ذخیره تنظیمات')).toBeNull();
  });
});
