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

const listMock = vi.fn();
vi.mock('@/lib/api', () => ({
  api: { purchases: { list: (...a: unknown[]) => listMock(...a) } },
}));

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

describe('PurchasesClient', () => {
  beforeEach(() => {
    listMock.mockReset();
  });

  it('renders empty state with browse link when no purchases', async () => {
    listMock.mockResolvedValue({ data: [] });
    render(wrap(<PurchasesClient />));
    await waitFor(() =>
      expect(screen.getByText('No purchases yet')).toBeInTheDocument(),
    );
    expect(screen.getByRole('link', { name: /Browse Items/ })).toHaveAttribute(
      'href',
      '/items',
    );
  });

  it('renders a purchase row with total, status, and detail link', async () => {
    listMock.mockResolvedValue({
      data: [
        {
          id: 'pur-1',
          total: 5800,
          order_count: 2,
          status: 'shipped',
          is_delayed: false,
          created_at: '2026-04-01T00:00:00Z',
        },
      ],
    });
    render(wrap(<PurchasesClient />));
    await waitFor(() => expect(screen.getByText('$58.00')).toBeInTheDocument());
    expect(screen.getByText('Shipped')).toBeInTheDocument();
    expect(screen.getByText(/2 orders/)).toBeInTheDocument();
    const link = screen.getByRole('link', { name: /\$58\.00/ });
    expect(link).toHaveAttribute('href', '/purchases/pur-1');
  });

  it('shows a "Delayed" pill when purchase is delayed', async () => {
    listMock.mockResolvedValue({
      data: [
        {
          id: 'pur-2',
          total: 1200,
          order_count: 1,
          status: 'paid',
          is_delayed: true,
          created_at: '2026-04-01T00:00:00Z',
        },
      ],
    });
    render(wrap(<PurchasesClient />));
    await waitFor(() => expect(screen.getByText('Delayed')).toBeInTheDocument());
  });
});
