import type { Email } from "@/lib/email-data" import type { VideoConferenceProvider } from "@/lib/calendar-invitation" type DemoVcBrand = { provider: VideoConferenceProvider id: string brandLabel: string sender: string senderEmail: string summary: string location: string /** Heure de début (Europe/Paris) — 15 mai 2026 */ startHour: number startMinute?: number dateLabel: string read?: boolean } const DEMO_ORGANIZER = "demo.organisateur@ultimail.test" const DEMO_ATTENDEE = "moi@example.com" const BODY_STYLE = "font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 1.5; color: #202124;" function buildIcs(spec: { uid: string summary: string location: string startHour: number startMinute: number durationMinutes: number }): string { const pad = (n: number) => String(n).padStart(2, "0") const sh = spec.startHour const sm = spec.startMinute const endTotal = sh * 60 + sm + spec.durationMinutes const eh = Math.floor(endTotal / 60) % 24 const em = endTotal % 60 const start = `20260515T${pad(sh)}${pad(sm)}00` const end = `20260515T${pad(eh)}${pad(em)}00` return `BEGIN:VCALENDAR VERSION:2.0 CALSCALE:GREGORIAN METHOD:REQUEST BEGIN:VEVENT DTSTART;TZID=Europe/Paris:${start} DTEND;TZID=Europe/Paris:${end} DTSTAMP:20260514T120000Z ORGANIZER;CN=Demo Ultimail:MAILTO:${DEMO_ORGANIZER} UID:${spec.uid} ATTENDEE;CN=Moi:MAILTO:${DEMO_ATTENDEE} SUMMARY:${spec.summary} LOCATION:${spec.location} DESCRIPTION:Lien visio: ${spec.location} END:VEVENT END:VCALENDAR` } function buildDemoVcEmail(brand: DemoVcBrand): Email { const startMinute = brand.startMinute ?? 0 const ics = buildIcs({ uid: `vc-demo-${brand.provider}@ultimail.test`, summary: brand.summary, location: brand.location, startHour: brand.startHour, startMinute, durationMinutes: 45, }) const timeLabel = `${String(brand.startHour).padStart(2, "0")}:${String(startMinute).padStart(2, "0")}` const endHour = Math.floor((brand.startHour * 60 + startMinute + 45) / 60) % 24 const endMin = (brand.startHour * 60 + startMinute + 45) % 60 const endLabel = `${String(endHour).padStart(2, "0")}:${String(endMin).padStart(2, "0")}` return { id: brand.id, sender: brand.sender, senderEmail: brand.senderEmail, subject: `Invitation: ${brand.summary} - ven. 15 mai 2026 ${timeLabel} (Europe/Paris)`, preview: `Invitation ${brand.brandLabel} : ${brand.summary} — ven. 15 mai 2026 ${timeLabel} – ${endLabel}`, body: `

Vous êtes invité·e à une réunion ${brand.brandLabel}.

${brand.summary}
ven. 15 mai 2026 ${timeLabel} (Europe/Paris)

Rejoindre

`, date: brand.dateLabel, read: brand.read ?? false, starred: false, important: false, hasInvitation: true, hasAttachment: true, category: "primary", labels: ["inbox", "Démos visio"], calendarInvitation: { ics }, attachments: [ { name: `${brand.provider}-invite.ics`, kind: "other", sizeBytes: 2_800, inlineText: ics, }, ], } } const DEMO_BRANDS: DemoVcBrand[] = [ { provider: "meet", id: "vc-demo-meet", brandLabel: "Google Meet", sender: "Google Agenda", senderEmail: "calendar-notification@google.com", summary: "Point produit — Google Meet", location: "https://meet.google.com/ultimail-demo-meet", startHour: 9, dateLabel: "14 mai", }, { provider: "teams", id: "vc-demo-teams", brandLabel: "Microsoft Teams", sender: "Microsoft Teams", senderEmail: "noreply@teams.microsoft.com", summary: "Sprint review — Teams", location: "https://teams.microsoft.com/l/meetup-join/19%3ameeting_ultimail_demo", startHour: 10, dateLabel: "14 mai", }, { provider: "zoom", id: "vc-demo-zoom", brandLabel: "Zoom", sender: "Zoom", senderEmail: "no-reply@zoom.us", summary: "Stand-up équipe — Zoom", location: "https://zoom.us/j/98765432101?pwd=demo", startHour: 11, dateLabel: "14 mai", }, { provider: "skype", id: "vc-demo-skype", brandLabel: "Skype", sender: "Skype", senderEmail: "notifications@skype.com", summary: "Entretien client — Skype", location: "https://join.skype.com/invite/ultimailDemoSkype", startHour: 12, dateLabel: "14 mai", }, { provider: "jitsi", id: "vc-demo-jitsi", brandLabel: "Jitsi", sender: "Jitsi Meet", senderEmail: "noreply@jitsi.org", summary: "Atelier open source — Jitsi", location: "https://meet.jit.si/ultimail-demo-jitsi", startHour: 13, dateLabel: "14 mai", }, { provider: "whatsapp", id: "vc-demo-whatsapp", brandLabel: "WhatsApp", sender: "WhatsApp", senderEmail: "invite@whatsapp.com", summary: "Groupe projet — WhatsApp", location: "https://chat.whatsapp.com/InviteUltimailDemoWA", startHour: 14, dateLabel: "14 mai", }, { provider: "signal", id: "vc-demo-signal", brandLabel: "Signal", sender: "Signal", senderEmail: "noreply@signal.org", summary: "Comité confidentialité — Signal", location: "https://signal.group/#UltimailDemoSignalGroup", startHour: 15, dateLabel: "14 mai", }, { provider: "instagram", id: "vc-demo-instagram", brandLabel: "Instagram", sender: "Instagram", senderEmail: "mail@instagram.com", summary: "Live créateurs — Instagram", location: "https://www.instagram.com/direct/t/ultimail-demo-live", startHour: 16, dateLabel: "14 mai", }, { provider: "discord", id: "vc-demo-discord", brandLabel: "Discord", sender: "Discord", senderEmail: "noreply@discord.com", summary: "Voice channel équipe — Discord", location: "https://discord.gg/ultimail-demo-voice", startHour: 17, dateLabel: "14 mai", }, { provider: "slack", id: "vc-demo-slack", brandLabel: "Slack", sender: "Slack", senderEmail: "notification@slack.com", summary: "Huddle quotidien — Slack", location: "https://app.slack.com/huddle/TULTIMail/CdemoHuddle", startHour: 9, startMinute: 30, dateLabel: "13 mai", read: true, }, { provider: "telegram", id: "vc-demo-telegram", brandLabel: "Telegram", sender: "Telegram", senderEmail: "noreply@telegram.org", summary: "Appel groupe — Telegram", location: "https://t.me/joinchat/UltimailDemoTelegram", startHour: 10, startMinute: 30, dateLabel: "13 mai", read: true, }, { provider: "messenger", id: "vc-demo-messenger", brandLabel: "Messenger", sender: "Messenger", senderEmail: "noreply@messenger.com", summary: "Room famille — Messenger", location: "https://m.me/c/ultimail-demo-room", startHour: 11, startMinute: 30, dateLabel: "13 mai", read: true, }, { provider: "facetime", id: "vc-demo-facetime", brandLabel: "FaceTime", sender: "Apple Calendar", senderEmail: "calendar@icloud.com", summary: "Visio FaceTime — design", location: "facetime://demo.organisateur@ultimail.test", startHour: 14, startMinute: 30, dateLabel: "13 mai", read: true, }, { provider: "phone", id: "vc-demo-phone", brandLabel: "Téléphone", sender: "Secrétariat", senderEmail: "secretariat@ultimail.test", summary: "Conf call PSTN — téléphone", location: "tel:+33183927510", startHour: 15, startMinute: 30, dateLabel: "13 mai", read: true, }, { provider: "other", id: "vc-demo-webex", brandLabel: "Webex", sender: "Cisco Webex", senderEmail: "noreply@webex.com", summary: "Réunion entreprise — Webex", location: "https://company.webex.com/meet/ultimail-demo-webex", startHour: 16, startMinute: 30, dateLabel: "13 mai", read: true, }, ] /** Un message boîte de réception par marque de visioconférence (fixtures). */ export const demoCalendarInvitationEmails: Email[] = DEMO_BRANDS.map(buildDemoVcEmail)