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

jest.mock('@/contexts/AuthContext', () => ({
  useAuth: () => ({isAuthenticated: true, loading: false, user: {id: '7', username: 'me'}, logout: jest.fn()}),
}));
jest.mock('next/link', () => ({
  __esModule: true,
  default: ({children, href}: {children: React.ReactNode; href: string}) => <a href={href}>{children}</a>,
}));
jest.mock('@/components/community/AvatarUpload', () => ({__esModule: true, default: () => <div data-testid="avatar" />}));
jest.mock('@/services/userService', () => ({
  getUserProfile: jest.fn().mockResolvedValue({id: '7', username: 'me', email: 'me@example.com', firstName: 'Yann', lastName: 'Le Bras'}),
  updateUserProfile: jest.fn(),
  changePassword: jest.fn(),
  changeEmail: jest.fn(),
  confirmEmailChange: jest.fn(),
  getPublicProfile: jest.fn().mockResolvedValue({
    id: 7, pseudo: 'me', prenom: 'Yann', patronyme: 'Le Bras', avatarUrl: null, favoris: [], participations: [],
    commentaires: [{id: 1, texte: 'Mon commentaire', date: '2026-09-12', heure: '10:00', evenement: null}],
    annonces: [],
    covoiturages: [],
  }),
}));
jest.mock('@/services/favoriteService', () => ({getFavorites: jest.fn().mockResolvedValue([]), removeApiFavorite: jest.fn()}));
jest.mock('@/services/participationService', () => ({getMyParticipations: jest.fn().mockResolvedValue([])}));
jest.mock('@/services/notificationService', () => ({
  getNotificationPreferences: jest.fn().mockResolvedValue({alertesActivees: true, newsletter: false}),
  updatePreferences: jest.fn().mockResolvedValue({alertesActivees: true, newsletter: true}),
}));

import ProfilePage from '../page';
import {getPublicProfile} from '@/services/userService';
import {updatePreferences} from '@/services/notificationService';

describe('ProfilePage — paramètres et activité (spec L183-L186)', () => {
  beforeEach(() => {
    jest.clearAllMocks();
  });

  it('shouldLoadTheNotificationSettingsFromTheApi', async () => {
    render(<ProfilePage />);

    const alertes = await screen.findByRole('switch', {name: 'receive_alerts_label'});
    const newsletter = screen.getByRole('switch', {name: 'receive_newsletter_label'});
    await waitFor(() => expect(alertes).toBeChecked());
    expect(newsletter).not.toBeChecked();
  });

  it('shouldSaveTheNewsletterChoice', async () => {
    const user = userEvent.setup();
    render(<ProfilePage />);
    const newsletter = await screen.findByRole('switch', {name: 'receive_newsletter_label'});

    await user.click(newsletter);

    await waitFor(() => expect(updatePreferences).toHaveBeenCalledWith({newsletter: true}));
    expect(newsletter).toBeChecked();
  });

  it('shouldShowMyOwnActivityInItsTab', async () => {
    const user = userEvent.setup();
    render(<ProfilePage />);
    await screen.findByRole('switch', {name: 'receive_alerts_label'});

    await user.click(screen.getByRole('tab', {name: /tab_activity/}));

    await waitFor(() => expect(getPublicProfile).toHaveBeenCalledWith(7));
    expect(await screen.findByText('Mon commentaire')).toBeInTheDocument();
  });
});
