/**
 * i18n PR3 - timezone helpers.
 *
 * Validates:
 *  1. Single-zone countries return one IANA string
 *  2. Multi-zone countries return >1 zones with the most-populous first
 *  3. primaryTimezoneFor returns the first entry
 *  4. isMultiZone correctly classifies a sample of single + multi countries
 *  5. listAllTimezones returns at least our bundled set
 *  6. formatTimezoneLabel renders an offset for known zones
 */

import { describe, it, expect } from 'vitest';
import {
  timezonesForCountry,
  primaryTimezoneFor,
  isMultiZone,
  listAllTimezones,
  formatTimezoneLabel,
} from '@/lib/i18n/timezones';

describe('i18n timezones', () => {
  it('single-zone countries map to one IANA zone', () => {
    expect(timezonesForCountry('PL')).toEqual(['Europe/Warsaw']);
    expect(timezonesForCountry('GB')).toEqual(['Europe/London']);
    expect(timezonesForCountry('JP')).toEqual(['Asia/Tokyo']);
    expect(timezonesForCountry('AE')).toEqual(['Asia/Dubai']);
  });

  it('multi-zone countries return ordered lists with the primary first', () => {
    const us = timezonesForCountry('US');
    expect(us[0]).toBe('America/New_York');
    expect(us.length).toBeGreaterThan(5);
    const ru = timezonesForCountry('RU');
    expect(ru[0]).toBe('Europe/Moscow');
    expect(ru.length).toBeGreaterThan(5);
  });

  it('primaryTimezoneFor returns the first entry or null', () => {
    expect(primaryTimezoneFor('FR')).toBe('Europe/Paris');
    expect(primaryTimezoneFor('US')).toBe('America/New_York');
    // 'AQ' is in our map; Antarctica/McMurdo
    expect(primaryTimezoneFor('AQ')).toBe('Antarctica/McMurdo');
  });

  it('isMultiZone discriminates correctly', () => {
    expect(isMultiZone('US')).toBe(true);
    expect(isMultiZone('RU')).toBe(true);
    expect(isMultiZone('AU')).toBe(true);
    expect(isMultiZone('PL')).toBe(false);
    expect(isMultiZone('JP')).toBe(false);
  });

  it('listAllTimezones returns at minimum the entries from the country map', () => {
    const all = listAllTimezones();
    expect(all.length).toBeGreaterThanOrEqual(200);
    expect(all).toContain('Europe/Warsaw');
    expect(all).toContain('America/New_York');
    expect(all).toContain('Asia/Tokyo');
  });

  it('formatTimezoneLabel includes an offset for known zones', () => {
    const label = formatTimezoneLabel('Europe/London');
    expect(label).toMatch(/Europe\/London/);
    expect(label).toMatch(/UTC|GMT/);
  });

  it('formatTimezoneLabel falls back to the bare zone for unknown input', () => {
    expect(formatTimezoneLabel('Not/A_Zone')).toBe('Not/A_Zone');
  });
});
