import React from 'react';
import {render, screen} from '@testing-library/react';
import PartnerEventsSection from '../PartnerEventsSection';
import type {Evenement} from '@/types/stage';

jest.mock('next/link', () => {
  return ({children, href, ...props}: {children: React.ReactNode; href: string; [key: string]: unknown}) => (
    <a href={href} {...props}>{children}</a>
  );
});

const makeEvent = (id: number, label: string): Evenement => ({
  eveId: id,
  eveDate: '2026-03-15',
  eveHeure: '20h30',
  eveLibelle: label,
  eveTev: {tevLibelle: 'Fest-noz'},
  eveVil: {vilNom: 'Quimper', vilCodepostal: '29000', vilGeoX: -4.1, vilGeoY: 48.0, vilGeoZoom: 12},
  evePla: null,
  aenOrganisateurs: []
});

describe('PartnerEventsSection', () => {
  it('shouldRenderSectionTitleAndSubtitle', () => {
    render(
      <PartnerEventsSection
        events={[]}
        locale="fr"
        title="Événements partenaires"
        subtitle="Découvrez les événements partenaires"
      />
    );

    expect(screen.getByText('Événements partenaires')).toBeInTheDocument();
    expect(screen.getByText('Découvrez les événements partenaires')).toBeInTheDocument();
  });

  it('shouldRenderPartnerEventCardsFromEventsList', () => {
    const events = [
      makeEvent(1, 'Partner Event A'),
      makeEvent(2, 'Partner Event B'),
      makeEvent(3, 'Partner Event C'),
    ];

    render(<PartnerEventsSection events={events} locale="fr" title="Titre" />);

    expect(screen.getByText('Partner Event A')).toBeInTheDocument();
    expect(screen.getByText('Partner Event B')).toBeInTheDocument();
    expect(screen.getByText('Partner Event C')).toBeInTheDocument();
  });

  it('shouldRenderEmptyStateWhenNoEvents', () => {
    const {container} = render(
      <PartnerEventsSection
        events={[]}
        locale="fr"
        title="Titre"
        emptyMessage="Aucun événement en partenariat"
      />
    );

    expect(screen.getByText('Aucun événement en partenariat')).toBeInTheDocument();
    const emptyState = container.querySelector('.partner-events__empty');
    expect(emptyState).toBeInTheDocument();
  });

  it('shouldRenderSeeAllLinkWhenProvided', () => {
    render(
      <PartnerEventsSection
        events={[makeEvent(1, 'Event')]}
        locale="fr"
        title="Titre"
        seeAllHref="/fr/evenements"
      />
    );

    const link = screen.getByText(/voir tous/i);
    expect(link.closest('a')).toHaveAttribute('href', '/fr/evenements');
  });

  it('shouldLimitDisplayedEventsToMaxCount', () => {
    const events = [
      makeEvent(1, 'Event 1'),
      makeEvent(2, 'Event 2'),
      makeEvent(3, 'Event 3'),
      makeEvent(4, 'Event 4'),
      makeEvent(5, 'Event 5'),
    ];

    render(<PartnerEventsSection events={events} locale="fr" title="Titre" maxDisplayed={2} />);

    expect(screen.getByText('Event 1')).toBeInTheDocument();
    expect(screen.getByText('Event 2')).toBeInTheDocument();
    expect(screen.queryByText('Event 3')).not.toBeInTheDocument();
  });

  it('shouldRenderStarDecorations', () => {
    const {container} = render(
      <PartnerEventsSection events={[]} locale="fr" title="Titre" />
    );

    const stars = container.querySelector('.partner-events__stars');
    expect(stars).toBeInTheDocument();
  });
});
