import React from 'react';
import {render, screen, waitFor} from '@testing-library/react';
import PartnerEventsSectionHomepage from '../PartnerEventsSectionHomepage';
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('PartnerEventsSectionHomepage', () => {
  beforeEach(() => {
    jest.clearAllMocks();
  });

  it('shouldFetchPartnerEventsWithEveTevFilter', async () => {
    mockedGetUpcomingEvents.mockResolvedValue([
      {
        eveId: 10,
        eveDate: '2026-04-01',
        eveHeure: '14h00',
        eveLibelle: 'Festival partenaire Brest',
        eveTev: {tevLibelle: 'Festival'},
        eveVil: {vilNom: 'Brest', vilCodepostal: '29200', vilGeoX: -4.48, vilGeoY: 48.39, vilGeoZoom: 12},
        evePla: null,
        aenOrganisateurs: []
      }
    ]);

    render(<PartnerEventsSectionHomepage locale="fr" />);

    await waitFor(() => {
      expect(screen.getByText('Festival partenaire Brest')).toBeInTheDocument();
    });

    expect(mockedGetUpcomingEvents).toHaveBeenCalledWith({eveTev: 5, itemsPerPage: 6});
  });

  it('shouldShowLoadingState', () => {
    mockedGetUpcomingEvents.mockImplementation(() => new Promise(() => {}));

    const {container} = render(<PartnerEventsSectionHomepage locale="fr" />);

    const loading = container.querySelector('.partner-events__loading');
    expect(loading).toBeInTheDocument();
  });
});
