# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # frozen_string_literal: true class TablesArrangementsController < ApplicationController def index current_digest = Tables::Distribution.digest(current_tenant) render json: TablesArrangement .order(valid: :desc) .order(discomfort: :asc) .select(:id, :name, :discomfort) .select("digest = '#{current_digest}'::uuid as valid") .limit(20) .as_json(only: %i[id name discomfort valid]) 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 def create TableSimulatorJob.perform_later(current_tenant.id) render json: {}, status: :created 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