import type { Point, FurnitureItem } from '@house-plan-maker/shared'; import { generateLocalId } from '../utils/geometry'; import type { FurnitureDef } from '../symbols/furniture'; export interface FurniturePlacementPreview { readonly x: number; readonly y: number; readonly width: number; readonly depth: number; readonly rotation: number; readonly isValid: boolean; } /** * Compute furniture placement preview. * The x,y represents the top-left corner of the furniture piece. * The cursor world point is treated as the desired center, so we offset * by half-width and half-depth to get the top-left corner. */ export function computeFurniturePreview( worldPoint: Point, furnitureDef: FurnitureDef, rotation: number = 0, ): FurniturePlacementPreview { return { x: worldPoint.x - furnitureDef.width / 2, y: worldPoint.y - furnitureDef.depth / 2, width: furnitureDef.width, depth: furnitureDef.depth, rotation, isValid: true, }; } /** * Create a FurnitureItem from placement data. */ export function createFurnitureItemFromPlacement( roomId: string, preview: FurniturePlacementPreview, furnitureDef: FurnitureDef, ): FurnitureItem { return { id: generateLocalId(), roomId, type: furnitureDef.type, x: preview.x, y: preview.y, width: preview.width, depth: preview.depth, height: furnitureDef.height, rotation: preview.rotation, elevationFromFloor: furnitureDef.type === 'AC_UNIT' ? 2.2 : furnitureDef.height <= 0.05 ? 1.2 : 0, label: furnitureDef.label, }; } /** Rotate a furniture item by the given delta in degrees. */ export function rotateFurniture(item: FurnitureItem, deltaDeg: number): FurnitureItem { return { ...item, rotation: (item.rotation + deltaDeg) % 360, }; } /** Move a furniture item to a new position. */ export function moveFurniture(item: FurnitureItem, newPos: Point): FurnitureItem { return { ...item, x: newPos.x, y: newPos.y, }; }