import React, { useState, useEffect } from 'react' import api from '../services/api' import toast from 'react-hot-toast' import { TrashIcon, ServerIcon, ChartBarIcon, ClockIcon, ExclamationTriangleIcon, CheckCircleIcon, PlayIcon, EyeIcon } from '@heroicons/react/24/outline' const DataRetentionMetrics = () => { const [metrics, setMetrics] = useState(null) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const [lastUpdate, setLastUpdate] = useState(null) const [cleanupLoading, setCleanupLoading] = useState(false) const [previewData, setPreviewData] = useState(null) const [showPreview, setShowPreview] = useState(false) useEffect(() => { loadDataRetentionMetrics() // Auto-refresh every 30 seconds const interval = setInterval(loadDataRetentionMetrics, 30000) return () => clearInterval(interval) }, []) const loadDataRetentionMetrics = async () => { try { setError(null) const response = await api.get('/data-retention/status') setMetrics(response.data) setLastUpdate(new Date()) } catch (error) { console.error('Error loading data retention metrics:', error) setError(error.response?.data?.message || 'Failed to load data retention metrics') } finally { setLoading(false) } } const loadCleanupPreview = async () => { try { setError(null) const response = await api.get('/data-retention/stats') setPreviewData(response.data.data) setShowPreview(true) } catch (error) { console.error('Error loading cleanup preview:', error) toast.error('Failed to load cleanup preview') } } const executeCleanup = async () => { if (!window.confirm('Are you sure you want to execute data retention cleanup? This will permanently delete old data according to each tenant\'s retention policy.')) { return } setCleanupLoading(true) try { // Note: This endpoint would need to be implemented in the backend const response = await api.post('/data-retention/cleanup') toast.success('Data retention cleanup initiated successfully') // Refresh metrics after cleanup setTimeout(() => { loadDataRetentionMetrics() }, 2000) } catch (error) { console.error('Error executing cleanup:', error) toast.error(error.response?.data?.message || 'Failed to execute cleanup') } finally { setCleanupLoading(false) } } const formatUptime = (seconds) => { if (!seconds) return 'Unknown' const days = Math.floor(seconds / 86400) const hours = Math.floor((seconds % 86400) / 3600) const minutes = Math.floor((seconds % 3600) / 60) if (days > 0) return `${days}d ${hours}h ${minutes}m` if (hours > 0) return `${hours}h ${minutes}m` return `${minutes}m` } const formatMemory = (mb) => { if (!mb) return 'Unknown' if (mb > 1024) return `${(mb / 1024).toFixed(1)} GB` return `${mb} MB` } if (loading) { return (

Data Retention Service

) } if (error) { return (

Data Retention Service

Service Unavailable

{error}

) } const isConnected = metrics?.service?.connected const serviceHealth = metrics?.health const serviceMetrics = metrics?.metrics return (

Data Retention Service

{isConnected ? ( ) : ( )}
{lastUpdate && `Updated ${lastUpdate.toLocaleTimeString()}`}
{/* Action Buttons */} {isConnected && (
)}
{isConnected ? (
{/* Service Status */}

Status

{serviceMetrics?.service?.status || 'Running'}

Uptime

{formatUptime(serviceMetrics?.service?.uptime || serviceHealth?.uptime)}

Memory

{formatMemory(serviceMetrics?.performance?.memoryUsage?.heapUsed)}

{/* Cleanup Information */} {serviceMetrics?.cleanup && (

Cleanup Operations

Last Cleanup

{serviceMetrics.cleanup.lastRunFormatted || 'Never'}

Next Scheduled

{serviceMetrics.cleanup.nextScheduledRun || '2:00 AM UTC daily'}

{serviceMetrics.cleanup.stats && (

Last Cleanup Stats

Detections: {serviceMetrics.cleanup.stats.totalDetections || 0} Heartbeats: {serviceMetrics.cleanup.stats.totalHeartbeats || 0} Logs: {serviceMetrics.cleanup.stats.totalLogs || 0}
)}
)} {/* Schedule Information */} {serviceMetrics?.schedule && (

Schedule

{serviceMetrics.schedule.description}

Cron: {serviceMetrics.schedule.cronExpression} ({serviceMetrics.schedule.timezone})

)}
) : (

Data retention service is not connected

{metrics?.service?.error || 'Service health check failed'}

)} {/* Cleanup Preview Modal */} {showPreview && previewData && (

Data Retention Cleanup Preview

This preview shows what data would be deleted based on each tenant's retention policy.

{previewData.tenants && previewData.tenants.map((tenant, index) => (

{tenant.name}

{tenant.retentionDays === -1 ? 'Unlimited' : `${tenant.retentionDays} days`}
{tenant.retentionDays === -1 ? (

No data will be deleted (unlimited retention)

) : (
Detections: {tenant.toDelete?.detections || 0}
Heartbeats: {tenant.toDelete?.heartbeats || 0}
Logs: {tenant.toDelete?.logs || 0}
)}
))}
)}
) } export default DataRetentionMetrics