import { describe, it, expect, vi, beforeEach } from 'vitest';
import { fireEvent, render, screen, waitFor } from '@testing-library/react';
import React from 'react';

function mockFetchSequence(...responses) {
  const fn = vi.fn();
  for (const r of responses) {
    fn.mockResolvedValueOnce({
      ok: r.status >= 200 && r.status < 300,
      status: r.status,
      json: async () => r.body,
      text: async () => JSON.stringify(r.body),
    });
  }
  return fn;
}

import PerformancePanel from './PerformancePanel';

describe('PerformancePanel', () => {
  beforeEach(() => {
    vi.restoreAllMocks();
  });

  it('renders the toggle unchecked from GET state (Windows)', async () => {
    global.fetch = mockFetchSequence({
      status: 200,
      body: { enabled: false, platform: 'win32' },
    });
    render(<PerformancePanel />);
    await waitFor(() => {
      const toggle = screen.getByTestId('torch-compile-toggle');
      expect(toggle).not.toBeChecked();
      expect(toggle).not.toBeDisabled();
    });
  });

  it('toggle click PUTs the new state', async () => {
    const fetchMock = mockFetchSequence(
      { status: 200, body: { enabled: false, platform: 'win32' } }, // initial GET
      { status: 200, body: { enabled: true, platform: 'win32' } },  // PUT
    );
    global.fetch = fetchMock;

    render(<PerformancePanel />);
    await waitFor(() => screen.getByTestId('torch-compile-toggle'));
    const toggle = screen.getByTestId('torch-compile-toggle');
    fireEvent.click(toggle);

    await waitFor(() => {
      const put = fetchMock.mock.calls.find(
        ([_u, opts]) => opts && opts.method === 'PUT',
      );
      expect(put).toBeTruthy();
      expect(put[0]).toMatch(/\/api\/settings\/perf\/torch-compile-disabled$/);
      expect(JSON.parse(put[1].body)).toEqual({ enabled: true });
    });
  });

  it('renders disabled with badge on non-Windows platforms (darwin)', async () => {
    global.fetch = mockFetchSequence({
      status: 200,
      body: { enabled: false, platform: 'darwin' },
    });
    render(<PerformancePanel />);
    await waitFor(() => {
      const toggle = screen.getByTestId('torch-compile-toggle');
      expect(toggle).toBeDisabled();
    });
    expect(screen.getByText(/not applicable/i)).toBeInTheDocument();
  });

  it('renders disabled on linux platform', async () => {
    global.fetch = mockFetchSequence({
      status: 200,
      body: { enabled: false, platform: 'linux' },
    });
    render(<PerformancePanel />);
    await waitFor(() => {
      const toggle = screen.getByTestId('torch-compile-toggle');
      expect(toggle).toBeDisabled();
    });
  });

  it('renders pre-enabled when backend reports enabled=true', async () => {
    global.fetch = mockFetchSequence({
      status: 200,
      body: { enabled: true, platform: 'win32' },
    });
    render(<PerformancePanel />);
    await waitFor(() => {
      const toggle = screen.getByTestId('torch-compile-toggle');
      expect(toggle).toBeChecked();
    });
  });
});
