import { QueueModel } from 'src/modules/queue/data/models/queue.model'; import { toTime } from '../../helpers/time.helper'; import * as math from 'mathjs'; export class QueueCondition { private ticketItems = {}; constructor(readonly items: QueueModel[]) { items.forEach((item) => { const item_id = item.item.item.item_queue?.id ?? item.item.item.id; const currentItem = this.ticketItems[item_id]; this.ticketItems[item_id] = currentItem ? [...currentItem, item] : [item]; }); } condition(item_id: string) { const queues: QueueModel[] = this.ticketItems[item_id] ?? []; const time = queues[0]?.time; const nearest = time ? toTime(time) : 0; return { available: queues.length == 0, average: this.averageTime(queues), nearest: nearest, crowded_level: queues.length, available_time: nearest, }; } averageTime(queues: QueueModel[]) { if (queues.length == 0) return 0; const calledQueue = queues.filter((q) => q.status === 'called'); const times = calledQueue.map((queue) => { return queue.call_time - queue.time; }); return math.sum(times) / times.length; } }