package printjob import ( "fmt" "printer.backend/internal/model" ) // CollectImageRefs returns all order images in job order (orders, then images within each order). func CollectImageRefs(orders []model.Order) []model.PrintJobImageRef { var refs []model.PrintJobImageRef for _, o := range orders { for _, img := range o.Images { refs = append(refs, model.PrintJobImageRef{ OrderID: o.ID, ImageID: img.ID, }) } } return refs } // AssignSlots maps images to layout slots (at most one image per slot). func AssignSlots(refs []model.PrintJobImageRef, preview model.LayoutPreview) []model.PrintJobSlotAssignment { limit := len(preview.Positions) if len(refs) < limit { limit = len(refs) } out := make([]model.PrintJobSlotAssignment, 0, limit) for i := 0; i < limit; i++ { out = append(out, model.PrintJobSlotAssignment{ Slot: i, Image: refs[i], Position: preview.Positions[i], }) } return out } // Summary builds validation and slot assignments for a print job. func Summary(orders []model.Order, preview model.LayoutPreview) model.PrintJobSummary { refs := CollectImageRefs(orders) slots := preview.Count imageCount := len(refs) overflow := imageCount > slots var warning string if overflow { warning = fmt.Sprintf( "%d Bilder für %d Item-Positionen: %d Bilder werden nicht platziert", imageCount, slots, imageCount-slots, ) } return model.PrintJobSummary{ ImageCount: imageCount, SlotCount: slots, ImageOverflow: overflow, Warning: warning, Assignments: AssignSlots(refs, preview), Preview: preview, } }