import { render, screen, waitFor } from '@testing-library/react';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { vi, describe, it, expect, beforeEach } from 'vitest';
import AdminDashboard from '../page';

const dashboardMock = vi.fn();
vi.mock('@/lib/api', () => ({
  api: {
    admin: { dashboardMetrics: (...a: unknown[]) => dashboardMock(...a) },
  },
}));

function wrap(node: React.ReactNode) {
  const qc = new QueryClient({ defaultOptions: { queries: { retry: false } } });
  return <QueryClientProvider client={qc}>{node}</QueryClientProvider>;
}

describe('AdminDashboard', () => {
  beforeEach(() => {
    dashboardMock.mockReset();
  });

  it('renders metrics tiles with formatted values on success', async () => {
    dashboardMock.mockResolvedValue({
      data: {
        total_stores: 86,
        verified_stores: 71,
        active_items: 4721,
        total_sales_cents: 12_743_000,
        active_orders: 34,
        open_disputes: 2,
        overdue_disputes: 1,
      },
    });
    render(wrap(<AdminDashboard />));
    await waitFor(() => expect(screen.getByText('86')).toBeInTheDocument());
    expect(screen.getByText('71')).toBeInTheDocument();
    expect(screen.getByText('4,721')).toBeInTheDocument();
    expect(screen.getByText('$127,430')).toBeInTheDocument();
    expect(screen.getByText('34')).toBeInTheDocument();
  });

  it('shows an error banner if the API rejects', async () => {
    dashboardMock.mockRejectedValue(new Error('forbidden'));
    render(wrap(<AdminDashboard />));
    await waitFor(() =>
      expect(screen.getByText(/Couldn't load platform metrics/)).toBeInTheDocument(),
    );
  });
});
