import { describe, it, expect, vi, beforeEach } from 'vitest';

vi.mock('@sentry/sveltekit', () => ({
	init: vi.fn(),
	handleErrorWithSentry: (fn: (args: unknown) => unknown) => fn,
	lastEventId: vi.fn(() => 'sentry-event-id-abc123')
}));

describe('hooks.client handleError', () => {
	beforeEach(() => {
		vi.resetModules();
	});

	it('returns Sentry lastEventId as errorId', async () => {
		const Sentry = await import('@sentry/sveltekit');
		vi.mocked(Sentry.lastEventId).mockReturnValue('sentry-event-id-abc123');

		const { handleError } = await import('./hooks.client');
		const result = (handleError as (args: unknown) => { message: string; errorId: string })({
			error: new Error('boom'),
			event: {},
			status: 500,
			message: 'Internal Error'
		});

		expect(result.errorId).toBe('sentry-event-id-abc123');
		expect(result.message).toBe('An unexpected error occurred');
	});

	it('falls back to crypto.randomUUID when lastEventId returns undefined', async () => {
		const Sentry = await import('@sentry/sveltekit');
		vi.mocked(Sentry.lastEventId).mockReturnValue(undefined);

		const { handleError } = await import('./hooks.client');
		const result = (handleError as (args: unknown) => { message: string; errorId: string })({
			error: new Error('boom'),
			event: {},
			status: 500,
			message: 'Internal Error'
		});

		expect(result.errorId).toMatch(
			/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/
		);
		expect(result.message).toBe('An unexpected error occurred');
	});
});
