# frozen_string_literal: true

require_relative 'cart_item'

# A relation table between a pending reservation and a slot
class CartItem::ReservationSlot < ApplicationRecord
  self.table_name = 'cart_item_reservation_slots'

  belongs_to :cart_item, polymorphic: true
  belongs_to :cart_item_machine_reservation, foreign_type: 'CartItem::MachineReservation', foreign_key: 'cart_item_id',
                                             inverse_of: :cart_item_reservation_slots, class_name: 'CartItem::MachineReservation'
  belongs_to :cart_item_space_reservation, foreign_type: 'CartItem::SpaceReservation', foreign_key: 'cart_item_id',
                                           inverse_of: :cart_item_reservation_slots, class_name: 'CartItem::SpaceReservation'
  belongs_to :cart_item_training_reservation, foreign_type: 'CartItem::TrainingReservation', foreign_key: 'cart_item_id',
                                              inverse_of: :cart_item_reservation_slots, class_name: 'CartItem::TrainingReservation'
  belongs_to :cart_item_event_reservation, foreign_type: 'CartItem::EventReservation', foreign_key: 'cart_item_id',
                                           inverse_of: :cart_item_reservation_slots, class_name: 'CartItem::EventReservation'

  belongs_to :slot
  belongs_to :slots_reservation

  after_create :add_to_places_cache
  after_update :remove_from_places_cache, if: :canceled?

  before_destroy :remove_from_places_cache

  private

  def add_to_places_cache
    update_places_cache(:+)
  end

  def remove_from_places_cache
    update_places_cache(:-)
  end

  # @param operation [Symbol] :+ or :-
  def update_places_cache(operation)
    user_method = operation == :+ ? :add_users : :remove_users
    if cart_item_type == 'CartItem::EventReservation'
      Slots::PlacesCacheService.change_places(slot, 'Event', cart_item.event_id, cart_item.total_tickets, operation)
      Slots::PlacesCacheService.send(user_method,
                                     slot,
                                     'Event',
                                     cart_item.event_id,
                                     [cart_item.customer_profile.user_id])
    else
      Slots::PlacesCacheService.change_places(slot, cart_item.reservable_type, cart_item.reservable_id, 1, operation)
      Slots::PlacesCacheService.send(user_method,
                                     slot,
                                     cart_item.reservable_type,
                                     cart_item.reservable_id,
                                     [cart_item.customer_profile.user_id])
    end
  end
end