import React, { useState, useMemo } from 'react'; import { Building2, Users, MessageSquare, Plus, Search, Edit, Trash2, ChevronDown, ChevronUp, ChevronsUpDown, X } from 'lucide-react'; import { TENANTS } from '../constants'; import { Tenant } from '../types'; import { DateRangePicker } from '../components/DateRangePicker'; import { KPICard } from '../components/KPICard'; export const SuperAdmin: React.FC = () => { const [dateRange, setDateRange] = useState({ start: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000), end: new Date() }); const [selectedTenantId, setSelectedTenantId] = useState('all'); const [searchQuery, setSearchQuery] = useState(''); const [tenants, setTenants] = useState(TENANTS); const [isModalOpen, setIsModalOpen] = useState(false); const [editingTenant, setEditingTenant] = useState(null); // Sorting State const [sortKey, setSortKey] = useState('created_at'); const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('desc'); // --- Metrics --- const totalTenants = tenants.length; const totalUsersGlobal = tenants.reduce((acc, t) => acc + (t.user_count || 0), 0); const totalAttendancesGlobal = tenants.reduce((acc, t) => acc + (t.attendance_count || 0), 0); // --- Data Filtering & Sorting --- const filteredTenants = useMemo(() => { let data = tenants; // Search if (searchQuery) { const q = searchQuery.toLowerCase(); data = data.filter(t => t.name.toLowerCase().includes(q) || t.admin_email?.toLowerCase().includes(q) || t.slug?.toLowerCase().includes(q) ); } // Tenant Filter (Select) if (selectedTenantId !== 'all') { data = data.filter(t => t.id === selectedTenantId); } // Sort return [...data].sort((a, b) => { const aVal = a[sortKey]; const bVal = b[sortKey]; if (aVal === undefined) return 1; if (bVal === undefined) return -1; if (aVal < bVal) return sortDirection === 'asc' ? -1 : 1; if (aVal > bVal) return sortDirection === 'asc' ? 1 : -1; return 0; }); }, [tenants, searchQuery, selectedTenantId, sortKey, sortDirection]); // --- Handlers --- const handleSort = (key: keyof Tenant) => { if (sortKey === key) { setSortDirection(prev => prev === 'asc' ? 'desc' : 'asc'); } else { setSortKey(key); setSortDirection('asc'); } }; const handleEdit = (tenant: Tenant) => { setEditingTenant(tenant); setIsModalOpen(true); }; const handleDelete = (id: string) => { if (confirm('Tem certeza que deseja excluir esta organização? Esta ação não pode ser desfeita.')) { setTenants(prev => prev.filter(t => t.id !== id)); } }; const handleSaveTenant = (e: React.FormEvent) => { e.preventDefault(); // Logic to save (mock) setIsModalOpen(false); setEditingTenant(null); alert('Organização salva com sucesso (Mock)'); }; // --- Helper Components --- const SortIcon = ({ column }: { column: keyof Tenant }) => { if (sortKey !== column) return ; return sortDirection === 'asc' ? : ; }; const StatusBadge = ({ status }: { status?: string }) => { const styles = { active: 'bg-green-100 text-green-700 border-green-200', inactive: 'bg-slate-100 text-slate-700 border-slate-200', trial: 'bg-purple-100 text-purple-700 border-purple-200', }; const style = styles[status as keyof typeof styles] || styles.inactive; let label = status || 'Desconhecido'; if (status === 'active') label = 'Ativo'; if (status === 'inactive') label = 'Inativo'; if (status === 'trial') label = 'Teste'; return ( {label} ); }; return (
{/* Header */}

Painel Super Admin

Gerencie organizações, visualize estatísticas globais e saúde do sistema.

{/* KPI Cards */}
{/* Filters & Search */}
setSearchQuery(e.target.value)} className="w-full pl-9 pr-4 py-2 bg-slate-50 border border-slate-200 rounded-lg text-sm outline-none focus:ring-2 focus:ring-blue-100 transition-all" />
{/* Tenants Table */}
{filteredTenants.map((tenant) => ( ))} {filteredTenants.length === 0 && ( )}
handleSort('name')}>
Organização
Slug handleSort('status')}>
Status
handleSort('user_count')}>
Usuários
handleSort('attendance_count')}>
Atendimentos
Ações
{tenant.logo_url ? : }
{tenant.name}
{tenant.admin_email}
{tenant.slug} {tenant.user_count} {tenant.attendance_count?.toLocaleString()}
Nenhuma organização encontrada com os filtros atuais.
{/* Simple Pagination Footer */}
Mostrando {filteredTenants.length} de {tenants.length} organizações
{/* Add/Edit Modal */} {isModalOpen && (

{editingTenant ? 'Editar Organização' : 'Adicionar Nova Organização'}

)}
); };