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

jest.mock('next-intl', () => ({
  useTranslations: () => (key: string, values?: Record<string, unknown>) => `${key} ${values?.count}`,
}));
jest.mock('@/services/visiteService', () => ({
  hitVisite: jest.fn(),
}));

import VisitCounter from '../VisitCounter';
import {hitVisite} from '@/services/visiteService';

const mockedHitVisite = hitVisite as jest.Mock;

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

  it('shouldCountTheVisitOnceAndShowTheTotal', async () => {
    mockedHitVisite.mockResolvedValue(12);

    render(
      <React.StrictMode>
        <VisitCounter tableCible="annuaire_entree" cibleId={42} />
      </React.StrictMode>
    );

    expect(await screen.findByTestId('visit-counter')).toHaveTextContent('visits_count 12');
    await waitFor(() => expect(mockedHitVisite).toHaveBeenCalledTimes(1));
    expect(mockedHitVisite).toHaveBeenCalledWith('annuaire_entree', 42);
  });

  it('shouldRenderNothingWhileTheTotalIsUnknown', () => {
    mockedHitVisite.mockReturnValue(new Promise(() => {}));

    const {container} = render(<VisitCounter tableCible="annuaire_entree" cibleId={42} />);

    expect(container).toBeEmptyDOMElement();
  });

  it('shouldRenderNothingWhenTheCounterFails', async () => {
    mockedHitVisite.mockResolvedValue(null);

    const {container} = render(<VisitCounter tableCible="annuaire_entree" cibleId={42} />);

    await waitFor(() => expect(mockedHitVisite).toHaveBeenCalled());
    expect(container).toBeEmptyDOMElement();
  });
});
