import { fireEvent, render, screen } from '@testing-library/react';
import { describe, expect, it, vi } from 'vitest';

import { RecordLink } from '../src/platform/components/RecordLink';

// RecordLink is the single source of truth for "a link that opens a record".
// These cases pin the behavior every navigable record reference now inherits:
// a real anchor with an href (so the browser's open-in-new-tab / middle-click /
// copy-link work), plain-click interception for in-app navigation, modifier
// fall-through, and stopPropagation against enclosing row handlers.

describe('RecordLink', () => {
  it('renders a real anchor pointing at the record detail route', () => {
    render(<RecordLink objectApiName="Account" recordId="001abc">Acme</RecordLink>);

    const link = screen.getByRole('link', { name: 'Acme' });
    expect(link).toHaveAttribute('href', '/object/Account/001abc');
    expect(link).toHaveClass('text-blue-600');
  });

  it('intercepts a plain left-click for in-app navigation', () => {
    const onNavigate = vi.fn();
    render(<RecordLink objectApiName="Account" recordId="001abc" onNavigate={onNavigate}>Acme</RecordLink>);

    fireEvent.click(screen.getByRole('link', { name: 'Acme' }));

    expect(onNavigate).toHaveBeenCalledWith('Account', '001abc');
  });

  it('lets a modifier-click fall through to the browser (open in new tab)', () => {
    const onNavigate = vi.fn();
    render(<RecordLink objectApiName="Account" recordId="001abc" onNavigate={onNavigate}>Acme</RecordLink>);

    fireEvent.click(screen.getByRole('link', { name: 'Acme' }), { metaKey: true });

    expect(onNavigate).not.toHaveBeenCalled();
  });

  it('stops propagation so an enclosing row/card handler does not also fire', () => {
    const rowClick = vi.fn();
    const onNavigate = vi.fn();
    render(
      <div onClick={rowClick}>
        <RecordLink objectApiName="Account" recordId="001abc" onNavigate={onNavigate}>Acme</RecordLink>
      </div>,
    );

    fireEvent.click(screen.getByRole('link', { name: 'Acme' }));

    expect(onNavigate).toHaveBeenCalledTimes(1);
    expect(rowClick).not.toHaveBeenCalled();
  });

  it('applies a caller-provided className instead of the default', () => {
    render(<RecordLink objectApiName="Account" recordId="001abc" className="custom-class">Acme</RecordLink>);

    expect(screen.getByRole('link', { name: 'Acme' })).toHaveClass('custom-class');
  });

  it('renders plain text (no link) when recordId is empty, so it cannot point at the list route', () => {
    render(<RecordLink objectApiName="Account" recordId="">Acme</RecordLink>);

    // No anchor at all — an empty id would otherwise build href="/object/Account/".
    expect(screen.queryByRole('link')).toBeNull();
    expect(screen.getByText('Acme')).toBeInTheDocument();
  });
});
