import React from 'react';
import {render, screen} from '@testing-library/react';

jest.mock('@/i18n', () => jest.fn().mockResolvedValue({messages: {DomainePage: {title: 'Accueil {domaine}', see_all: "Tout l'agenda {domaine}", upcoming_title: 'Prochains événements {domaine}'}}}));
jest.mock('@/services/domaineService', () => ({getDomaines: jest.fn()}));
jest.mock('next/navigation', () => ({notFound: jest.fn(() => { throw new Error('NEXT_NOT_FOUND'); })}));
jest.mock('next/link', () => ({__esModule: true, default: ({children, href, ...rest}: {children: React.ReactNode; href: string}) => <a href={href} {...rest}>{children}</a>}));
jest.mock('@/components/Homepage/HeroSection', () => ({__esModule: true, default: ({domaineId}: {domaineId?: number}) => <div data-testid="hero" data-domaine={domaineId} />}));
jest.mock('@/components/Homepage/UpcomingEventsSection', () => ({
  __esModule: true,
  default: ({domaineId, seeAllHref, title}: {domaineId?: number; seeAllHref?: string; title?: string}) => <div data-testid="upcoming" data-domaine={domaineId} data-href={seeAllHref} data-title={title} />,
}));
jest.mock('@/components/Homepage/MapSection', () => ({__esModule: true, default: () => <div data-testid="map" />}));
jest.mock('@/components/Homepage/MagSection', () => ({__esModule: true, default: () => <div data-testid="mag" />}));
jest.mock('@/components/Homepage/CommunitySection', () => ({__esModule: true, default: () => <div data-testid="community" />}));

import Page, {generateMetadata} from '../page';
import {getDomaines} from '@/services/domaineService';

const domaines = [{dprId: 1, dprNom: 'Danse'}, {dprId: 2, dprNom: 'Musique'}];
const props = (dprId: string) => ({params: Promise.resolve({locale: 'fr', dprId})});

describe('Accueil de domaine (spec L77)', () => {
  beforeEach(() => {
    jest.clearAllMocks();
    (getDomaines as jest.Mock).mockResolvedValue(domaines);
  });

  it('shouldFilterTheHomeSectionsOnTheDomain', async () => {
    render(await Page(props('2')));

    expect(screen.getByRole('heading', {level: 1})).toHaveTextContent('Accueil Musique');
    expect(screen.getByRole('link', {name: /Tout l'agenda Musique/})).toHaveAttribute('href', '/fr/evenements?tev=2');
    expect(screen.getByTestId('hero')).toHaveAttribute('data-domaine', '2');
    const upcoming = screen.getByTestId('upcoming');
    expect(upcoming).toHaveAttribute('data-domaine', '2');
    expect(upcoming).toHaveAttribute('data-href', '/fr/evenements?tev=2');
    expect(upcoming).toHaveAttribute('data-title', 'Prochains événements Musique');
    expect(screen.getByTestId('map')).toBeInTheDocument();
  });

  it('shouldAnswer404ForAnUnknownDomain', async () => {
    await expect(Page(props('99'))).rejects.toThrow('NEXT_NOT_FOUND');
  });

  it('shouldTitleTheDocumentAfterTheDomain', async () => {
    expect((await generateMetadata(props('1'))).title).toContain('Danse');
  });
});
