import { describe, it, expect, vi, beforeEach } from 'vitest';
import { onboardingService } from '@/features/onboarding/services/onboardingService';
import { api } from '@/shared/utils/api';

vi.mock('@/shared/utils/api', () => ({
  api: {
    get: vi.fn(),
    patch: vi.fn(),
    post: vi.fn(),
  },
}));

describe('onboardingService', () => {
  beforeEach(() => {
    vi.clearAllMocks();
  });

  it('fetches onboarding status', async () => {
    vi.mocked(api.get).mockResolvedValue({
      data: {
        persona: 'department_head',
        should_show_wizard: true,
        checklist: { completed: 1, total: 5, items: [] },
      },
    });

    const status = await onboardingService.getStatus();

    expect(status.persona).toBe('department_head');
    expect(status.should_show_wizard).toBe(true);
  });

  it('updates onboarding step', async () => {
    vi.mocked(api.patch).mockResolvedValue({
      data: { onboarding_step: 'invite', onboarding_completed_at: null },
    });

    const result = await onboardingService.updateStep('invite');

    expect(result.onboarding_step).toBe('invite');
    expect(api.patch).toHaveBeenCalledWith('/onboarding/step', { step: 'invite' });
  });

  it('dismisses tours', async () => {
    vi.mocked(api.post).mockResolvedValue({
      data: { dismissed_tours: ['dashboard'] },
    });

    const result = await onboardingService.dismissTour('dashboard');

    expect(result.dismissed_tours).toEqual(['dashboard']);
  });
});
