import { act, renderHook } from '@testing-library/react';
import { describe, expect, it } from 'vitest';

import { useErrorMessage } from './useErrorMessage';

describe('useErrorMessage', () => {
  it('starts with null error', () => {
    const { result } = renderHook(() => useErrorMessage());
    expect(result.current.error).toBeNull();
  });

  it('accepts initial error', () => {
    const { result } = renderHook(() => useErrorMessage('initial error'));
    expect(result.current.error).toBeTruthy();
  });

  it('normalizes network errors', () => {
    const { result } = renderHook(() => useErrorMessage());
    act(() => result.current.setError('network'));
    expect(result.current.error).toContain('internet connection');
  });

  it('normalizes 500 server errors', () => {
    const { result } = renderHook(() => useErrorMessage());
    act(() => result.current.setError('500'));
    expect(result.current.error).toContain('went wrong on our end');
  });

  it('normalizes 403 forbidden', () => {
    const { result } = renderHook(() => useErrorMessage());
    act(() => result.current.setError('403'));
    expect(result.current.error).toContain('permission');
  });

  it('normalizes 404 not found', () => {
    const { result } = renderHook(() => useErrorMessage());
    act(() => result.current.setError('not found'));
    expect(result.current.error).toContain('could not be found');
  });

  it('normalizes 429 rate limit', () => {
    const { result } = renderHook(() => useErrorMessage());
    act(() => result.current.setError('rate limit'));
    expect(result.current.error).toContain('Too many requests');
  });

  it('passes through unrecognized messages', () => {
    const { result } = renderHook(() => useErrorMessage());
    act(() => result.current.setError('Custom specific error message'));
    expect(result.current.error).toBe('Custom specific error message');
  });

  it('clears error', () => {
    const { result } = renderHook(() => useErrorMessage());
    act(() => result.current.setError('network'));
    act(() => result.current.clearError());
    expect(result.current.error).toBeNull();
  });
});
