import { MEETING_CENTER, ZONES } from "./constants"; import type { Point } from "./types"; export interface DeskSlot { x: number; y: number; } function gridSlots( zone: { x: number; y: number; width: number; height: number }, cols: number, rows: number, padX: number, padTop: number, padBottom: number, ): DeskSlot[] { const availW = zone.width - padX * 2; const availH = zone.height - padTop - padBottom; const cellW = availW / cols; const cellH = availH / rows; const slots: DeskSlot[] = []; for (let row = 0; row < rows; row++) { for (let col = 0; col < cols; col++) { slots.push({ x: Math.round(zone.x + padX + cellW * (col + 0.5)), y: Math.round(zone.y + padTop + cellH * (row + 0.5)), }); } } return slots; } /** 6 fixed desks for main agents (3 × 2). */ export const DESK_SLOTS = gridSlots(ZONES.desk, 3, 2, 60, 66, 40); /** 8 hot desks for subagents (4 × 2). */ export const HOT_DESK_SLOTS = gridSlots(ZONES.hotDesk, 4, 2, 50, 70, 36); /** Standing spots in the lounge, between the sofas and the reception desk. */ export const LOUNGE_ANCHORS: Point[] = (() => { const lz = ZONES.lounge; return [ { x: lz.x + 200, y: lz.y + 88 }, { x: lz.x + 265, y: lz.y + 140 }, { x: lz.x + 360, y: lz.y + 88 }, { x: lz.x + 60, y: lz.y + 150 }, { x: lz.x + 145, y: lz.y + 140 }, { x: lz.x + 430, y: lz.y + 150 }, ]; })(); /** Circular seats around the meeting table. */ export function meetingSeats(count: number, center: Point = MEETING_CENTER): Point[] { const radius = Math.min(74 + count * 6, 108); return Array.from({ length: count }, (_, i) => { const angle = (2 * Math.PI * i) / count - Math.PI / 2; return { x: Math.round(center.x + Math.cos(angle) * radius), y: Math.round(center.y + Math.sin(angle) * radius), }; }); }