import { useState } from 'react'
import { Box, FormControlLabel, Switch, Typography } from '@mui/material'
import { AlertTriangle, Mail } from 'lucide-react'
import type { TeamAgent } from '../../domain/teamAgent'
import { AgentStatus } from '../../domain/teamAgent'
import { AgentAvatar } from './AgentAvatar'
import { AgentStatusBadge } from './AgentBadges'
import { ConfirmDialog } from '../ui'
import { useSetAgentActive } from '../../hooks/useTeamAgents'
import { DS_BG, DS_BORDER, DS_SURFACE, DS_TEXT } from '../../lib/ds'
import { formatTeamDateTime } from '../../lib/teamClock'
interface Props {
agent: TeamAgent
}
/** Mehr als vier Stichworte liest im Kopfbereich niemand mehr. */
const MAX_RESPONSIBILITIES = 4
const LABEL_MAX_CHARS = 42
/**
* Verdichtet eine ausformulierte Zuständigkeit auf ein Stichwort.
* Schneidet am ersten Komma, sonst an der Wortgrenze — der volle Wortlaut
* bleibt als Titel am Element erhalten, es geht also keine Aussage verloren.
*/
function shortLabel(text: string): string {
const head = text.split(',')[0].trim()
if (head.length <= LABEL_MAX_CHARS) return head
const cut = head.slice(0, LABEL_MAX_CHARS)
return `${cut.slice(0, cut.lastIndexOf(' '))} …`
}
function MetaField({ label, value }: { label: string; value: string }) {
return (
{label}
{value}
)
}
/**
* Kopfbereich des Personalblatts (§7.3).
*
* Das Pausieren läuft über einen Bestätigungsdialog mit Hinweis auf die
* betroffenen Aufgaben — ein versehentlich pausierter Fristen-Wächter würde
* echte Termine verpassen (§7.5, §17.3).
*/
export function AgentDossierHeader({ agent }: Props) {
const [confirmPause, setConfirmPause] = useState(false)
const setActive = useSetAgentActive()
const isActive = agent.status === AgentStatus.ACTIVE
const enabledTasks = agent.tasks.filter(t => t.enabled).length
const handleToggle = (next: boolean) => {
if (next) setActive.mutate({ id: agent.id, active: true })
else setConfirmPause(true)
}
return (
{agent.name}
{agent.role}
{agent.email}
{/* Kurzer Beschrieb und Zuständigkeiten stehen jetzt oben statt tief im
Dossier — das ist die Frage, die man beim Öffnen zuerst hat. */}
{agent.shortDescription}
{agent.responsibilities.length > 0 && (
Zuständig für:
{agent.responsibilities.slice(0, MAX_RESPONSIBILITIES).map((r, i) => (
{i > 0 && ·}
{shortLabel(r)}
))}
)}
handleToggle(e.target.checked)}
slotProps={{ input: { 'aria-label': `${agent.name} aktiv` } }}
/>
}
label="Agent aktiv"
sx={{ mr: 0, '& .MuiFormControlLabel-label': { fontWeight: 600, fontSize: '0.875rem' } }}
/>
{/* Stammdaten */}
{/* Warnung im Personalblatt, solange pausiert (§7.5) */}
{!isActive && (
{agent.name} ist pausiert. Bis zur Reaktivierung werden keine Aufgaben ausgeführt und es
entstehen keine neuen Vorgänge.
)}
{
setActive.mutate({ id: agent.id, active: false })
setConfirmPause(false)
}}
onCancel={() => setConfirmPause(false)}
/>
)
}