import { render, screen } from '@testing-library/react';
import { describe, it, expect } from 'vitest';
import { ReturnTimeline } from '../return-timeline';
import type { OrderReturn } from '@alqove/api-client';

const baseReturn: OrderReturn = {
  id: 'r1',
  order_id: 'o1',
  initiated_by: 'buyer',
  state: 'closed',
  reason: 'damaged',
  reason_text: null,
  return_shipping_payer: 'seller',
  restocking_fee_cents: 0,
  refund_amount_cents: 5000,
  refund_original_shipping: false,
  refund_amount_override_cents: null,
  stripe_refund_id: 're_1',
  tracking_number: null,
  carrier: null,
  tracker_id: null,
  tracking_url: null,
  shipping_label_url: null,
  easypost_label_error: null,
  items: [],
  approved_at: '2026-05-07T10:00:00Z',
  rejected_at: null,
  label_issued_at: null,
  in_transit_at: null,
  received_at: null,
  refunded_at: '2026-05-07T10:01:00Z',
  closed_at: '2026-05-07T10:01:01Z',
  cancelled_at: null,
  escalation: null,
  created_at: '2026-05-07T09:00:00Z',
  updated_at: '2026-05-07T10:01:01Z',
};

describe('ReturnTimeline', () => {
  it('renders only events that have timestamps', () => {
    render(<ReturnTimeline return={baseReturn} />);
    expect(screen.getByText('Requested')).toBeTruthy();
    expect(screen.getByText('Approved')).toBeTruthy();
    expect(screen.getByText('Refunded')).toBeTruthy();
    expect(screen.getByText('Closed')).toBeTruthy();
    expect(screen.queryByText('Rejected')).toBeNull();
    expect(screen.queryByText('Cancelled')).toBeNull();
  });

  it('renders an empty list when no events have timestamps (other than created)', () => {
    const r: OrderReturn = {
      ...baseReturn,
      approved_at: null,
      refunded_at: null,
      closed_at: null,
    };
    render(<ReturnTimeline return={r} />);
    // Only the 'Requested' (created_at) entry should remain.
    expect(screen.getByTestId('return-timeline').children.length).toBe(1);
  });

  it('renders new shipping rows when timestamps populated', () => {
    const r: OrderReturn = {
      ...baseReturn,
      state: 'received',
      label_issued_at: '2026-05-07T11:00:00Z',
      in_transit_at: '2026-05-07T12:00:00Z',
      received_at: '2026-05-07T13:00:00Z',
      refunded_at: null,
      closed_at: null,
    };
    render(<ReturnTimeline return={r} />);
    expect(screen.getByText('Label issued')).toBeTruthy();
    expect(screen.getByText('In transit')).toBeTruthy();
    expect(screen.getByText('Received')).toBeTruthy();
  });

  it('shows Download label link in awaiting_shipment for buyer view', () => {
    const r: OrderReturn = {
      ...baseReturn,
      state: 'awaiting_shipment',
      approved_at: '2026-05-07T10:00:00Z',
      label_issued_at: '2026-05-07T10:30:00Z',
      refunded_at: null,
      closed_at: null,
      shipping_label_url: 'https://easypost-files.s3.amazonaws.com/label.pdf',
      tracking_number: '9400111899223344556677',
      tracking_url: 'https://track.easypost.com/trk_test_456',
      carrier: 'USPS',
    };
    render(<ReturnTimeline return={r} viewer="buyer" />);
    const link = screen.getByRole('link', { name: /Download label/i });
    expect(link).toBeTruthy();
    expect(link.getAttribute('href')).toBe('https://easypost-files.s3.amazonaws.com/label.pdf');
    expect(link.getAttribute('target')).toBe('_blank');

    // Carrier name links to tracking_url
    const carrierLink = screen.getByRole('link', { name: /USPS/i });
    expect(carrierLink.getAttribute('href')).toBe('https://track.easypost.com/trk_test_456');
    expect(screen.getByText(/9400111899223344556677/)).toBeTruthy();
  });

  it('does NOT show Download label for seller view in awaiting_shipment', () => {
    const r: OrderReturn = {
      ...baseReturn,
      state: 'awaiting_shipment',
      approved_at: '2026-05-07T10:00:00Z',
      label_issued_at: '2026-05-07T10:30:00Z',
      refunded_at: null,
      closed_at: null,
      shipping_label_url: 'https://easypost-files.s3.amazonaws.com/label.pdf',
      tracking_number: '9400111899223344556677',
      carrier: 'USPS',
    };
    render(<ReturnTimeline return={r} viewer="seller" />);
    expect(screen.queryByRole('link', { name: /Download label/i })).toBeNull();
  });
});
