import { render, screen, waitFor, fireEvent } from '@testing-library/react';
import { vi, describe, it, expect, beforeEach } from 'vitest';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { AdminResolveReturnDialog } from '../admin-resolve-return-dialog';
import type { OrderReturnSummary } from '@alqove/api-client';

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

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

const summary: OrderReturnSummary = {
  id: 'r1',
  order_id: 'order-12345abc',
  state: 'in_transit',
  reason: 'damaged',
  refund_amount_cents: null,
  counterparty_name: 'Jane Doe',
  escalation: { state: 'open', reason: 'Stuck shipment — no updates in 10 days' },
  created_at: '2026-05-07T10:00:00Z',
  updated_at: '2026-05-07T10:00:00Z',
};

describe('AdminResolveReturnDialog', () => {
  beforeEach(() => {
    resolveMock.mockReset();
  });

  it('renders all three action options with copy', () => {
    render(
      wrap(
        <AdminResolveReturnDialog
          return={summary}
          open
          onClose={() => {}}
        />,
      ),
    );
    expect(screen.getByLabelText(/Refund the buyer/)).toBeInTheDocument();
    expect(screen.getByLabelText(/Close in seller/)).toBeInTheDocument();
    expect(screen.getByLabelText(/Resolve without action/)).toBeInTheDocument();
  });

  it('Submit disabled until action and resolution (≥ 10 chars) are set', () => {
    render(
      wrap(
        <AdminResolveReturnDialog
          return={summary}
          open
          onClose={() => {}}
        />,
      ),
    );
    const submit = screen.getByRole('button', { name: /^Resolve$/i }) as HTMLButtonElement;
    expect(submit.disabled).toBe(true);

    fireEvent.click(screen.getByLabelText(/Refund the buyer/));
    expect(submit.disabled).toBe(true);

    fireEvent.change(screen.getByRole('textbox'), { target: { value: 'short' } });
    expect(submit.disabled).toBe(true);

    fireEvent.change(screen.getByRole('textbox'), {
      target: { value: 'Refund issued; buyer was right.' },
    });
    expect(submit.disabled).toBe(false);
  });

  it('Submit calls useAdminResolveReturn with the right payload', async () => {
    resolveMock.mockResolvedValueOnce({
      data: {
        escalation: { id: 'e1', return_id: 'r1' },
        return: { id: 'r1', order_id: 'order-12345abc' },
      },
    });
    const onClose = vi.fn();
    render(
      wrap(
        <AdminResolveReturnDialog
          return={summary}
          open
          onClose={onClose}
        />,
      ),
    );
    fireEvent.click(screen.getByLabelText(/Refund the buyer/));
    fireEvent.change(screen.getByRole('textbox'), {
      target: { value: 'Refund issued; buyer was right.' },
    });
    fireEvent.click(screen.getByRole('button', { name: /^Resolve$/i }));
    await waitFor(() =>
      expect(resolveMock).toHaveBeenCalledWith('r1', {
        action: 'force_refund',
        resolution: 'Refund issued; buyer was right.',
      }),
    );
    await waitFor(() => expect(onClose).toHaveBeenCalled());
  });
});
