import { ModelBuilder, HttpSolverClient, parseSolverResponse } from "dabke";
// Define the scheduling problem
const builder = new ModelBuilder({
employees: [
{ id: "alice", roleIds: ["server"] },
{ id: "bob", roleIds: ["server"] },
],
shiftPatterns: [
{ id: "morning", startTime: { hours: 8 }, endTime: { hours: 16 } },
{ id: "evening", startTime: { hours: 16 }, endTime: { hours: 23 } },
],
coverage: [
{
day: "2026-02-09",
startTime: { hours: 8 },
endTime: { hours: 16 },
roleIds: ["server"],
targetCount: 1,
priority: "MANDATORY",
},
{
day: "2026-02-09",
startTime: { hours: 16 },
endTime: { hours: 23 },
roleIds: ["server"],
targetCount: 1,
priority: "MANDATORY",
},
],
schedulingPeriod: {
dateRange: { start: "2026-02-09", end: "2026-02-10" },
},
ruleConfigs: [
{ name: "max-hours-day", config: { hours: 8, priority: "MANDATORY" } },
{ name: "min-rest-between-shifts", config: { hours: 10, priority: "MANDATORY" } },
],
});
// Compile to a solver request
const { request, canSolve, validation } = builder.compile();
if (!canSolve) {
console.error("Cannot solve:", validation.errors);
process.exit(1);
}
// Solve
const solver = new HttpSolverClient(fetch, "http://localhost:8080");
const response = await solver.solve(request);
const result = parseSolverResponse(response);
console.log("Status:", result.status);
for (const assignment of result.assignments) {
console.log(`${assignment.employeeId} → ${assignment.shiftPatternId} on ${assignment.day}`);
}