import { describe, expect, test } from 'bun:test'
import { objectGroupBy } from '../objectGroupBy'

describe('objectGroupBy', () => {
  test('groups items by key', () => {
    const result = objectGroupBy([1, 2, 3, 4], n =>
      n % 2 === 0 ? 'even' : 'odd',
    )
    expect(result.even).toEqual([2, 4])
    expect(result.odd).toEqual([1, 3])
  })

  test('returns empty object for empty input', () => {
    const result = objectGroupBy([], () => 'key')
    expect(Object.keys(result)).toHaveLength(0)
  })

  test('handles single group', () => {
    const result = objectGroupBy(['a', 'b', 'c'], () => 'all')
    expect(result.all).toEqual(['a', 'b', 'c'])
  })

  test('passes index to keySelector', () => {
    const result = objectGroupBy(['a', 'b', 'c', 'd'], (_, i) =>
      i < 2 ? 'first' : 'second',
    )
    expect(result.first).toEqual(['a', 'b'])
    expect(result.second).toEqual(['c', 'd'])
  })

  test('works with objects', () => {
    const items = [
      { name: 'Alice', role: 'admin' },
      { name: 'Bob', role: 'user' },
      { name: 'Charlie', role: 'admin' },
    ]
    const result = objectGroupBy(items, item => item.role)
    expect(result.admin).toHaveLength(2)
    expect(result.user).toHaveLength(1)
  })

  test('handles key function returning undefined', () => {
    const result = objectGroupBy([1, 2, 3], () => undefined as any)
    expect(result['undefined']).toEqual([1, 2, 3])
  })

  test('handles keys with special characters', () => {
    const result = objectGroupBy(
      [{ key: 'a/b' }, { key: 'a.b' }, { key: 'a/b' }],
      item => item.key,
    )
    expect(result['a/b']).toHaveLength(2)
    expect(result['a.b']).toHaveLength(1)
  })
})
