import Item from './item';

import { isAvailableNow, isItemAvailable } from '.';

const noExceptionsAvailability = { weekly: [] };
const emptyAvailability = {
  weekly: [],
  exceptions: [],
};
const alwaysAvailable = {
  weekly: [{ minuteOfWeek: 0, durationMins: 1440 * 7 }],
  exceptions: [],
};
const regularItem: Item = {
  condition: {
    conditions: [
      {},
      {},
      {},
      {
        type: 'n/a',
        availability: {
          weekly: [
            { minuteOfWeek: 0, durationMins: 120 },
            { minuteOfWeek: 1440, durationMins: 60 },
            { minuteOfWeek: 1600, durationMins: 120 },
          ],
          exceptions: [
            {
              start: {
                year: 2022,
                month: 12,
                day: 20,
                hour: 0,
                minute: 0,
              },
              end: {
                year: 2023,
                month: 1,
                day: 1,
                hour: 0,
                minute: 0,
              },
              available: true,
            },
            {
              start: {
                year: 2023,
                month: 1,
                day: 1,
                hour: 0,
                minute: 0,
              },
              end: {
                year: 2023,
                month: 1,
                day: 10,
                hour: 0,
                minute: 0,
              },
              available: false,
            },
          ],
        },
      },
    ],
  },
};

test('Item without exceptions and empty weekly availability is available', () => {
  expect(isAvailableNow(noExceptionsAvailability)).toBeTruthy();
});

test('Always available item is available now', () => {
  expect(isAvailableNow(alwaysAvailable)).toBeTruthy();
});

test('Item with empty availability is available now', () => {
  expect(isAvailableNow(emptyAvailability)).toBeTruthy();
});

test('Item available without exceptions', () => {
  expect(isItemAvailable(regularItem, new Date(2022, 4, 15, 1))).toBeTruthy();
});

test('Item unavailable without exceptions between weekly groups', () => {
  expect(isItemAvailable(regularItem, new Date(2022, 4, 19, 4))).toBeFalsy();
});

test('Item unavailable without exceptions after weekly groups', () => {
  expect(isItemAvailable(regularItem, new Date(2022, 4, 21, 0))).toBeFalsy();
});

test('Item unavailable but overwritten by exception', () => {
  expect(isItemAvailable(regularItem, new Date(2022, 11, 31, 2))).toBeTruthy();
});

test('Item available but overwritten by exception', () => {
  expect(isItemAvailable(regularItem, new Date(2023, 0, 1, 1))).toBeFalsy();
});

test('Item unavailable with and without exception', () => {
  expect(isItemAvailable(regularItem, new Date(2023, 0, 1, 4))).toBeFalsy();
});

test('Item available with and without exception', () => {
  expect(isItemAvailable(regularItem, new Date(2022, 11, 25, 1))).toBeTruthy();
});

test('Item without an availability object', () => {
  expect(isItemAvailable({}, new Date())).toBeTruthy();
});
