import { IScheduleSettings, SpecialDaysSchedule } from '@core/types'
import { nextMonday, subYears } from 'date-fns'
import { getDaySchedule } from './schedule'
describe('Schedule Utils', () => {
	describe('getDaySchedule method', () => {
		it('should return default 24 hours rule when schedule settings are undefined', () => {
			const date = new Date()
			const { rules, closed } = getDaySchedule(date)
			const expectedRules = [{ openingTime: { hours: 0, minutes: 0 }, closingTime: { hours: 24, minutes: 0 } }]
			expect(closed).toBe(false)
			expect(rules).toEqual(expectedRules)
		})
		it('should return week day rule', () => {
			const date = nextMonday(new Date())
			const expectedRules = [{ openingTime: { hours: 15, minutes: 0 }, closingTime: { hours: 20, minutes: 0 } }]
			const settings = {
				weeklySchedule: { Monday: { closed: false, rules: expectedRules } },
				specialDays: [] as SpecialDaysSchedule,
			} as IScheduleSettings
			const { closed, rules } = getDaySchedule(date, settings)
			expect(closed).toBe(false)
			expect(rules).toEqual(expectedRules)
		})
		it('should return special day rules if special day matches', () => {
			const date = nextMonday(new Date())
			const expectedRules = [{ openingTime: { hours: 15, minutes: 0 }, closingTime: { hours: 20, minutes: 0 } }]
			const settings = {
				weeklySchedule: {
					Monday: {
						closed: false,
						rules: [{ openingTime: { hours: 5, minutes: 0 }, closingTime: { hours: 10, minutes: 0 } }],
					},
				},
				specialDays: [{ date, closed: true, rules: expectedRules }],
			} as IScheduleSettings
			const { closed, rules } = getDaySchedule(date, settings)
			expect(closed).toBe(true)
			expect(rules).toEqual(expectedRules)
		})
		it('should return special day rules if recurruing rule for previous year matches', () => {
			const date = nextMonday(new Date())
			const expectedRules = [{ openingTime: { hours: 15, minutes: 0 }, closingTime: { hours: 20, minutes: 0 } }]
			const settings = {
				weeklySchedule: {
					Monday: {
						closed: false,
						rules: [{ openingTime: { hours: 5, minutes: 0 }, closingTime: { hours: 10, minutes: 0 } }],
					},
				},
				specialDays: [{ date: subYears(date, 2), closed: true, recurring: true, rules: expectedRules }],
			} as IScheduleSettings
			const { closed, rules } = getDaySchedule(date, settings)
			expect(closed).toBe(true)
			expect(rules).toEqual(expectedRules)
		})
	})
})
