import { afterEach, describe, expect, it } from 'vitest'

import {
  setReservationTimeZoneProvider,
} from '@/config/reservationConfig'
import {
  formatReservationDateRange,
  formatReservationDateTime,
} from '@/utils/reservationFormat'

describe('reservationFormat', () => {
  afterEach(() => {
    setReservationTimeZoneProvider(null)
  })

  it('formats UTC API timestamps in the default hotel time zone', () => {
    expect(formatReservationDateTime('2026-07-09T05:56:56Z')).toBe('2026-07-09 12:56:56')
  })

  it('formats timestamps in the selected hotel time zone', () => {
    setReservationTimeZoneProvider(() => 'Asia/Tokyo')

    expect(formatReservationDateTime('2026-07-09T05:56:56Z')).toBe('2026-07-09 14:56:56')
  })

  it('honors offsets from source timestamps before converting to hotel time', () => {
    expect(formatReservationDateTime('2026-07-08T09:18:00+08:00')).toBe('2026-07-08 08:18:00')
  })

  it('falls back to the default hotel time zone when the selected hotel timezone is invalid', () => {
    setReservationTimeZoneProvider(() => 'Invalid/Timezone')

    expect(formatReservationDateTime('2026-07-09T05:56:56Z')).toBe('2026-07-09 12:56:56')
  })

  it('falls back safely for empty or invalid timestamps', () => {
    expect(formatReservationDateTime(null)).toBe('-')
    expect(formatReservationDateTime(undefined)).toBe('-')
    expect(formatReservationDateTime('not-a-date')).toBe('not-a-date')
  })

  it('keeps hotel business date ranges as local dates without timezone conversion', () => {
    expect(formatReservationDateRange('2026-07-09', '2026-07-10')).toBe('2026-07-09 / 2026-07-10')
  })
})
