"use client" import { useEffect, useState } from "react" import { useRouter } from "next/navigation" import Link from "next/link" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Badge } from "@/components/ui/badge" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog" import { Label } from "@/components/ui/label" import { Plus, Search, Loader2, RefreshCw, Building2, CheckCircle, XCircle, Eye, Trash2, Pencil, ChevronLeft, ChevronRight, Users, ShieldCheck, AlertCircle } from "lucide-react" import { Switch } from "@/components/ui/switch" import { adminCompaniesApi, type AdminCompany } from "@/lib/api" import { getCurrentUser, isAdminUser } from "@/lib/auth" import { toast } from "sonner" import { ConfirmModal } from "@/components/confirm-modal" import { Skeleton } from "@/components/ui/skeleton" import { useTranslation } from "@/lib/i18n" import { motion } from "framer-motion" const companyDateFormatter = new Intl.DateTimeFormat("pt-BR", { dateStyle: "medium", }) const formatDescription = (description: string | undefined) => { if (!description) return null try { const parsed = JSON.parse(description) if (typeof parsed === 'object' && parsed !== null) { return (
{Object.entries(parsed).map(([key, value]) => (
{key.replace(/([A-Z])/g, ' $1').replace(/_/g, ' ')}
{String(value)}
))}
) } } catch { } return

{description}

} export default function AdminCompaniesPage() { const { t } = useTranslation() const router = useRouter() const [companies, setCompanies] = useState([]) const [loading, setLoading] = useState(true) const [searchTerm, setSearchTerm] = useState("") const [page, setPage] = useState(1) const [totalCompanies, setTotalCompanies] = useState(0) const [isViewDialogOpen, setIsViewDialogOpen] = useState(false) const [selectedCompany, setSelectedCompany] = useState(null) const [companyToDelete, setCompanyToDelete] = useState(null) const [updating, setUpdating] = useState(false) const [isEditDialogOpen, setIsEditDialogOpen] = useState(false) const [editFormData, setEditFormData] = useState({ name: "", slug: "", email: "", phone: "", website: "", document: "", address: "", description: "", logoUrl: "", yearsInMarket: "", active: false, verified: false, }) useEffect(() => { const user = getCurrentUser() if (!isAdminUser(user)) { router.push("/dashboard") return } loadCompanies() }, [router]) const limit = 10 const totalPages = Math.max(1, Math.ceil(totalCompanies / limit)) const loadCompanies = async (targetPage = page) => { const pageNum = typeof targetPage === 'number' ? targetPage : page try { setLoading(true) const data = await adminCompaniesApi.list(undefined, pageNum, limit) setCompanies(data.data || []) setTotalCompanies(data.pagination.total) setPage(data.pagination.page) } catch (error) { console.error("Error loading companies:", error) toast.error("Erro ao carregar empresas") } finally { setLoading(false) } } const toggleStatus = async (company: AdminCompany, field: 'active' | 'verified') => { const newValue = !company[field] const originalCompanies = [...companies] setCompanies(companies.map(c => c.id === company.id ? { ...c, [field]: newValue } : c)) try { await adminCompaniesApi.updateStatus(company.id, { [field]: newValue }) toast.success(t('admin.companies.success.statusUpdated', { field })) } catch (error) { toast.error(`Falha ao atualizar ${field}`) setCompanies(originalCompanies) } } const confirmDelete = async () => { if (!companyToDelete) return try { await adminCompaniesApi.delete(companyToDelete.id) toast.success(t('admin.companies.success.deleted')) setIsViewDialogOpen(false) loadCompanies() } catch (error) { toast.error("Falha ao deletar empresa") } finally { setCompanyToDelete(null) } } const handleEditClick = (company: AdminCompany) => { setEditFormData({ name: company.name || "", slug: company.slug || "", email: company.email || "", phone: company.phone || "", website: company.website || "", document: company.document || "", address: company.address || "", description: company.description || "", logoUrl: (company as any).logoUrl || "", yearsInMarket: (company as any).yearsInMarket || "", active: company.active || false, verified: company.verified || false, }) setIsEditDialogOpen(true) setIsViewDialogOpen(false) } const handleUpdate = async () => { if (!selectedCompany) return try { setUpdating(true) if (editFormData.active !== selectedCompany.active || editFormData.verified !== selectedCompany.verified) { await adminCompaniesApi.updateStatus(selectedCompany.id, { active: editFormData.active, verified: editFormData.verified }) } await adminCompaniesApi.update(selectedCompany.id, editFormData as any) toast.success("Empresa atualizada com sucesso") setIsEditDialogOpen(false) loadCompanies() } catch (error) { toast.error("Erro ao atualizar empresa") } finally { setUpdating(false) } } const filteredCompanies = companies.filter( (company) => company.name?.toLowerCase().includes(searchTerm.toLowerCase()) || company.email?.toLowerCase().includes(searchTerm.toLowerCase()) ) return (
{/* Header */}

{t('admin.companies.title')}

{t('admin.companies.subtitle')}

{/* Stats Cards */}
Total de Empresas
{totalCompanies}
Ativas
{companies.filter(c => c.active).length}
Verificadas
{companies.filter(c => c.verified).length}
Pendentes
{companies.filter(c => !c.verified).length}
{/* Content Card */}
setSearchTerm(e.target.value)} className="pl-10 h-11 border-muted-foreground/20 focus:ring-primary" />
{loading ? (
{[...Array(5)].map((_, i) => )}
) : ( Empresa E-mail Status Verificado Cadastro Ações {filteredCompanies.length === 0 ? ( Nenhuma empresa encontrada ) : ( filteredCompanies.map((company) => (
{company.name}
{company.email || "-"} toggleStatus(company, 'active')} > {company.active ? "Ativo" : "Inativo"}
toggleStatus(company, 'verified')} > {company.verified ? ( ) : ( )}
{company.createdAt ? companyDateFormatter.format(new Date(company.createdAt)) : "-"}
)) )}
)} {/* Pagination */} {!loading && totalPages > 1 && (

Mostrando {(page - 1) * limit + 1} a {Math.min(page * limit, totalCompanies)} de {totalCompanies} empresas

)}
setCompanyToDelete(null)} onConfirm={confirmDelete} title="Excluir Empresa" description={`Tem certeza que deseja excluir ${companyToDelete?.name}? Esta ação não pode ser desfeita.`} />
) }