import { computeJoinWindow } from './join-window.util';

describe('computeJoinWindow', () => {
  const startsAt = '2026-01-01T10:00:00.000Z';
  const endsAt = '2026-01-01T11:00:00.000Z';

  it('is unbounded when there is no start time', () => {
    const window = computeJoinWindow({
      startsAt: null,
      defaultOpensBeforeMinutes: 10,
    });
    expect(window).toEqual({ opensAt: null, closesAt: null, isOpen: true });
  });

  it('has no upper bound when there is no scheduled end', () => {
    const window = computeJoinWindow({
      startsAt,
      defaultOpensBeforeMinutes: 10,
      closeBufferMinutes: 10,
      now: new Date('2099-01-01T00:00:00.000Z'),
    });
    expect(window.closesAt).toBeNull();
    expect(window.isOpen).toBe(true);
  });

  it('extends closesAt by closeBufferMinutes past the scheduled end', () => {
    const window = computeJoinWindow({
      startsAt,
      endsAt,
      defaultOpensBeforeMinutes: 10,
      closeBufferMinutes: 10,
      now: new Date('2026-01-01T11:05:00.000Z'), // after endsAt, within the buffer
    });
    expect(window.closesAt).toEqual(new Date('2026-01-01T11:10:00.000Z'));
    expect(window.isOpen).toBe(true);
  });

  it('is closed once now is past the buffered close time', () => {
    const window = computeJoinWindow({
      startsAt,
      endsAt,
      defaultOpensBeforeMinutes: 10,
      closeBufferMinutes: 10,
      now: new Date('2026-01-01T11:11:00.000Z'), // past endsAt + 10-minute buffer
    });
    expect(window.isOpen).toBe(false);
  });

  it('defaults closeBufferMinutes to 0 when omitted (no behavior change for existing callers)', () => {
    const window = computeJoinWindow({
      startsAt,
      endsAt,
      defaultOpensBeforeMinutes: 10,
      now: new Date('2026-01-01T11:00:00.000Z'),
    });
    expect(window.closesAt).toEqual(new Date(endsAt));
  });

  it('opens joinOpensMinutesBefore minutes before start, falling back to defaultOpensBeforeMinutes', () => {
    const window = computeJoinWindow({
      startsAt,
      endsAt,
      joinOpensMinutesBefore: 5,
      defaultOpensBeforeMinutes: 15,
    });
    expect(window.opensAt).toEqual(new Date('2026-01-01T09:55:00.000Z'));
  });
});
