import { beforeEach, describe, expect, test } from 'vitest'
import { useRRuleLabel } from '@/stores/rrules'
import { useI18n } from '@/i18n'

describe('rrules', () => {
  describe('useRRuleLabel', () => {
    beforeEach(() => {
      const { locale } = useI18n()
      locale.value = 'en'
    })

    test('Returns the rrule string as title attribute', () => {
      const { attrs } = useRRuleLabel({ freq: 1, interval: 1, byWeekdays: [2] })
      expect(attrs.value?.title).toBe('RRULE:FREQ=MONTHLY;BYDAY=WE;INTERVAL=1')
    })

    test('Returns a natural language representation as the label', () => {
      expect(useRRuleLabel({ freq: 0, count: 1 }).label.value).toBe('once')
      expect(useRRuleLabel({ freq: 3, interval: 1 }).label.value).toBe('every day')
      expect(useRRuleLabel({ freq: 2, interval: 1, byWeekdays: [0, 1, 2, 3, 4] }).label.value).toBe(
        'every week on business days',
      )
      expect(useRRuleLabel({ freq: 2, interval: 1, byWeekdays: [0] }).label.value).toBe(
        'every week on Monday',
      )
      expect(useRRuleLabel({ freq: 2, interval: 2, byWeekdays: [0] }).label.value).toBe(
        'every 2 weeks on Monday',
      )
      expect(useRRuleLabel({ freq: 2, interval: 4, byWeekdays: [0] }).label.value).toBe(
        'every 4 weeks on Monday',
      )
      expect(
        useRRuleLabel({ freq: 1, interval: 1, bySetPos: 1, byWeekdays: [0] }).label.value,
      ).toBe('every month on the first Monday')
      expect(
        useRRuleLabel({ freq: 1, interval: 1, bySetPos: 2, byWeekdays: [0] }).label.value,
      ).toBe('every month on the second Monday')
      expect(
        useRRuleLabel({ freq: 1, interval: 1, bySetPos: 3, byWeekdays: [0] }).label.value,
      ).toBe('every month on the third Monday')
      expect(
        useRRuleLabel({ freq: 1, interval: 1, bySetPos: 4, byWeekdays: [0] }).label.value,
      ).toBe('every month on the fourth Monday')
      expect(
        useRRuleLabel({ freq: 1, interval: 1, bySetPos: 5, byWeekdays: [0] }).label.value,
      ).toBe('every month on the fifth Monday')
      expect(
        useRRuleLabel({ freq: 1, interval: 1, bySetPos: -1, byWeekdays: [0] }).label.value,
      ).toBe('every month on the last Monday')
      expect(
        useRRuleLabel({ freq: 1, interval: 2, bySetPos: 5, byWeekdays: [0] }).label.value,
      ).toBe('every 2 months on the fifth Monday')
      expect(
        useRRuleLabel({ freq: 1, interval: 2, bySetPos: 5, byWeekdays: [0, 1, 2, 3, 4] }).label
          .value,
      ).toBe('every 2 months on the fifth business day')
      expect(
        useRRuleLabel({ freq: 1, interval: 2, bySetPos: 5, byWeekdays: [3, 4] }).label.value,
      ).toBe('every 2 months on the fifth Thursday')
      expect(
        useRRuleLabel({ freq: 1, interval: 2, bySetPos: -1, byWeekdays: [3, 4] }).label.value,
      ).toBe('every 2 months on the last Friday')
      expect(useRRuleLabel({ freq: 2, interval: 1, byWeekdays: [0, 1, 2, 3, 4] }).label.value).toBe(
        'every week on business days',
      )
      expect(useRRuleLabel({ freq: 2, interval: 1, byWeekdays: [5, 6] }).label.value).toBe(
        'every week on Saturday, and Sunday',
      )
    })
  })
})