import {
  formatCurrency,
  formatDate,
  formatDateRange,
  formatNumber,
  formatPercent,
  formatPhoneNumber,
  formatRelativeTime,
  preserveIdentifier,
} from '@/lib/localization/format';
import { describe, expect, it } from 'vitest';

const instant = new Date('2026-06-25T12:00:00.000Z');

describe('locale-aware formatting primitives', () => {
  it('formats Gregorian dates with explicit time zones', () => {
    expect(formatDate(instant, { locale: 'en', timeZone: 'UTC' })).toContain('2026');
    expect(formatDate(instant, { locale: 'fr', timeZone: 'UTC' })).toContain('2026');
    expect(formatDate(instant, { locale: 'ar', timeZone: 'UTC' })).toContain('2026');
  });

  it('formats ranges, numbers, percentages, and explicit currencies', () => {
    expect(
      formatDateRange(instant, new Date('2026-06-27T12:00:00.000Z'), {
        locale: 'en',
        timeZone: 'UTC',
      }),
    ).toContain('2026');
    expect(formatNumber(1234.5, 'fr')).toMatch(/1.*234/);
    expect(formatPercent(0.125, 'en')).toContain('12.5');
    expect(formatCurrency(125, 'en', 'USD')).toContain('$');
    expect(() => formatCurrency(125, 'en', 'usd')).toThrow(/ISO 4217/);
  });

  it('formats relative time and preserves atomic mixed-direction values', () => {
    expect(formatRelativeTime(-1, 'day', 'en')).toBe('yesterday');
    expect(formatPhoneNumber('+1 (202) 555-0100')).toBe('+12025550100');
    expect(preserveIdentifier('RES  2026  0042')).toBe('RES 2026 0042');
  });
});
