import { describe, expect, test } from 'vitest'
import { pickLocalized, recordDisplayName } from './locales'

describe('pickLocalized', () => {
  test('plain string возвращается as-is', () => {
    expect(pickLocalized('hello', 'ru-RU')).toBe('hello')
  })

  test('пустая string → undefined (caller покажет placeholder)', () => {
    expect(pickLocalized('', 'ru-RU')).toBeUndefined()
  })

  test('object с defaultLocale → значение defaultLocale', () => {
    expect(
      pickLocalized({ 'ru-RU': 'Канопус', 'en-US': 'Kanopus' }, 'ru-RU'),
    ).toBe('Канопус')
  })

  test('defaultLocale пустой → fallback на любой non-empty key', () => {
    expect(pickLocalized({ 'ru-RU': '', 'en-US': 'Kanopus' }, 'ru-RU')).toBe(
      'Kanopus',
    )
  })

  test('defaultLocale отсутствует → fallback на первый non-empty key', () => {
    expect(pickLocalized({ 'en-US': 'Kanopus' }, 'ru-RU')).toBe('Kanopus')
  })

  test('null / undefined / number → undefined', () => {
    expect(pickLocalized(null, 'ru-RU')).toBeUndefined()
    expect(pickLocalized(undefined, 'ru-RU')).toBeUndefined()
    expect(pickLocalized(42, 'ru-RU')).toBeUndefined()
  })

  test('объект без string значений → undefined', () => {
    expect(pickLocalized({ 'ru-RU': { nested: 'oops' } }, 'ru-RU')).toBeUndefined()
  })
})

describe('recordDisplayName', () => {
  test('localized name → строка локали', () => {
    expect(
      recordDisplayName({ name: { 'ru-RU': 'Канопус', 'en-US': 'Kanopus' } }, 'ru-RU'),
    ).toBe('Канопус')
  })

  test('plain name string', () => {
    expect(recordDisplayName({ name: 'Plain' }, 'ru-RU')).toBe('Plain')
  })

  test('нет name → fallback на code', () => {
    expect(recordDisplayName({ code: 'OPERATIONAL' }, 'ru-RU')).toBe('OPERATIONAL')
  })

  test('нет name+code → em-dash', () => {
    expect(recordDisplayName({ other: 'x' }, 'ru-RU')).toBe('—')
  })

  test('undefined data → em-dash', () => {
    expect(recordDisplayName(undefined, 'ru-RU')).toBe('—')
  })

  test('localized с empty default locale → fallback на code не происходит, берём другую локаль', () => {
    // Если name есть в other locale — оно приоритетнее code (name всегда нагляднее).
    expect(
      recordDisplayName({ name: { 'en-US': 'Eng only' }, code: 'X' }, 'ru-RU'),
    ).toBe('Eng only')
  })
})
