export type AgentStatus =
  | "idle"
  | "thinking"
  | "tool_calling"
  | "speaking"
  | "spawning"
  | "error"
  | "offline";

export type AgentZone = "desk" | "meeting" | "hotDesk" | "lounge" | "corridor";

export type AgentRole = "lead" | "agent" | "subagent";

export interface Point {
  x: number;
  y: number;
}

export interface MovementState {
  path: Point[];
  /** total walk duration in seconds */
  duration: number;
  /** elapsed seconds */
  elapsed: number;
  toZone: AgentZone;
  /** status to apply when the walk finishes */
  arriveStatus?: AgentStatus;
  /** remove the agent from the office when the walk finishes */
  despawnOnArrive?: boolean;
}

export interface ToolCall {
  name: string;
  startedAt: number;
}

export interface VisualAgent {
  id: string;
  name: string;
  role: AgentRole;
  /** model tag shown in the detail panel, e.g. "fable-5" */
  model: string;
  status: AgentStatus;
  position: Point;
  zone: AgentZone;
  /** permanently assigned seat (desk / hot-desk slot centre) */
  homePosition: Point;
  homeZone: AgentZone;
  homeSlot: number;
  currentTool: ToolCall | null;
  speech: string | null;
  movement: MovementState | null;
  parentId: string | null;
  childIds: string[];
  toolCallCount: number;
  toolHistory: string[];
  spawnedAt: number;
}

export interface CollaborationLink {
  sourceId: string;
  targetId: string;
  strength: number;
  kind: "spawn" | "meeting";
}

export interface Meeting {
  id: string;
  agentIds: string[];
  center: Point;
}

export interface OfficeEvent {
  at: number;
  text: string;
  icon: string;
}
