import { useState, useEffect, useCallback } from 'react' import { databases, account, DATABASE_ID, COLLECTIONS, ID, Query } from '../lib/appwrite' const DEMO_MODE = !import.meta.env.VITE_APPWRITE_PROJECT_ID // Demo-Mitarbeiter für Testing const DEMO_EMPLOYEES = [ { $id: '1', userId: 'user1', displayName: 'Kenso Grimm', email: 'kenso@example.com', shortcode: 'KNSO' }, { $id: '2', userId: 'user2', displayName: 'Christian Lehmann', email: 'christian@example.com', shortcode: 'CHLE' } ] export function useEmployees() { const [employees, setEmployees] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const [syncing, setSyncing] = useState(false) const fetchEmployees = useCallback(async () => { setLoading(true) if (DEMO_MODE) { setEmployees(DEMO_EMPLOYEES) setLoading(false) return } try { const response = await databases.listDocuments( DATABASE_ID, COLLECTIONS.EMPLOYEES, [Query.orderAsc('displayName')] ) setEmployees(response.documents) setError(null) } catch (err) { console.error('Error fetching employees:', err) // Wenn Collection nicht existiert, setze leeres Array (kein Fehler) if (err.code === 404 || err.message?.includes('not found')) { setEmployees([]) setError(null) // Kein Fehler, Collection existiert einfach noch nicht } else { setError(err.message) setEmployees([]) } } finally { setLoading(false) } }, []) useEffect(() => { fetchEmployees() }, [fetchEmployees]) const createEmployee = async (data) => { if (DEMO_MODE) { const newEmployee = { ...data, $id: Date.now().toString() } setEmployees(prev => [...prev, newEmployee]) return { success: true, data: newEmployee } } try { // Validierung if (!data.userId || !data.displayName) { return { success: false, error: 'userId und displayName sind erforderlich' } } const response = await databases.createDocument( DATABASE_ID, COLLECTIONS.EMPLOYEES, ID.unique(), { userId: data.userId, displayName: data.displayName, email: data.email || '', shortcode: data.shortcode || '' } ) setEmployees(prev => [...prev, response]) return { success: true, data: response } } catch (err) { console.error('Error creating employee:', err) return { success: false, error: err.message } } } const updateEmployee = async (id, data) => { if (DEMO_MODE) { setEmployees(prev => prev.map(e => e.$id === id ? { ...e, ...data } : e)) return { success: true } } try { const response = await databases.updateDocument( DATABASE_ID, COLLECTIONS.EMPLOYEES, id, data ) setEmployees(prev => prev.map(e => e.$id === id ? response : e)) return { success: true, data: response } } catch (err) { console.error('Error updating employee:', err) return { success: false, error: err.message } } } const deleteEmployee = async (id) => { if (DEMO_MODE) { setEmployees(prev => prev.filter(e => e.$id !== id)) return { success: true } } try { await databases.deleteDocument( DATABASE_ID, COLLECTIONS.EMPLOYEES, id ) setEmployees(prev => prev.filter(e => e.$id !== id)) return { success: true } } catch (err) { console.error('Error deleting employee:', err) return { success: false, error: err.message } } } /** * Synchronisiert Appwrite Auth Users mit der employees Collection * Erstellt fehlende Einträge für neue Users */ const syncWithAuthUsers = async () => { if (DEMO_MODE) { return { success: true, message: 'Demo-Modus: Keine Synchronisierung nötig' } } setSyncing(true) try { // 1. Lade alle Appwrite Auth Users // Hinweis: In Appwrite 1.5.7 gibt es möglicherweise keine direkte List-Users API // für normale User. Diese Funktion benötigt Server-Side Code oder Admin-API-Key. // Für jetzt implementieren wir einen Workaround: Wir bieten ein manuelles Add-Interface. // Alternative: Wenn der User Appwrite Admin ist, können wir versuchen: // const users = await account.listUsers() // Funktioniert nur mit Admin-Rechten // Da das nicht direkt möglich ist, geben wir eine Info zurück return { success: false, error: 'Automatische Synchronisierung erfordert Admin-API-Zugriff. Bitte füge Mitarbeiter manuell hinzu oder verwende die Appwrite Server API.' } } catch (err) { console.error('Error syncing auth users:', err) return { success: false, error: err.message } } finally { setSyncing(false) } } /** * Erstellt einen Employee-Eintrag für den aktuell eingeloggten User * Nützlich für Self-Service */ const createSelfEmployee = async (shortcode = '') => { if (DEMO_MODE) { return { success: true, message: 'Demo-Modus' } } try { // Hole aktuellen User const currentUser = await account.get() // Prüfe, ob Employee bereits existiert const existing = employees.find(e => e.userId === currentUser.$id) if (existing) { return { success: false, error: 'Mitarbeiter-Eintrag existiert bereits' } } // Erstelle Employee-Eintrag const result = await createEmployee({ userId: currentUser.$id, displayName: currentUser.name || currentUser.email, email: currentUser.email, shortcode: shortcode }) return result } catch (err) { console.error('Error creating self employee:', err) return { success: false, error: err.message } } } return { employees, loading, error, syncing, refresh: fetchEmployees, createEmployee, updateEmployee, deleteEmployee, syncWithAuthUsers, createSelfEmployee } }