import { describe, expect, it } from 'vitest'
import {
  RETENTION_MS,
  clampSignedUrlTtlSeconds,
  expiryState,
  sourceExpiresAt,
  sourceExpiryFromAcceptedAt,
  zipExpiresAt,
} from '../src/index.js'

describe('exact 48-hour deadlines', () => {
  const acceptedAt = new Date('2026-03-28T23:30:00.000Z')

  it('uses elapsed hours, independent of calendar or DST boundaries', () => {
    const expected = new Date(acceptedAt.getTime() + 172_800_000)
    expect(RETENTION_MS).toBe(172_800_000)
    expect(sourceExpiresAt(acceptedAt)).toEqual(expected)
    expect(sourceExpiryFromAcceptedAt(acceptedAt)).toEqual(expected)
    expect(zipExpiresAt(acceptedAt)).toEqual(expected)
    expect(acceptedAt.toISOString()).toBe('2026-03-28T23:30:00.000Z')
  })

  it('treats the exact deadline as expired', () => {
    const deadline = sourceExpiresAt(acceptedAt)
    expect(expiryState(deadline, new Date(deadline.getTime() - 1))).toBe('available')
    expect(expiryState(deadline, deadline)).toBe('expired')
  })

  it('clamps signed URL TTL to whole seconds before ZIP expiry', () => {
    const now = new Date('2026-01-01T00:00:00.500Z')
    const deadline = new Date('2026-01-01T00:00:05.499Z')
    expect(clampSignedUrlTtlSeconds(60, deadline, now)).toBe(4)
    expect(clampSignedUrlTtlSeconds(2, deadline, now)).toBe(2)
    expect(clampSignedUrlTtlSeconds(60, deadline, deadline)).toBe(0)
  })
})
