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

import { CTA_LABELS } from '@/config/cta-labels';

import { MarketingNav } from './MarketingNav';

const LATEST_KEY = 'rankwiz_changelog_latest_at';
const SEEN_KEY = 'rankwiz_changelog_seen_at';

vi.mock('@/lib/analytics', () => ({ trackEvent: vi.fn() }));

beforeEach(() => {
  localStorage.clear();
});

describe('MarketingNav changelog badge', () => {
  it("renders the What's New link", () => {
    render(<MarketingNav canLogin={false} canRegister={false} />);
    expect(screen.getAllByRole('link', { name: /what's new/i }).length).toBeGreaterThan(0);
  });

  it('shows the New badge when there are unread entries', () => {
    localStorage.setItem(LATEST_KEY, '2025-06-01T00:00:00.000Z');
    // seenAt not set → hasNew = true
    render(<MarketingNav canLogin={false} canRegister={false} />);
    expect(screen.getAllByLabelText('New changelog entries').length).toBeGreaterThan(0);
  });

  it('hides the badge when user has already seen the latest entry', () => {
    localStorage.setItem(LATEST_KEY, '2025-01-01T00:00:00.000Z');
    localStorage.setItem(SEEN_KEY, '2025-06-01T00:00:00.000Z');
    render(<MarketingNav canLogin={false} canRegister={false} />);
    expect(screen.queryByLabelText('New changelog entries')).toBeNull();
  });

  it('hides the badge when no changelog entries are known', () => {
    render(<MarketingNav canLogin={false} canRegister={false} />);
    expect(screen.queryByLabelText('New changelog entries')).toBeNull();
  });
});

describe('MarketingNav CTA label', () => {
  it('uses NAV_CTA label distinct from FREE_ENTRY hero CTA', () => {
    expect(CTA_LABELS.NAV_CTA).not.toBe(CTA_LABELS.FREE_ENTRY);
  });

  it('renders the nav CTA button with NAV_CTA label when canRegister=true', () => {
    render(<MarketingNav canLogin={true} canRegister={true} />);
    const ctaLinks = screen.getAllByRole('link', { name: new RegExp(CTA_LABELS.NAV_CTA, 'i') });
    expect(ctaLinks.length).toBeGreaterThan(0);
  });

  it('does not render "Start Free Analysis" as the nav CTA text', () => {
    render(<MarketingNav canLogin={true} canRegister={true} />);
    // There should be no link whose accessible name is exactly the hero CTA label
    const heroCtaLinks = screen.queryAllByRole('link', { name: /^Start Free Analysis$/i });
    expect(heroCtaLinks).toHaveLength(0);
  });
});
