import React from 'react';
import { render, screen, waitFor } from '@testing-library/react';
import '@testing-library/jest-dom';
import ConfirmationPage from '../page';

jest.mock('next-intl', () => ({
  useTranslations: () => (key: string) => {
    const t: Record<string, string> = {
      confirmation_title: 'Merci pour votre adhésion !',
      confirmation_email: 'Un email de confirmation vous sera envoyé.',
      confirmation_card: 'Votre carte adhérent vous sera envoyée prochainement.',
      failure_title: "Le paiement n'a pas abouti",
      failure_retry: 'Réessayer',
      loading: 'Chargement...',
    };
    return t[key] || key;
  },
}));

const mockGetPaymentResult = jest.fn();
jest.mock('@/services/adhesionService', () => ({
  getPaymentResult: (...args: unknown[]) => mockGetPaymentResult(...args),
}));

jest.mock('next/navigation', () => ({
  useSearchParams: () => new URLSearchParams('paylinetoken=TOKEN_123'),
  useRouter: () => ({ push: jest.fn() }),
}));

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

  it('shouldFetchPaymentResultOnLoad', async () => {
    mockGetPaymentResult.mockResolvedValueOnce({
      success: true, status: 'PAID', firstName: 'Jean', lastName: 'Dupont',
      amount: 1000, type: 'particulier', wantsMemberCard: false,
    });

    render(<ConfirmationPage />);

    await waitFor(() => {
      expect(mockGetPaymentResult).toHaveBeenCalledWith('TOKEN_123');
    });
  });

  it('shouldDisplaySuccessMessage', async () => {
    mockGetPaymentResult.mockResolvedValueOnce({
      success: true, status: 'PAID', firstName: 'Jean', lastName: 'Dupont',
      amount: 1000, type: 'particulier', wantsMemberCard: true,
    });

    render(<ConfirmationPage />);

    await waitFor(() => {
      expect(screen.getByText('Merci pour votre adhésion !')).toBeInTheDocument();
    });
    expect(screen.getByText(/Jean Dupont/)).toBeInTheDocument();
    expect(screen.getByText(/Votre carte adhérent/)).toBeInTheDocument();
  });

  it('shouldDisplayErrorOnFailedPayment', async () => {
    mockGetPaymentResult.mockResolvedValueOnce({
      success: false, status: 'FAILED', firstName: 'Jean', lastName: 'Dupont',
      amount: 1000, type: 'particulier', wantsMemberCard: false,
    });

    render(<ConfirmationPage />);

    await waitFor(() => {
      expect(screen.getByText("Le paiement n'a pas abouti")).toBeInTheDocument();
    });
    expect(screen.getByText('Réessayer')).toBeInTheDocument();
  });
});
