import React from 'react';
import {render, screen, waitFor} from '@testing-library/react';
import AnnuaireMemberEvents from '../AnnuaireMemberEvents';
import {getUpcomingEvents} from '@/services/evenementService';

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

const mockedGetUpcomingEvents = getUpcomingEvents as jest.MockedFunction<typeof getUpcomingEvents>;

describe('AnnuaireMemberEvents', () => {
  beforeEach(() => {
    jest.clearAllMocks();
  });

  it('shouldFetchEventsForSpecificOrganisateur', async () => {
    mockedGetUpcomingEvents.mockResolvedValue([
      {
        eveId: 1,
        eveDate: '2026-03-15',
        eveHeure: '20h30',
        eveLibelle: 'Fest-noz organisé',
        eveTev: {tevLibelle: 'Fest-noz'},
        eveVil: {vilNom: 'Brest', vilCodepostal: '29200', vilGeoX: -4.48, vilGeoY: 48.39, vilGeoZoom: 12},
        evePla: null,
        aenOrganisateurs: [{aenId: 42, aenLibelle: 'Mon asso'}]
      }
    ]);

    render(<AnnuaireMemberEvents aenId={42} aenLibelle="Mon asso" locale="fr" />);

    await waitFor(() => {
      expect(screen.getByText('Fest-noz organisé')).toBeInTheDocument();
    });

    expect(mockedGetUpcomingEvents).toHaveBeenCalledWith({
      organisateurs: [42],
      itemsPerPage: 3
    });
  });

  it('shouldShowEmptyStateForOrganisateurWithNoEvents', async () => {
    mockedGetUpcomingEvents.mockResolvedValue([]);

    const {container} = render(<AnnuaireMemberEvents aenId={99} aenLibelle="Autre asso" locale="fr" />);

    await waitFor(() => {
      const emptyState = container.querySelector('.member-events__empty');
      expect(emptyState).toBeInTheDocument();
    });
    // Spec L91 : même sans événement, le lien vers l'agenda filtré sur l'organisateur reste là.
    expect(screen.getByRole('link', {name: /all_events_of/})).toHaveAttribute('href', '/fr/evenements?orgas=99');
  });
});
