namespace :effective_qb_sync do

desc 'Overwrite all quickbooks item names with current acts_as_purchasable object qb_item_name'
task overwrite_qb_item_names: :environment do
  puts 'WARNING: this task will overwrite all quickbooks item names with new qb_item_names. Proceed? (y/n)'
  (puts 'Aborted' and exit) unless STDIN.gets.chomp.downcase == 'y'

  Effective::QbOrderItem.transaction do
    begin

      Effective::QbOrderItem.includes(order_item: :purchasable).find_each do |qb_order_item|
        order_item = qb_order_item.order_item
        purchasable = qb_order_item.order_item.purchasable

        new_qb_item_name = purchasable.qb_item_name

        unless new_qb_item_name
          raise "acts_as_purchasable object #{order_item.purchasable_type.try(:classify)}<#{order_item.purchasable_id}>.qb_item_name() from Effective::OrderItem<#{order_item.id}> cannot be nil."
        end

        qb_order_item.update_column(:name, new_qb_item_name) # This intentionally skips validation
      end

      puts 'Successfully updated all quickbooks item names.'
    rescue => e
      puts "An error has occurred: #{e.message}"
      puts "(effective_qb_sync) Rollback. No quickbooks item names have been changed."
      raise ActiveRecord::Rollback
    end
  end
end

end