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

import { SiteBreadcrumb } from './SiteBreadcrumb';

const mockUsePage = vi.fn();

vi.mock('@inertiajs/react', async (importOriginal) => {
  const actual = await importOriginal<typeof import('@inertiajs/react')>();
  return {
    ...actual,
    usePage: () => mockUsePage(),
    Link: ({ href, children }: { href: string; children: React.ReactNode }) => (
      <a href={href}>{children}</a>
    ),
  };
});

function makePage(url: string, sites: { id: number; name: string; domain: string }[] = []) {
  return {
    url,
    props: { sites },
    component: '',
    version: '',
    scrollRegions: [],
    rememberedState: {},
    clearHistory: false,
    encryptHistory: false,
  };
}

const defaultSites = [{ id: 1, name: 'My Blog', domain: 'myblog.com' }];

describe('SiteBreadcrumb', () => {
  it('renders nothing when not on a site-scoped URL', () => {
    mockUsePage.mockReturnValue(makePage('/dashboard', defaultSites));
    const { container } = render(<SiteBreadcrumb />);
    expect(container).toBeEmptyDOMElement();
  });

  it('renders nothing when site is not found in sites list', () => {
    mockUsePage.mockReturnValue(makePage('/sites/99/analyze', defaultSites));
    const { container } = render(<SiteBreadcrumb />);
    expect(container).toBeEmptyDOMElement();
  });

  it('shows Dashboard > Site Name > Analysis breadcrumb', () => {
    mockUsePage.mockReturnValue(makePage('/sites/1/analyze', defaultSites));
    render(<SiteBreadcrumb />);
    expect(screen.getByText('Dashboard')).toBeInTheDocument();
    expect(screen.getByText('My Blog')).toBeInTheDocument();
    expect(screen.getByText('Analysis')).toBeInTheDocument();
  });

  it('Dashboard link points to /dashboard', () => {
    mockUsePage.mockReturnValue(makePage('/sites/1/analyze', defaultSites));
    render(<SiteBreadcrumb />);
    const dashLink = screen.getByRole('link', { name: 'Dashboard' });
    expect(dashLink).toHaveAttribute('href', '/dashboard');
  });

  it('site name links to the analyze page', () => {
    mockUsePage.mockReturnValue(makePage('/sites/1/recommendations', defaultSites));
    render(<SiteBreadcrumb />);
    const siteLink = screen.getByRole('link', { name: 'My Blog' });
    expect(siteLink).toHaveAttribute('href', '/sites/1/analyze');
  });

  it('shows Recommendations as current page', () => {
    mockUsePage.mockReturnValue(makePage('/sites/1/recommendations', defaultSites));
    render(<SiteBreadcrumb />);
    const page = screen.getByText('Recommendations');
    expect(page).toHaveAttribute('aria-current', 'page');
  });

  it('renders nav with aria-label="breadcrumb"', () => {
    mockUsePage.mockReturnValue(makePage('/sites/1/analyze', defaultSites));
    render(<SiteBreadcrumb />);
    expect(screen.getByRole('navigation', { name: 'breadcrumb' })).toBeInTheDocument();
  });

  it('handles content-briefs segment label', () => {
    mockUsePage.mockReturnValue(makePage('/sites/1/content-briefs', defaultSites));
    render(<SiteBreadcrumb />);
    expect(screen.getByText('Content Briefs')).toBeInTheDocument();
  });
});
