# Copyright (C) 2024 Manuel Bustillo

# == Schema Information
#
# Table name: guests
#
#  id         :uuid             not null, primary key
#  name       :string
#  phone      :string
#  status     :integer          default("considered")
#  created_at :datetime         not null
#  updated_at :datetime         not null
#  group_id   :uuid             not null
#  wedding_id :uuid             not null
#
# Indexes
#
#  index_guests_on_group_id    (group_id)
#  index_guests_on_wedding_id  (wedding_id)
#
# Foreign Keys
#
#  fk_rails_...  (group_id => groups.id)
#  fk_rails_...  (wedding_id => weddings.id)
#
class Guest < ApplicationRecord
  acts_as_tenant :wedding
  belongs_to :group

  enum :status, {
    considered: 0,
    invited: 10,
    confirmed: 20,
    declined: 30,
    tentative: 40
  }, validate: true

  validates :name, presence: true

  scope :potential, -> { where.not(status: %i[declined considered]) }

  after_save :recalculate_simulations, if: :saved_change_to_status?
  after_destroy :recalculate_simulations

  has_many :seats, dependent: :delete_all

  private

  def recalculate_simulations
    TablesArrangement.delete_all

    ActiveJob.perform_all_later(50.times.map { TableSimulatorJob.new(wedding_id) })
  end
end