import { useState } from 'react';
import { motion } from 'framer-motion';
import { Film, AlertTriangle, CheckCircle, Clock } from 'lucide-react';
import styles from './TemporalTimeline.module.css';
const SEV_LABELS = { critical: 'Critical', high: 'High', medium: 'Medium' };
export default function TemporalTimeline({ timeline, duration = 23, totalFrames }) {
const [hovered, setHovered] = useState(null);
const durationSec = parseFloat(duration) || 23;
const toPercent = (sec) => (sec / durationSec) * 100;
const hasFlags = timeline.flaggedSegments.length > 0;
return (
Temporal Analysis Timeline
{timeline.flaggedSegments.length} flagged segments
{timeline.cleanSegments.length} clean
{/* Main timeline bar */}
{/* Clean segments */}
{timeline.cleanSegments.map((seg, i) => (
))}
{/* Flagged segments */}
{timeline.flaggedSegments.map((seg, i) => (
setHovered(i)}
onMouseLeave={() => setHovered(null)}
>
{/* Tooltip */}
{hovered === i && (
{seg.reason}
{seg.start.toFixed(1)}s – {seg.end.toFixed(1)}s · {seg.frames.length} frames
{SEV_LABELS[seg.severity]}
)}
))}
{/* Timestamp rulers */}
{Array.from({ length: Math.ceil(durationSec / 5) + 1 }, (_, i) => i * 5).map(t => (
t <= durationSec && (
)
))}
{/* Flagged segments list */}
{hasFlags ? timeline.flaggedSegments.map((seg, i) => (
{seg.reason}
{seg.start.toFixed(1)}s – {seg.end.toFixed(1)}s
·
{seg.frames.length} frames flagged
{SEV_LABELS[seg.severity]}
)) : (
No suspicious temporal segments crossed the current threshold.
)}
);
}