"use client" import { useEffect, useState } from "react" import { useRouter } from "next/navigation" const API_BASE = "http://127.0.0.1:5000" type UsageReport = Record type SecurityReport = { generated_at?: string login_attempts?: number suspicious_events?: number error_events?: number blocked_events?: number top_ips?: Array<{ ip: string; count: number }> } export default function AdminReportsPage() { const router = useRouter() const [ready, setReady] = useState(false) const [loading, setLoading] = useState(false) const [exporting, setExporting] = useState(false) const [message, setMessage] = useState("") const [usageReport, setUsageReport] = useState({}) const [securityReport, setSecurityReport] = useState({}) const getToken = () => localStorage.getItem("admin_token") const headers = () => { const token = getToken() return token ? { "Content-Type": "application/json", Authorization: `Bearer ${token}` } : { "Content-Type": "application/json" } } const ensureAuth = async () => { const token = getToken() if (!token) { router.push("/admin/login") return false } const resp = await fetch(`${API_BASE}/api/admin/test`, { headers: headers() }) if (!resp.ok) { localStorage.removeItem("admin_token") router.push("/admin/login") return false } return true } const fetchReports = async () => { setLoading(true) setMessage("") try { const [usageResp, securityResp] = await Promise.all([ fetch(`${API_BASE}/api/admin/reports/usage`, { headers: headers() }), fetch(`${API_BASE}/api/admin/reports/security`, { headers: headers() }), ]) const usageData = await usageResp.json().catch(() => ({})) const securityData = await securityResp.json().catch(() => ({})) if (!usageResp.ok || !securityResp.ok) { setMessage(String(usageData.error || securityData.error || "Failed to fetch reports.")) return } setUsageReport(usageData.report || {}) setSecurityReport(securityData.report || {}) } catch { setMessage("Network error while fetching reports.") } finally { setLoading(false) } } const triggerDownload = (content: string, filename: string, mimeType: string) => { const blob = new Blob([content], { type: mimeType }) const url = URL.createObjectURL(blob) const anchor = document.createElement("a") anchor.href = url anchor.download = filename document.body.appendChild(anchor) anchor.click() anchor.remove() URL.revokeObjectURL(url) } const exportReport = async (reportType: "usage" | "security", format: "json" | "csv") => { setExporting(true) setMessage("") try { const resp = await fetch( `${API_BASE}/api/admin/reports/export?type=${encodeURIComponent(reportType)}&format=${encodeURIComponent(format)}`, { headers: headers() }, ) const data = await resp.json().catch(() => ({})) if (!resp.ok) { setMessage(String(data.error || "Export failed.")) return } const stamp = new Date().toISOString().replace(/[.:]/g, "-") if (format === "json") { triggerDownload(JSON.stringify(data, null, 2), `${reportType}-report-${stamp}.json`, "application/json") } else { triggerDownload(String(data.content || "key,value\n"), `${reportType}-report-${stamp}.csv`, "text/csv") } setMessage(`${reportType} report exported as ${format.toUpperCase()}.`) } catch { setMessage("Network error while exporting report.") } finally { setExporting(false) } } useEffect(() => { const init = async () => { const ok = await ensureAuth() if (!ok) return setReady(true) await fetchReports() } init() }, []) if (!ready) { return (

Loading reports...

) } return (

Reports and Analytics

Usage and security reporting with downloadable JSON and CSV exports.

{message ?

{message}

: null}

Usage Report

{loading ? (

Loading usage report...

) : (
{Object.entries(usageReport).map(([key, value]) => (
{key} {String(value)}
))} {Object.keys(usageReport).length === 0 ? (

No usage data available.

) : null}
)}

Security Report

{loading ? (

Loading security report...

) : (
Login attempts:{" "} {securityReport.login_attempts || 0}
Suspicious events:{" "} {securityReport.suspicious_events || 0}
Error events:{" "} {securityReport.error_events || 0}
Blocked by firewall:{" "} {securityReport.blocked_events || 0}

Top Source IPs

{(securityReport.top_ips || []).map((entry) => (
{entry.ip} {entry.count}
))} {(securityReport.top_ips || []).length === 0 ? (

No IP analytics available.

) : null}
)}
) }