import { createEvents, createEvent, EventStatus } from 'ics' import { Booking, BookingStatus} from '@prisma/client'; import { getBaseURL } from './url' import { dateFormatFrontend, getDayCount } from './date' function convertDay(value: string): [number, number, number] { const parts = value.split('-') if (parts.length !== 3) { throw new Error('faile converting day') } return [Number(parts[0]), Number(parts[1]), Number(parts[2])] } export function generateCalendarEntry(booking: Booking): string { const { error, value } = createEvent({ productId: 'app.vercel.pfadi-bussle/ics', title: `Pfadi-Bussle Buchung`, start: convertDay(booking.startDate), startOutputType: 'local', duration: { days: getDayCount(booking) }, location: 'Mömpelgardgasse 25, 72348 Rosenfeld, Deutschland', geo: { lat: 48.287044, lon: 8.726361 }, description: `Gebucht auf ${booking.name} Buchungs-Link: ${getBaseURL()}/bookings/${booking.uuid} `, status: booking.status === BookingStatus.CONFIRMED ? ('CONFIRMED' as EventStatus) : ('TENTATIVE' as EventStatus), }) if (error) { throw error } return value } export function generateBookedCalendar(bookings: Booking[]): string { const events = bookings.map( ( booking ): { productId: string calName: string start: [number, number, number] startOutputType: 'local' | 'utc' duration: { days: number } title: string description: string status: EventStatus } => ({ productId: 'app.vercel.pfadi-bussle/ics', calName: 'Pfadi-Bussle Buchungen', start: convertDay(booking.startDate), startOutputType: 'local', duration: { days: getDayCount(booking) }, title: `Buchung ${booking.name}`, description: `Name: ${booking.name} Zeitraum: ${dateFormatFrontend(new Date(booking.startDate))}-${dateFormatFrontend(new Date(booking.endDate))} Email: ${booking.email} Telefon: ${booking.phone} Link: ${getBaseURL()}/admin/bookings/${booking.uuid} `, status: booking.status === BookingStatus.CONFIRMED ? ('CONFIRMED' as EventStatus) : ('TENTATIVE' as EventStatus), }) ) const { error, value } = createEvents(events) if (error) { throw error } return value }