# frozen_string_literal: true

# Send a reminder email to the user who has made a reservation
class ReservationReminderWorker
  include Sidekiq::Worker

  ## In case the reminder is enabled but no delay were configured, we use this default value
  DEFAULT_REMINDER_DELAY = 24.hours

  def perform
    return unless Setting.get('reminder_enable')

    delay = Setting.find_by(name: 'reminder_delay').try(:value).try(:to_i).try(:hours) || DEFAULT_REMINDER_DELAY

    starting = Time.current.beginning_of_hour + delay
    ending = starting + 1.hour

    Reservation.joins(slots_reservations: :slot)
               .where('slots.start_at >= ? AND slots.start_at <= ? AND slots_reservations.canceled_at IS NULL', starting, ending)
               .includes(:reservable, :slots_reservations)
               .each do |r|
      already_sent = Notification.where(
        attached_object_type: Reservation.name,
        attached_object_id: r.id,
        notification_type_id: NotificationType.find_by(name: 'notify_member_reservation_reminder')
      ).count
      next if already_sent.positive?
      next if r.reservable.is_a?(Event) && r.reservable.pre_registration? && !r.slots_reservations.all?(&:is_valid?)

      NotificationCenter.call type: 'notify_member_reservation_reminder',
                              receiver: r.user,
                              attached_object: r
    end
  end
end
