import { getInitials, stringToGradient } from '@/utils/avatarUtils'

jest.mock('@linagora/twake-mui', () => ({
  nameToColor: jest.fn((name: string) => {
    if (!name) return undefined
    const colors = [
      'sunrise',
      'downy',
      'sugarCoral',
      'pinkBonnet',
      'blueMana',
      'nightBlue',
      'snowPea',
      'pluviophile',
      'cornflower',
      'paleGreen',
      'moonBlue'
    ]
    const hash = Array.from(name.toUpperCase())
      .map(letter => letter.charCodeAt(0))
      .reduce((sum, number) => sum + number, 0)
    return colors[hash % colors.length]
  })
}))

describe('avatarUtils', () => {
  describe('getInitials', () => {
    it('returns 2-letter initials for full name', () => {
      expect(getInitials('John Doe')).toBe('JD')
      expect(getInitials('Alice Smith')).toBe('AS')
      expect(getInitials('Nguyễn Văn')).toBe('NV')
    })

    it('returns single letter for single word', () => {
      expect(getInitials('Alice')).toBe('A')
      expect(getInitials('John')).toBe('J')
    })

    it('returns uppercase initials', () => {
      expect(getInitials('john doe')).toBe('JD')
      expect(getInitials('ALICE SMITH')).toBe('AS')
      expect(getInitials('a')).toBe('A')
    })

    it('handles multiple spaces between words', () => {
      expect(getInitials('John   Doe')).toBe('JD')
      expect(getInitials('Alice    Smith   Brown')).toBe('AS')
    })

    it('handles email addresses', () => {
      expect(getInitials('john.doe@email.com')).toBe('J')
      expect(getInitials('test@example.com')).toBe('T')
    })

    it('handles empty string', () => {
      expect(getInitials('')).toBe('')
    })

    it('handles whitespace-only string', () => {
      expect(getInitials('   ')).toBe('')
    })

    it('handles single character', () => {
      expect(getInitials('A')).toBe('A')
      expect(getInitials('a')).toBe('A')
    })

    it('handles names with special characters', () => {
      expect(getInitials('Jean-Pierre')).toBe('J')
      expect(getInitials('Mary Jane Watson')).toBe('MJ')
    })

    it('handles unicode characters', () => {
      expect(getInitials('Nguyễn Văn')).toBe('NV')
      expect(getInitials('José María')).toBe('JM')
    })

    it('takes first two words for names with more than two words', () => {
      expect(getInitials('John Michael Smith')).toBe('JM')
      expect(getInitials('Alice Bob Charlie')).toBe('AB')
    })
  })

  describe('stringToGradient', () => {
    it('returns color for valid string', () => {
      const result = stringToGradient('John Doe')
      expect(result).toBeDefined()
      expect(typeof result).toBe('string')
    })

    it('returns same color for same input', () => {
      const result1 = stringToGradient('John Doe')
      const result2 = stringToGradient('John Doe')
      expect(result1).toBe(result2)
    })

    it('returns undefined for empty string', () => {
      expect(stringToGradient('')).toBeUndefined()
    })

    it('returns color for single character', () => {
      const result = stringToGradient('A')
      expect(result).toBeDefined()
      expect(typeof result).toBe('string')
    })

    it('returns color for email address', () => {
      const result = stringToGradient('test@example.com')
      expect(result).toBeDefined()
      expect(typeof result).toBe('string')
    })
  })
})
