import { Calendar } from '@/features/Calendars/CalendarTypes'
import { buildDelegatedEventURL } from '@/features/Events/utils'

const makeCalendar = (link: string): Calendar =>
  ({
    id: 'user2/cal1',
    delegated: true,
    link,
    owner: { emails: ['owner@example.com'] }
  }) as Calendar

describe('buildDelegatedEventURL', () => {
  it('rebases event filename onto calendar link base path', () => {
    const calendar = makeCalendar('/calendars/user2/cal1.json')
    const eventURL = '/calendars/someother/path/event-abc.ics'
    expect(buildDelegatedEventURL(calendar, eventURL)).toBe(
      '/calendars/user2/cal1/event-abc.ics'
    )
  })

  it('strips .json suffix from calendar link', () => {
    const calendar = makeCalendar('/calendars/user2/cal1.json')
    const eventURL = '/calendars/user2/cal1/event-abc.ics'
    const result = buildDelegatedEventURL(calendar, eventURL)
    expect(result).not.toContain('.json')
  })

  it('preserves the exact filename from the event URL', () => {
    const calendar = makeCalendar('/calendars/user2/cal1.json')
    const eventURL = '/calendars/user2/cal1/some-uid-with-dashes.ics'
    expect(buildDelegatedEventURL(calendar, eventURL)).toBe(
      '/calendars/user2/cal1/some-uid-with-dashes.ics'
    )
  })

  it('throws when event URL has no filename', () => {
    const calendar = makeCalendar('/calendars/user2/cal1.json')
    const eventURL = ''
    expect(() => buildDelegatedEventURL(calendar, eventURL)).toThrow(
      /Cannot extract filename from event URL/
    )
  })

  it('works with nested calendar link paths', () => {
    const calendar = makeCalendar('/dav/calendars/users/user2/cal1.json')
    const eventURL = '/other/path/event-xyz.ics'
    expect(buildDelegatedEventURL(calendar, eventURL)).toBe(
      '/dav/calendars/users/user2/cal1/event-xyz.ics'
    )
  })
})
