# frozen_string_literal: true

# This worker perform various requests to the Stripe API (payment service)
class SyncMembersOnStripeWorker
  include Sidekiq::Worker
  sidekiq_options lock: :until_executed, on_conflict: :reject, queue: :stripe

  def perform(notify_user_id = nil)
    logger.debug 'We create all non-existing customers on stripe. This may take a while...'
    total = User.online_payers.count
    User.online_payers.each_with_index do |member, index|
      logger.debug "#{index} / #{total}"
      begin
        stp_customer = Stripe::Customer.retrieve(member.stp_customer_id, api_key: Setting.get('stripe_secret_key'))
        StripeWorker.new.create_stripe_customer(member.id) if stp_customer.nil? || stp_customer[:deleted]
      rescue Stripe::InvalidRequestError
        StripeWorker.new.create_stripe_customer(member.id)
      end
    end
    logger.debug 'Sync is done'
    return unless notify_user_id

    logger.debug "Notify user #{notify_user_id}"
    user = User.find(notify_user_id)
    NotificationCenter.call type: :notify_admin_members_stripe_sync,
                            receiver: user,
                            attached_object: user
  end
end