import { fireEvent, render, screen, waitFor } from '@testing-library/react';
import { beforeEach, expect, it, vi } from 'vitest';
import type { AuthUser } from '@alqove/types';
import { useAuthStore } from '@/stores/auth';
import { SellerReturnsPanel } from '../seller-returns-panel';
import { SellerReviewsWidget } from '../seller-reviews-widget';
import { MessageThread } from '@/components/messaging/message-thread';
import { AttachmentUploader } from '@/components/messaging/attachment-uploader';
import { MessagesInboxClient } from '@/app/(seller)/seller/inbox/messages/messages-inbox-client';
const mocks = vi.hoisted(() => ({ returnDetail: vi.fn(() => ({ isLoading: true })), summary: vi.fn(() => ({})), threads: vi.fn(() => ({})),
  messages: vi.fn(() => ({})), post: vi.fn(() => ({})), remove: vi.fn(() => ({})), upload: vi.fn(), scope: vi.fn() }));
vi.mock('@/lib/queries/use-returns', () => ({ useReturn: mocks.returnDetail }));
vi.mock('@/lib/queries/use-reviews', () => ({ useStoreRatingSummary: mocks.summary }));
vi.mock('@/lib/queries/use-my-threads', () => ({ useMyThreads: mocks.threads }));
vi.mock('@/lib/queries/use-messages', () => ({ useMessages: mocks.messages, usePostMessage: mocks.post, useDeleteMessage: mocks.remove }));
vi.mock('@/lib/api', () => ({ api: { messages: { uploadAttachment: mocks.upload, forStore: mocks.scope } } }));
beforeEach(() => {
  vi.clearAllMocks();
  mocks.scope.mockReturnValue({ uploadAttachment: mocks.upload });
  mocks.upload.mockResolvedValue({ data: { id: 'attachment', url: '/image.png' } });
  useAuthStore.setState({ user: { id: 'u', store_id: 'legacy' } as AuthUser, token: 'token', isLoading: false,
    selectedStoreId: 'chosen', memberships: [{ id: 'm', store_id: 'chosen', role: 'owner', capabilities: ['store.admin'], is_exempt: false }] });
});
it('the seller return panel passes its selected store to detail reads', () => {
  render(<SellerReturnsPanel openReturnId="return" />);
  expect(mocks.returnDetail).toHaveBeenCalledWith('return', 'chosen');
});
it('the dashboard review summary uses seller scope', () => {
  render(<SellerReviewsWidget storeId="chosen" />);
  expect(mocks.summary).toHaveBeenCalledWith('chosen', true);
});
it('the seller inbox passes the selected store to its query', () => {
  render(<MessagesInboxClient />);
  expect(mocks.threads).toHaveBeenCalledWith('chosen');
});
it('seller message threads carry scope into every message hook', () => {
  render(<MessageThread orderId="order" viewerRole="seller" viewerUserId="u" />);
  expect(mocks.messages).toHaveBeenCalledWith('order', { storeId: 'chosen' });
  expect(mocks.post).toHaveBeenCalledWith('order', 'chosen');
  expect(mocks.remove).toHaveBeenCalledWith('order', 'chosen');
});
it('seller attachments use the store endpoint', async () => {
  render(<AttachmentUploader orderId="order" storeId="chosen" onChange={vi.fn()} />);
  fireEvent.change(screen.getByLabelText('Attach images'), { target: { files: [new File(['image'], 'image.png', { type: 'image/png' })] } });
  await waitFor(() => expect(mocks.upload).toHaveBeenCalled());
  expect(mocks.scope).toHaveBeenCalledWith('chosen');
});
