// @vitest-environment happy-dom

import { makeTestLogger } from '@learnitive/test-utils';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { getGithubUrl } from '../github-bug-url';
import { throwAppError } from '../throw-app-error';

describe('getGithubUrl', () => {
  let logger = makeTestLogger().logger;

  beforeEach(() => {
    vi.clearAllMocks();
    ({ logger } = makeTestLogger());
  });

  it('should generate a local support URL with error details', () => {
    const error = new Error('Test error');
    error.stack = 'Error stack trace';

    const url = getGithubUrl(error, logger);

    const parsed = new URL(url, 'https://www.learnitive.com');
    const body = decodeURIComponent(parsed.hash.replace('#error-report=', ''));
    expect(parsed.pathname).toBe('/support.html');
    expect(body).toContain('Details');
    expect(body).toContain('Test error');
  });

  it('should include app error', () => {
    let error: Error | undefined;

    try {
      throwAppError('error::ws-path:invalid-ws-path', 'Test error message', {
        invalidPath: 'test-path',
      });
    } catch (e) {
      if (e instanceof Error) {
        error = e;
      }
    }

    if (!error) {
      throw new Error('Failed to throw app error');
    }

    const url = getGithubUrl(error, logger);
    const parsed = new URL(url, 'https://www.learnitive.com');
    const body = decodeURIComponent(parsed.hash.replace('#error-report=', ''));
    expect(body).toContain('BaseError: Test error');
    expect(body).toContain('Test error message');
    expect(body).toContain('test-path');
  });
});
