import { afterEach, describe, expect, it } from 'vitest'
import { getUserLocale, resolveSessionLocale } from '../../../apps/zync-app/src/i18n'

function setLocalStorageValue(value: string | null) {
  const store = new Map<string, string>()
  if (value !== null) {
    store.set('zync_locale', value)
  }

  Object.defineProperty(globalThis, 'localStorage', {
    configurable: true,
    value: {
      getItem: (key: string) => store.get(key) ?? null,
      setItem: (key: string, next: string) => {
        store.set(key, next)
      },
      removeItem: (key: string) => {
        store.delete(key)
      },
    },
  })
}

function setNavigatorLanguage(language: string | undefined) {
  Object.defineProperty(globalThis, 'navigator', {
    configurable: true,
    value: language ? { language } : undefined,
  })
}

describe('system i18n locale resolution', () => {
  afterEach(() => {
    Reflect.deleteProperty(globalThis, 'localStorage')
    Reflect.deleteProperty(globalThis, 'navigator')
  })

  it('prefers localStorage before browser language', () => {
    setLocalStorageValue('he')
    setNavigatorLanguage('en-US')

    expect(getUserLocale()).toBe('he')
  })

  it('falls back to the browser language and then en', () => {
    setLocalStorageValue(null)
    setNavigatorLanguage('he-IL')
    expect(getUserLocale()).toBe('he')

    setNavigatorLanguage('fr-FR')
    expect(getUserLocale()).toBe('en')
  })

  it('prefers the user preference over the tenant default', () => {
    expect(resolveSessionLocale('he', 'en')).toBe('he')
    expect(resolveSessionLocale(null, 'he')).toBe('he')
    expect(resolveSessionLocale(null, null)).toBeNull()
  })
})
