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 (
Service Unavailable
{error}
Status
{serviceMetrics?.service?.status || 'Running'}
Uptime
{formatUptime(serviceMetrics?.service?.uptime || serviceHealth?.uptime)}
Memory
{formatMemory(serviceMetrics?.performance?.memoryUsage?.heapUsed)}
Last Cleanup
{serviceMetrics.cleanup.lastRunFormatted || 'Never'}
Next Scheduled
{serviceMetrics.cleanup.nextScheduledRun || '2:00 AM UTC daily'}
Last Cleanup Stats
{serviceMetrics.schedule.description}
Cron: {serviceMetrics.schedule.cronExpression} ({serviceMetrics.schedule.timezone})
Data retention service is not connected
{metrics?.service?.error || 'Service health check failed'}
This preview shows what data would be deleted based on each tenant's retention policy.
{previewData.tenants && previewData.tenants.map((tenant, index) => (No data will be deleted (unlimited retention)
) : (