import { describe, it, expect } from 'vitest';
import { evaluateOpeningStatus } from '@/lib/opening-hours';

const labels = {
  unknown: 'Unbekannt',
  currentlyClosed: 'Geschlossen',
  open247: 'Rund um die Uhr',
  unclear: 'Unklar',
  openNow: 'Geöffnet',
};

function dateAt(hour: number, minute = 0, weekday = 1) {
  // 2026-08-10 ist ein Montag
  const base = new Date('2026-08-10T00:00:00+02:00');
  base.setDate(base.getDate() + (weekday - 1));
  base.setHours(hour, minute, 0, 0);
  return base;
}

describe('evaluateOpeningStatus', () => {
  it('detects open inside regular hours', () => {
    const status = evaluateOpeningStatus('Mo-Su 11:00-22:00', dateAt(15), 'Europe/Berlin', labels);
    expect(status.isOpen).toBe(true);
    expect(status.label).toBe(labels.openNow);
  });

  it('detects closed outside regular hours', () => {
    const status = evaluateOpeningStatus('Mo-Su 11:00-22:00', dateAt(23), 'Europe/Berlin', labels);
    expect(status.isOpen).toBe(false);
    expect(status.label).toBe(labels.currentlyClosed);
  });

  it('recognizes 24/7', () => {
    const status = evaluateOpeningStatus('24/7', dateAt(3), 'Europe/Berlin', labels);
    expect(status.isOpen).toBe(true);
    expect(status.label).toBe(labels.open247);
  });

  it('recognizes closed/off', () => {
    const status = evaluateOpeningStatus('closed', dateAt(12), 'Europe/Berlin', labels);
    expect(status.isOpen).toBe(false);
    expect(status.label).toBe(labels.currentlyClosed);
  });

  it('returns unclear when no segment matches the current day', () => {
    const status = evaluateOpeningStatus('Mo-Fr 11:00-14:00', dateAt(12, 0, 6), 'Europe/Berlin', labels);
    expect(status.isOpen).toBeNull();
    expect(status.label).toBe(labels.unclear);
  });

  it('returns unknown for empty input', () => {
    const status = evaluateOpeningStatus(null, dateAt(12), 'Europe/Berlin', labels);
    expect(status.isOpen).toBeNull();
    expect(status.label).toBe(labels.unknown);
  });
});
