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

vi.mock('@inertiajs/react', async () => {
  const actual = await vi.importActual('@inertiajs/react');
  return {
    ...actual,
    Link: ({
      children,
      href,
      className,
    }: {
      children: React.ReactNode;
      href: string;
      className?: string;
    }) => (
      <a href={href} className={className}>
        {children}
      </a>
    ),
  };
});

import LifecycleStatusFilter from './LifecycleStatusFilter';

beforeEach(() => {
  vi.stubGlobal(
    'route',
    vi.fn((name: string, params: number) => {
      if (name === 'recommendations.index') {
        return `/sites/${params}/recommendations`;
      }
      return '/';
    }),
  );
});

describe('LifecycleStatusFilter', () => {
  const defaultCounts = {
    total: 100,
    pending: 50,
    reviewed: 10,
    approved: 15,
    rejected: 5,
    deferred: 8,
    applied: 10,
    tracking: 2,
  };

  it('renders all status filter pills with counts', () => {
    render(<LifecycleStatusFilter counts={defaultCounts} currentFilter={null} siteId={1} />);

    expect(screen.getByText('All (100)')).toBeInTheDocument();
    expect(screen.getByText('Pending (50)')).toBeInTheDocument();
    expect(screen.getByText('Reviewed (10)')).toBeInTheDocument();
    expect(screen.getByText('Approved (15)')).toBeInTheDocument();
    expect(screen.getByText('Rejected (5)')).toBeInTheDocument();
    expect(screen.getByText('Deferred (8)')).toBeInTheDocument();
    expect(screen.getByText('Applied (10)')).toBeInTheDocument();
    expect(screen.getByText('Tracking (2)')).toBeInTheDocument();
  });

  it('renders All filter with correct href when no filter is active', () => {
    render(<LifecycleStatusFilter counts={defaultCounts} currentFilter={null} siteId={1} />);

    const allLink = screen.getByText('All (100)').closest('a');
    expect(allLink).toHaveAttribute('href', '/sites/1/recommendations');
  });

  it('renders Pending filter with correct href', () => {
    render(<LifecycleStatusFilter counts={defaultCounts} currentFilter={null} siteId={1} />);

    const pendingLink = screen.getByText('Pending (50)').closest('a');
    expect(pendingLink).toHaveAttribute(
      'href',
      '/sites/1/recommendations?lifecycle_status=pending',
    );
  });

  it('renders Reviewed filter with correct href', () => {
    render(<LifecycleStatusFilter counts={defaultCounts} currentFilter={null} siteId={1} />);

    const reviewedLink = screen.getByText('Reviewed (10)').closest('a');
    expect(reviewedLink).toHaveAttribute(
      'href',
      '/sites/1/recommendations?lifecycle_status=reviewed',
    );
  });

  it('renders Approved filter with correct href', () => {
    render(<LifecycleStatusFilter counts={defaultCounts} currentFilter={null} siteId={1} />);

    const approvedLink = screen.getByText('Approved (15)').closest('a');
    expect(approvedLink).toHaveAttribute(
      'href',
      '/sites/1/recommendations?lifecycle_status=approved',
    );
  });

  it('renders Rejected filter with correct href', () => {
    render(<LifecycleStatusFilter counts={defaultCounts} currentFilter={null} siteId={1} />);

    const rejectedLink = screen.getByText('Rejected (5)').closest('a');
    expect(rejectedLink).toHaveAttribute(
      'href',
      '/sites/1/recommendations?lifecycle_status=rejected',
    );
  });

  it('renders Deferred filter with correct href', () => {
    render(<LifecycleStatusFilter counts={defaultCounts} currentFilter={null} siteId={1} />);

    const deferredLink = screen.getByText('Deferred (8)').closest('a');
    expect(deferredLink).toHaveAttribute(
      'href',
      '/sites/1/recommendations?lifecycle_status=deferred',
    );
  });

  it('renders Applied filter with correct href', () => {
    render(<LifecycleStatusFilter counts={defaultCounts} currentFilter={null} siteId={1} />);

    const appliedLink = screen.getByText('Applied (10)').closest('a');
    expect(appliedLink).toHaveAttribute(
      'href',
      '/sites/1/recommendations?lifecycle_status=applied',
    );
  });

  it('renders Tracking filter with correct href', () => {
    render(<LifecycleStatusFilter counts={defaultCounts} currentFilter={null} siteId={1} />);

    const trackingLink = screen.getByText('Tracking (2)').closest('a');
    expect(trackingLink).toHaveAttribute(
      'href',
      '/sites/1/recommendations?lifecycle_status=tracking',
    );
  });

  it('highlights All filter when no filter is active', () => {
    render(<LifecycleStatusFilter counts={defaultCounts} currentFilter={null} siteId={1} />);

    const allLink = screen.getByText('All (100)').closest('a');
    expect(allLink).toHaveClass('bg-primary');
    expect(allLink).toHaveClass('text-primary-foreground');

    const pendingLink = screen.getByText('Pending (50)').closest('a');
    expect(pendingLink).toHaveClass('bg-muted');
    expect(pendingLink).toHaveClass('text-muted-foreground');
  });

  it('highlights Pending filter when pending is active', () => {
    render(<LifecycleStatusFilter counts={defaultCounts} currentFilter="pending" siteId={1} />);

    const pendingLink = screen.getByText('Pending (50)').closest('a');
    expect(pendingLink).toHaveClass('bg-primary');
    expect(pendingLink).toHaveClass('text-primary-foreground');

    const allLink = screen.getByText('All (100)').closest('a');
    expect(allLink).toHaveClass('bg-muted');
    expect(allLink).toHaveClass('text-muted-foreground');
  });

  it('highlights Reviewed filter when reviewed is active', () => {
    render(<LifecycleStatusFilter counts={defaultCounts} currentFilter="reviewed" siteId={1} />);

    const reviewedLink = screen.getByText('Reviewed (10)').closest('a');
    expect(reviewedLink).toHaveClass('bg-primary');
    expect(reviewedLink).toHaveClass('text-primary-foreground');
  });

  it('highlights Approved filter when approved is active', () => {
    render(<LifecycleStatusFilter counts={defaultCounts} currentFilter="approved" siteId={1} />);

    const approvedLink = screen.getByText('Approved (15)').closest('a');
    expect(approvedLink).toHaveClass('bg-primary');
    expect(approvedLink).toHaveClass('text-primary-foreground');
  });

  it('highlights Rejected filter when rejected is active', () => {
    render(<LifecycleStatusFilter counts={defaultCounts} currentFilter="rejected" siteId={1} />);

    const rejectedLink = screen.getByText('Rejected (5)').closest('a');
    expect(rejectedLink).toHaveClass('bg-primary');
    expect(rejectedLink).toHaveClass('text-primary-foreground');
  });

  it('highlights Deferred filter when deferred is active', () => {
    render(<LifecycleStatusFilter counts={defaultCounts} currentFilter="deferred" siteId={1} />);

    const deferredLink = screen.getByText('Deferred (8)').closest('a');
    expect(deferredLink).toHaveClass('bg-primary');
    expect(deferredLink).toHaveClass('text-primary-foreground');
  });

  it('highlights Applied filter when applied is active', () => {
    render(<LifecycleStatusFilter counts={defaultCounts} currentFilter="applied" siteId={1} />);

    const appliedLink = screen.getByText('Applied (10)').closest('a');
    expect(appliedLink).toHaveClass('bg-primary');
    expect(appliedLink).toHaveClass('text-primary-foreground');
  });

  it('highlights Tracking filter when tracking is active', () => {
    render(<LifecycleStatusFilter counts={defaultCounts} currentFilter="tracking" siteId={1} />);

    const trackingLink = screen.getByText('Tracking (2)').closest('a');
    expect(trackingLink).toHaveClass('bg-primary');
    expect(trackingLink).toHaveClass('text-primary-foreground');
  });

  it('works with zero counts', () => {
    const zeroCounts = {
      total: 0,
      pending: 0,
      reviewed: 0,
      approved: 0,
      rejected: 0,
      deferred: 0,
      applied: 0,
      tracking: 0,
    };

    render(<LifecycleStatusFilter counts={zeroCounts} currentFilter={null} siteId={1} />);

    expect(screen.getByText('All (0)')).toBeInTheDocument();
    expect(screen.getByText('Pending (0)')).toBeInTheDocument();
    expect(screen.getByText('Reviewed (0)')).toBeInTheDocument();
    expect(screen.getByText('Approved (0)')).toBeInTheDocument();
    expect(screen.getByText('Rejected (0)')).toBeInTheDocument();
    expect(screen.getByText('Deferred (0)')).toBeInTheDocument();
    expect(screen.getByText('Applied (0)')).toBeInTheDocument();
    expect(screen.getByText('Tracking (0)')).toBeInTheDocument();
  });

  it('uses correct siteId in route generation', () => {
    render(<LifecycleStatusFilter counts={defaultCounts} currentFilter={null} siteId={42} />);

    const allLink = screen.getByText('All (100)').closest('a');
    expect(allLink).toHaveAttribute('href', '/sites/42/recommendations');

    const pendingLink = screen.getByText('Pending (50)').closest('a');
    expect(pendingLink).toHaveAttribute(
      'href',
      '/sites/42/recommendations?lifecycle_status=pending',
    );
  });
});
