using GB5Shared.DTO.Framework.Login; using MMDAL.DTO.Scheduling; namespace MMBLL.Scheduling.Engine { public interface ISlotFinder { // Non-interruptible: returns a single SlotProposal covering DurationMinutes contiguously. // Interruptible: returns multiple proposals (segments) that together cover DurationMinutes. // RejectReason: "" = success, "NoShift" = no shift windows, "FullyBooked" = windows exist but capacity exhausted. Task<(IReadOnlyList Proposals, string RejectReason)> FindSlotAsync( ExecutionUnit eu, MachineCandidateDTO candidate, SchedulingContext context, LoginDTO login, CancellationToken ct); // Parallel mode (SPLITS > 1): finds simultaneous free slots across N candidates. // Returns N proposals (one per machine) or empty if no simultaneous window exists. Task> FindParallelSlotsAsync( ExecutionUnit eu, IReadOnlyList candidates, SchedulingContext context, LoginDTO login, CancellationToken ct); } }