# Copyright (C) 2024 Manuel Bustillo # frozen_string_literal: true class TablesArrangementsController < ApplicationController def index render json: TablesArrangement.order(discomfort: :asc).limit(3).as_json(only: %i[id name discomfort]) end def show Guest.joins(:seats, :group) .where(seats: { tables_arrangement_id: params[:id] }) .select('guests.*', 'groups.color', 'seats.table_number') .group_by(&:table_number) .map { |number, guests| format(number:, guests:) } .then { |result| render json: { id: params[:id], tables: result } } end private def format(number:, guests:) { number: number, discomfort: discomfort(guests: guests), guests: guests.as_json(only: %i[id name color]) } end def discomfort(guests:) table = Tables::Table.new(guests) table.min_per_table = TableSimulatorJob::MIN_PER_TABLE table.max_per_table = TableSimulatorJob::MAX_PER_TABLE calculator = Tables::DiscomfortCalculator.new(table:) { discomfort: calculator.calculate, breakdown: calculator.breakdown } end end