import { Serializable } from "../api/abstract-api"; import { Entity } from "./definitions"; import { Guest } from "./guest"; export type Discomfort = { discomfort: number; breakdown: { tableSizePenalty: number; cohesionPenalty: number; } } export type Table = { number: number; guests: Guest[]; discomfort: Discomfort; } export class TableSimulation implements Entity { id: string; tables: Table[]; constructor(id: string, tables: Table[]) { this.id = id; this.tables = tables; } } export class TableSimulationSerializer implements Serializable { fromJson(data: any): TableSimulation { return new TableSimulation(data.id, data.tables.map((table: any) => { return { number: table.number, guests: table.guests.map((guest: any) => new Guest(guest.id, guest.name, guest.group?.name, guest.group?.id, guest.color)), discomfort: { discomfort: table.discomfort.discomfort, breakdown: { tableSizePenalty: table.discomfort.breakdown.table_size_penalty, cohesionPenalty: table.discomfort.breakdown.cohesion_penalty, } }, } })); } toJson(simulation: TableSimulation): string { return JSON.stringify({ simulation: { tables: simulation.tables.map((table) => { return { number: table.number, guests: table.guests.map((guest) => { return { id: guest.id, name: guest.name, group_id: guest.groupId, color: guest.color, status: guest.status, children: guest.children, } }), discomfort: table.discomfort, } }) } }); } apiPath(): string { return 'tables_arrangements'; } }