"use client" import { Printer } from "lucide-react" import { Button } from "@/components/ui/button" import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip" import { useAppName } from "@/components/providers/app-config-provider" import { PrivacyPolicy } from "@/types/privacy-policy" import { escapeHtml, markdownToHtmlSync } from "@/lib/markdown" interface PrintPolicyProps { policy: PrivacyPolicy variant?: "default" | "destructive" | "outline" | "secondary" | "ghost" | "link" size?: "default" | "sm" | "lg" | "icon" | "icon-sm" label?: string className?: string } const iconSizes = ["icon", "icon-sm"] export function PrintPolicy({ policy, variant = "outline", size = "sm", label = "Drucken", className, }: PrintPolicyProps) { const appName = useAppName() const handlePrint = () => { const printWindow = window.open("", "_blank") if (!printWindow) return printWindow.document.write(generatePrintContent(policy, appName)) printWindow.document.close() } const isIconOnly = iconSizes.includes(size) const button = ( ) if (!isIconOnly) return button return ( {button} Als PDF drucken ) } function generatePrintContent(policy: PrivacyPolicy, appName: string): string { const formatDate = (dateString: string) => new Date(dateString).toLocaleDateString("de-DE", { year: "numeric", month: "long", day: "numeric", }) const cleanMarkdown = (content: string) => markdownToHtmlSync(content) // Art. 21 Abs. 4 verlangt den Hinweis auf das Widerspruchsrecht „von anderen // Informationen getrennt“ – in der Druckfassung als eigener, gerahmter Block. const objectionNotice = (content?: string | null) => content ? `

Ihr Widerspruchsrecht nach Art. 21 DSGVO

${cleanMarkdown(content)}
` : "" const section = (title: string, content?: string | null) => content ? `

${title}

${cleanMarkdown(content)}
` : "" return ` ${escapeHtml(policy.title)}

${escapeHtml(appName)} · Datenschutzerklärung

${escapeHtml(policy.title)}

Erstellt am ${formatDate(policy.createdAt)}${ policy.updatedAt !== policy.createdAt ? ` · Aktualisiert am ${formatDate(policy.updatedAt)}` : "" }

${section("Verantwortlicher im Sinne der DSGVO", policy.responsible)} ${section("Kontaktdaten des Datenschutzbeauftragten", policy.contactDPO)} ${section("Bezeichnung der Verarbeitungstätigkeit", policy.processingDescription)} ${section("Zweck der Datenerhebung", policy.processingPurposes)} ${section("Rechtsgrundlage der Datenerhebung", policy.legalBasis)} ${section("Berechtigte Interessen", policy.legitimateInterests)} ${section("Kategorien der verarbeiteten Daten", policy.dataCategories)} ${section("Geplante Empfänger der Daten", policy.recipients)} ${section("Übermittlung in Drittländer", policy.thirdCountryTransfer)} ${section("Speicherdauer der Daten", policy.storageDuration)} ${section("Herkunft der Daten", policy.dataSource)} ${section("Automatisierte Entscheidungsfindung", policy.automatedDecision)} ${section("Betroffenen-Rechte", policy.dataSubjectsRights)} ${section("Beschwerderecht bei der Aufsichtsbehörde", policy.complaintRight)} ${section("Widerrufsrecht bei Einwilligung", policy.withdrawalRight)} ${objectionNotice(policy.objectionRight)} ${section("Ihre Pflicht zur Bereitstellung der Daten", policy.provisionObligation)} ${section("Folgen, wenn Sie die Daten nicht angeben", policy.provisionConsequences)} ` }