import { render, screen, waitFor } from '@testing-library/react';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { vi, describe, it, expect, beforeEach } from 'vitest';
import { MessagesInboxClient } from '../messages-inbox-client';
import { useAuthStore } from '@/stores/auth';
import type { AuthUser } from '@alqove/types';

const threadsMock = vi.fn();
vi.mock('@/lib/api', () => ({
  api: { messages: { forStore: (storeId: string) => { expect(storeId).toBe('store-1'); return { threads: () => threadsMock() }; } } },
}));

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

describe('MessagesInboxClient', () => {
  beforeEach(() => {
    threadsMock.mockReset();
    useAuthStore.setState({ user: { id: 'seller', store_id: 'legacy' } as AuthUser, token: 'token', isLoading: false,
      selectedStoreId: 'store-1', memberships: [{ id: 'm', store_id: 'store-1', role: 'owner', capabilities: ['store.admin'], is_exempt: false }] });
  });

  it('renders rows with counterparty and unread count', async () => {
    threadsMock.mockResolvedValue({
      data: [
        {
          thread_id: 't1',
          order_id: 'o1',
          counterparty_name: 'Jane D.',
          unread_count: 2,
          last_message_snippet: 'Where is my package?',
          last_message_at: '2026-05-06T10:00:00Z',
        },
      ],
    });

    render(wrap(<MessagesInboxClient />));
    await waitFor(() => expect(screen.getByText('Jane D.')).toBeInTheDocument());
    expect(screen.getByText(/Where is my package/)).toBeInTheDocument();
    expect(screen.getByText('2')).toBeInTheDocument();
  });

  it('shows empty state when no threads', async () => {
    threadsMock.mockResolvedValue({ data: [] });
    render(wrap(<MessagesInboxClient />));
    await waitFor(() =>
      expect(screen.getByText(/No conversations/i)).toBeInTheDocument(),
    );
  });
});
