import React, { useState } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import { useForm, Controller } from 'react-hook-form'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { format, subDays, startOfMonth, endOfMonth, startOfQuarter, endOfQuarter, startOfYear, endOfYear } from 'date-fns'; import { FileText, Download, Calendar, Shield, AlertTriangle, CheckCircle, Clock, Settings, X, Play, RefreshCw, Eye, Filter } from 'lucide-react'; import { toast } from 'react-toastify'; import auditApi from '@/services/api'; import { ComplianceReport } from '@/types/audit'; interface ReportGeneratorProps { isOpen: boolean; onClose: () => void; } interface FormData { type: 'soc2' | 'hipaa' | 'pci' | 'gdpr' | 'custom'; startDate: string; endDate: string; template: string; includeFindings: boolean; includeRecommendations: boolean; includeEvidence: boolean; executiveSummary: boolean; customTitle: string; customDescription: string; } const complianceFrameworks = [ { value: 'soc2' as const, label: 'SOC 2 Type II', description: 'Service Organization Control 2 Type II assessment', icon: Shield, color: 'text-blue-600', requirements: ['Trust Services Criteria', 'Security', 'Availability', 'Confidentiality', 'Processing Integrity', 'Privacy'] }, { value: 'hipaa' as const, label: 'HIPAA', description: 'Health Insurance Portability and Accountability Act', icon: Shield, color: 'text-green-600', requirements: ['Administrative Safeguards', 'Physical Safeguards', 'Technical Safeguards', 'Breach Notification'] }, { value: 'pci' as const, label: 'PCI DSS', description: 'Payment Card Industry Data Security Standard', icon: Shield, color: 'text-purple-600', requirements: ['Network Security', 'Cardholder Data Protection', 'Vulnerability Management', 'Access Control'] }, { value: 'gdpr' as const, label: 'GDPR', description: 'General Data Protection Regulation', icon: Shield, color: 'text-indigo-600', requirements: ['Data Minimization', 'Consent Management', 'Data Subject Rights', 'Breach Notification'] }, { value: 'custom' as const, label: 'Custom Report', description: 'Create a custom compliance report', icon: FileText, color: 'text-gray-600', requirements: ['Flexible Requirements', 'Custom Controls', 'Tailored Assessment'] } ]; const predefinedPeriods = [ { label: 'Last 7 days', getValue: () => ({ start: format(subDays(new Date(), 7), 'yyyy-MM-dd'), end: format(new Date(), 'yyyy-MM-dd') }) }, { label: 'Last 30 days', getValue: () => ({ start: format(subDays(new Date(), 30), 'yyyy-MM-dd'), end: format(new Date(), 'yyyy-MM-dd') }) }, { label: 'Current Month', getValue: () => ({ start: format(startOfMonth(new Date()), 'yyyy-MM-dd'), end: format(endOfMonth(new Date()), 'yyyy-MM-dd') }) }, { label: 'Current Quarter', getValue: () => ({ start: format(startOfQuarter(new Date()), 'yyyy-MM-dd'), end: format(endOfQuarter(new Date()), 'yyyy-MM-dd') }) }, { label: 'Current Year', getValue: () => ({ start: format(startOfYear(new Date()), 'yyyy-MM-dd'), end: format(endOfYear(new Date()), 'yyyy-MM-dd') }) } ]; export const ComplianceReportGenerator: React.FC = ({ isOpen, onClose }) => { const queryClient = useQueryClient(); const [generatingReportId, setGeneratingReportId] = useState(null); const { control, watch, setValue, getValues, handleSubmit } = useForm({ defaultValues: { type: 'soc2', startDate: format(subDays(new Date(), 30), 'yyyy-MM-dd'), endDate: format(new Date(), 'yyyy-MM-dd'), template: 'standard', includeFindings: true, includeRecommendations: true, includeEvidence: true, executiveSummary: true, customTitle: '', customDescription: '' } }); const watchedType = watch('type'); // Fetch available templates const { data: templates = [] } = useQuery({ queryKey: ['complianceTemplates'], queryFn: () => auditApi.getComplianceTemplates(), enabled: isOpen }); // Fetch existing reports const { data: existingReports = [], refetch: refetchReports } = useQuery({ queryKey: ['complianceReports'], queryFn: () => auditApi.getComplianceReports(), enabled: isOpen }); // Generate report mutation const generateReportMutation = useMutation({ mutationFn: (data: { type: FormData['type'], period: { start: Date; end: Date }, template?: string }) => auditApi.generateComplianceReport(data.type, data.period, data.template), onSuccess: (result) => { setGeneratingReportId(result.reportId); toast.success('Report generation started'); // Poll for completion const pollInterval = setInterval(async () => { try { const report = await auditApi.getComplianceReport(result.reportId); if (report) { clearInterval(pollInterval); setGeneratingReportId(null); queryClient.invalidateQueries({ queryKey: ['complianceReports'] }); toast.success('Report generated successfully'); } } catch (error) { // Report might not be ready yet, continue polling } }, 2000); // Stop polling after 5 minutes setTimeout(() => { clearInterval(pollInterval); setGeneratingReportId(null); }, 5 * 60 * 1000); }, onError: (error) => { toast.error('Failed to generate report'); setGeneratingReportId(null); } }); const selectedFramework = complianceFrameworks.find(f => f.value === watchedType); const handlePeriodSelect = (period: { start: string; end: string }) => { setValue('startDate', period.start); setValue('endDate', period.end); }; const onSubmit = (data: FormData) => { generateReportMutation.mutate({ type: data.type, period: { start: new Date(data.startDate), end: new Date(data.endDate) }, template: data.template }); }; const handleDownloadReport = async (report: ComplianceReport) => { try { const blob = await auditApi.exportLogs({ format: 'pdf', filters: { dateRange: { start: report.period.start, end: report.period.end }, complianceFrameworks: [report.type] }, includeMetadata: true, includeCompliance: true, template: `compliance_${report.type}` }); const url = URL.createObjectURL(blob); const link = document.createElement('a'); link.href = url; link.download = `${report.type}_compliance_report_${format(new Date(), 'yyyy-MM-dd')}.pdf`; document.body.appendChild(link); link.click(); document.body.removeChild(link); URL.revokeObjectURL(url); toast.success('Report downloaded successfully'); } catch (error) { toast.error('Failed to download report'); } }; if (!isOpen) return null; return ( {/* Header */}

Compliance Report Generator

Generate comprehensive compliance reports for various frameworks

{/* Configuration Panel */}
{/* Framework Selection */}

Compliance Framework

(
{complianceFrameworks.map((framework) => { const Icon = framework.icon; return ( ); })}
)} />
{/* Time Period */}

Reporting Period

{/* Quick Period Selection */}
{predefinedPeriods.map((period) => ( ))}
(
)} /> (
)} />
{/* Template Selection */}

Report Template

( )} />
{/* Report Options */}

Report Options

( )} /> ( )} /> ( )} /> ( )} />
{/* Custom Fields for Custom Reports */} {watchedType === 'custom' && (

Custom Report Details

(
)} /> (