'use client'; import { useEffect, useState } from 'react'; import Link from 'next/link'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Progress } from '@/components/ui/progress'; import { Server, Building2, Network, Globe, Smartphone, Database, RefreshCw, ArrowRight, Activity, TrendingUp, AlertCircle, CheckCircle, XCircle, Users, HardDrive, Wifi } from 'lucide-react'; interface DashboardStats { companies: { total: number; active: number; }; configurationItems: { total: number; active: number; }; mappings: { auvik: { mapped: number; unmapped: number; }; rmm: { mapped: number; unmapped: number; }; }; } export default function DashboardPage() { const [stats, setStats] = useState({ companies: { total: 0, active: 0 }, configurationItems: { total: 0, active: 0 }, mappings: { auvik: { mapped: 0, unmapped: 0 }, rmm: { mapped: 0, unmapped: 0 } } }); const [loading, setLoading] = useState(true); useEffect(() => { fetchStats(); }, []); const fetchStats = async () => { try { // Fetch companies const companiesRes = await fetch('/api/companies'); const companiesData = await companiesRes.json(); // Fetch Auvik mappings const auvikRes = await fetch('/api/auvik/tenant-mappings?includeUnmapped=true'); const auvikData = await auvikRes.json(); // Fetch RMM mappings const rmmRes = await fetch('/api/rmm/site-mappings?includeUnmapped=true'); const rmmData = await rmmRes.json(); setStats({ companies: { total: companiesData.companies?.length || 0, active: companiesData.companies?.filter((c: any) => c.isActive).length || 0 }, configurationItems: { total: 0, // Would need to fetch this active: 0 }, mappings: { auvik: { mapped: auvikData.stats?.mapped || 0, unmapped: auvikData.stats?.unmapped || 0 }, rmm: { mapped: rmmData.stats?.mapped || 0, unmapped: rmmData.stats?.unmapped || 0 } } }); } catch (error) { console.error('Error fetching dashboard stats:', error); } finally { setLoading(false); } }; const quickLinks = [ { title: 'Configuration Items', description: 'View and manage IT assets and devices', href: '/configuration-items', icon: Server, color: 'blue', stats: `${stats.configurationItems.active} active items` }, { title: 'Sync Management', description: 'Synchronize data from external systems', href: '/admin/sync', icon: RefreshCw, color: 'green', stats: 'Run data synchronization' }, { title: 'Data Browser', description: 'Browse and query system data', href: '/admin/data-browser', icon: Database, color: 'purple', stats: 'Explore database tables' } ]; const mappingCards = [ { title: 'NMS Mapping (Auvik)', description: 'Network Management System integration', href: '/auvik-mappings', icon: Network, color: 'blue', mapped: stats.mappings.auvik.mapped, unmapped: stats.mappings.auvik.unmapped, total: stats.mappings.auvik.mapped + stats.mappings.auvik.unmapped }, { title: 'RMM Mapping (Datto)', description: 'Remote Monitoring & Management', href: '/rmm-mappings', icon: Globe, color: 'purple', mapped: stats.mappings.rmm.mapped, unmapped: stats.mappings.rmm.unmapped, total: stats.mappings.rmm.mapped + stats.mappings.rmm.unmapped }, { title: 'Apple RMM (Addigy)', description: 'Apple device management', href: '/addigy-mappings', icon: Smartphone, color: 'orange', mapped: 0, unmapped: 0, total: 0, comingSoon: true } ]; const getMappingProgress = (mapped: number, total: number) => { if (total === 0) return 0; return (mapped / total) * 100; }; return (
{/* Header */}

Dashboard

Welcome to Pulse - Your PSA Management System

{/* Stats Overview */}
Total Companies
{stats.companies.total}

{stats.companies.active} active

NMS Coverage
{stats.mappings.auvik.mapped + stats.mappings.auvik.unmapped > 0 ? Math.round(getMappingProgress(stats.mappings.auvik.mapped, stats.mappings.auvik.mapped + stats.mappings.auvik.unmapped)) : 0}%

{stats.mappings.auvik.mapped} of {stats.mappings.auvik.mapped + stats.mappings.auvik.unmapped} tenants

RMM Coverage
{stats.mappings.rmm.mapped + stats.mappings.rmm.unmapped > 0 ? Math.round(getMappingProgress(stats.mappings.rmm.mapped, stats.mappings.rmm.mapped + stats.mappings.rmm.unmapped)) : 0}%

{stats.mappings.rmm.mapped} of {stats.mappings.rmm.mapped + stats.mappings.rmm.unmapped} sites

System Status
Online

All systems operational

{/* Quick Links */}

Quick Access

{quickLinks.map((link) => (
{link.title} {link.description}

{link.stats}

))}
{/* Mapping Status */}

Integration Mappings

{mappingCards.map((mapping) => ( {mapping.comingSoon && ( Coming Soon )}
{!mapping.comingSoon && mapping.unmapped > 0 && ( {mapping.unmapped} unmapped )}
{mapping.title} {mapping.description}
{!mapping.comingSoon ? ( <>
Coverage {Math.round(getMappingProgress(mapping.mapped, mapping.total))}%
{mapping.mapped} mapped {mapping.unmapped} unmapped
) : (

Integration under development

)}
))}
{/* Recent Activity - Placeholder */}

Recent Activity

Data sync completed

Companies synchronized successfully - 5 minutes ago

New RMM site mapped

Site "Acme Corp - Dallas" mapped to Acme Corp - 2 hours ago

Configuration items updated

247 devices synchronized from RMM - 1 day ago

); }