import { useState, useEffect, useCallback } from 'react';
import { useNavigate } from 'react-router-dom';
import { databases, DATABASE_ID } from '@/lib/appwrite';
import { ID, Query } from 'appwrite';
import Header from './Header';
import { useToast } from '@/hooks/useToast';
import FilialDetail from './FilialDetail';
import UserCreateForm from './UserCreateForm';
import { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/card';
import { Input } from '@/components/ui/input';
import { Button } from '@/components/ui/button';
import { Badge } from '@/components/ui/badge';
import { Separator } from '@/components/ui/separator';
import { ScrollArea } from '@/components/ui/scroll-area';
const ROLE_LABELS = {
admin: 'Admin',
firmenleiter: 'Firmenleiter',
filialleiter: 'Filialleiter',
service: 'Service',
lager: 'Lager',
};
export default function AdminPanel() {
const { showToast } = useToast();
const navigate = useNavigate();
const [stats, setStats] = useState({ users: 0, locations: 0, assets: 0, lagerstandorte: 0, locationsWithoutFilialleiter: 0 });
const [locations, setLocations] = useState([]);
const [users, setUsers] = useState([]);
const [userSearchQuery, setUserSearchQuery] = useState('');
const [showUserForm, setShowUserForm] = useState(false);
const [newFiliale, setNewFiliale] = useState({ name: '', address: '' });
const [addingFiliale, setAddingFiliale] = useState(false);
const [editingId, setEditingId] = useState(null);
const [editForm, setEditForm] = useState({ name: '', address: '' });
const loadData = useCallback(async () => {
try {
const [locsRes, usersRes, assetsRes, lsRes] = await Promise.all([
databases.listDocuments(DATABASE_ID, 'locations', [Query.limit(100)]),
databases.listDocuments(DATABASE_ID, 'users_meta', [Query.limit(500)]),
databases.listDocuments(DATABASE_ID, 'assets', [Query.limit(1)]),
databases.listDocuments(DATABASE_ID, 'lagerstandorte', [Query.limit(1)]),
]);
setLocations(locsRes.documents);
setUsers(usersRes.documents);
const locationsWithoutFilialleiter = locsRes.documents.filter(
(loc) => !usersRes.documents.some((u) => u.locationId === loc.$id && u.role === 'filialleiter')
).length;
setStats({
users: usersRes.total,
locations: locsRes.total,
assets: assetsRes.total,
lagerstandorte: lsRes.total,
locationsWithoutFilialleiter,
});
} catch (err) {
console.error('Admin-Daten laden fehlgeschlagen:', err);
}
}, []);
useEffect(() => { loadData(); }, [loadData]);
async function handleAddFiliale(e) {
e.preventDefault();
if (!newFiliale.name.trim()) return;
setAddingFiliale(true);
try {
const doc = await databases.createDocument(DATABASE_ID, 'locations', ID.unique(), {
name: newFiliale.name.trim(),
address: newFiliale.address.trim(),
isActive: true,
});
setLocations((prev) => [...prev, doc]);
setStats((s) => ({ ...s, locations: s.locations + 1 }));
setNewFiliale({ name: '', address: '' });
showToast(`Filiale "${doc.name}" erstellt`);
} catch (err) {
showToast('Fehler beim Erstellen: ' + (err.message || err), '#C62828');
} finally {
setAddingFiliale(false);
}
}
async function handleToggleFiliale(id) {
const loc = locations.find((l) => l.$id === id);
if (!loc) return;
try {
const updated = await databases.updateDocument(DATABASE_ID, 'locations', id, {
isActive: !loc.isActive,
});
setLocations((prev) => prev.map((l) => l.$id === id ? updated : l));
showToast(`Filiale "${loc.name}" ${updated.isActive ? 'aktiviert' : 'deaktiviert'}`);
} catch (err) {
showToast('Fehler: ' + (err.message || err), '#C62828');
}
}
async function handleDeleteFiliale(id) {
const loc = locations.find((l) => l.$id === id);
if (!window.confirm(`Filiale "${loc?.name}" wirklich löschen?`)) return;
try {
await databases.deleteDocument(DATABASE_ID, 'locations', id);
setLocations((prev) => prev.filter((l) => l.$id !== id));
setStats((s) => ({ ...s, locations: s.locations - 1 }));
setEditingId((current) => (current === id ? null : current));
showToast(`Filiale "${loc.name}" gelöscht`, '#607D8B');
} catch (err) {
showToast('Fehler beim Löschen: ' + (err.message || err), '#C62828');
}
}
function startEdit(loc) {
setEditingId(loc.$id);
setEditForm({ name: loc.name, address: loc.address || '' });
}
async function handleSaveEdit() {
if (!editForm.name.trim()) return;
try {
const updated = await databases.updateDocument(DATABASE_ID, 'locations', editingId, {
name: editForm.name.trim(),
address: editForm.address.trim(),
});
setLocations((prev) => prev.map((l) => l.$id === editingId ? updated : l));
setEditForm((f) => ({ ...f, name: updated.name, address: updated.address || '' }));
showToast(`Filiale "${updated.name}" gespeichert`);
} catch (err) {
showToast('Fehler beim Speichern: ' + (err.message || err), '#C62828');
}
}
const filteredUsers = users.filter(
(u) =>
!userSearchQuery.trim() ||
(u.userName || '').toLowerCase().includes(userSearchQuery.toLowerCase()) ||
(u.userId || '').toLowerCase().includes(userSearchQuery.toLowerCase())
);
const getLocationName = (locationId) => {
if (!locationId) return 'Nicht zugeordnet';
const loc = locations.find((l) => l.$id === locationId);
return loc?.name || 'Unbekannte Filiale';
};
const statItems = [
{ label: 'Benutzer', value: stats.users },
{ label: 'Filialen', value: stats.locations },
{ label: 'Assets gesamt', value: stats.assets },
{ label: 'Lagerstandorte', value: stats.lagerstandorte },
{ label: 'Filialen ohne Filialleiter', value: stats.locationsWithoutFilialleiter ?? 0 },
];
return (
<>
System-Übersicht und Verwaltung
{item.label}
Keine Filialen vorhanden
)} {locations.map((loc) => ({userSearchQuery ? 'Keine Benutzer gefunden' : 'Keine Benutzer vorhanden'}
)}