import { Badge, Box, Card, Grid, GridCol, Group, Loader, Progress, Stack, Text, ThemeIcon, Title, useMantineColorScheme, } from "@mantine/core"; import { Baby, BarChart3, Building2, Home, PieChart as PieChartIcon, TrendingDown, Users, } from "lucide-react"; import { useEffect, useState } from "react"; import { Bar, BarChart, CartesianGrid, Cell, Pie, PieChart, ResponsiveContainer, Tooltip, XAxis, YAxis, } from "recharts"; import { apiClient } from "@/utils/api-client"; // Sektor Unggulan Data (Mock for now) const sektorUnggulanData = [ { sektor: "Pertanian", value: 65 }, { sektor: "Perdagangan", value: 45 }, { sektor: "Industri", value: 38 }, { sektor: "Jasa", value: 52 }, ]; const DemografiPekerjaan = () => { const { colorScheme } = useMantineColorScheme(); const dark = colorScheme === "dark"; const [stats, setStats] = useState({ total: 0, heads: 0, poor: 0, }); const [ageData, setAgeData] = useState([]); const [jobData, setJobData] = useState([]); const [religionData, setReligionData] = useState([]); const [banjarData, setBanjarData] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { async function fetchData() { try { const [statsRes, banjarRes, demoRes] = await Promise.all([ apiClient.GET("/api/resident/stats"), apiClient.GET("/api/resident/banjar-stats"), apiClient.GET("/api/resident/demographics"), ]); if (statsRes.data?.data) setStats(statsRes.data.data); if (banjarRes.data?.data) setBanjarData(banjarRes.data.data); if (demoRes.data?.data) { const { religion, occupation, ageGroups } = demoRes.data.data; const religionColors: Record = { HINDU: "#EF4444", ISLAM: "#3B82F6", KRISTEN: "#22C55E", KATOLIK: "#A855F7", BUDDHA: "#FACC15", KONGHUCU: "#F97316", LAINNYA: "#94A3B8", }; setReligionData( (religion as any[]).map((r) => ({ name: r.religion, value: r._count._all, color: religionColors[r.religion] || "#94A3B8", })), ); setJobData( (occupation as any[]).map((o) => ({ job: o.occupation || "Lainnya", total: o._count._all, })), ); setAgeData( (ageGroups as any[]).map((a) => ({ ageRange: a.range, total: Number(a.count), })), ); } } catch (error) { console.error("Failed to fetch demografi data", error); } finally { setLoading(false); } } fetchData(); }, []); // KPI Data const kpiData = [ { id: 1, title: "Total Penduduk", value: stats.total.toLocaleString(), subtitle: "Aktif terdaftar", icon: Users, }, { id: 2, title: "Kepala Keluarga", value: stats.heads.toLocaleString(), subtitle: "Total KK", icon: Home, }, { id: 3, title: "Kelahiran", value: "0", subtitle: "Tahun ini", icon: Baby, }, { id: 4, title: "Kemiskinan", value: stats.poor.toLocaleString(), subtitle: "Keluarga Prasejahtera", trend: "positive", icon: TrendingDown, }, ]; // Dynamic Stats Data (Mock for now as no records in DB yet) const dynamicStats = [ { title: "Kelahiran", value: "0", icon: Baby, color: "#22C55E", }, { title: "Kematian", value: "0", icon: TrendingDown, color: "#EF4444", }, { title: "Pindah Masuk", value: "0", icon: Users, color: "#3B82F6", }, { title: "Pindah Keluar", value: "0", icon: Users, color: "#3B82F6", }, ]; return ( {/* TOP SECTION - 4 STAT CARDS */} {kpiData.map((item) => ( {item.title} {item.value} {item.trend === "positive" && ( )} {item.subtitle} ))} {/* ROW 2 - 3 COLUMNS */} {/* LEFT: PENGELOMPOKAN UMUR */} Pengelompokan Umur {loading ? ( ) : ( )} {/* CENTER: DEMOGRAFI PEKERJAAN */} Demografi Pekerjaan {loading ? ( ) : ( )} {/* RIGHT: STATISTIK DINAMIKA PENDUDUK */} Dinamika Penduduk {dynamicStats.map((stat, index) => ( {stat.title} {stat.value} ))} {/* ROW 3 - 3 COLUMNS */} {/* LEFT: DISTRIBUSI AGAMA */} Distribusi Agama {loading ? ( ) : ( {religionData.map((entry, index) => ( ))} )} {!loading && religionData.map((item, index) => ( {item.name} {item.value.toLocaleString()} ))} {/* CENTER: DATA PER BANJAR */} Data per Banjar {loading ? ( ) : ( {banjarData.map((item, index) => ( ))}
Banjar Penduduk KK Miskin
{item.name} {(item.totalPopulation || 0).toLocaleString()} {(item.totalKK || 0).toLocaleString()} {(item.totalPoor || 0).toLocaleString()}
)}
{/* RIGHT: STATISTIK SEKTOR UNGGULAN */} Sektor Unggulan {sektorUnggulanData.map((entry, index) => ( ))}
); }; export default DemografiPekerjaan;