# frozen_string_literal: true

# License: AGPL-3.0-or-later WITH WTO-AP-3.0-or-later
# Full license explanation at https://github.com/houdiniproject/houdini/blob/master/LICENSE
module QueueDonations
  # def self.execute_for_donation(id)
  #   donation = Donation.find(id)
  #   return unless donation

  #   execute([donation])
  # end

  # def self.execute_all
  #   donations = fetch_donations
  #   return if donations.empty?

  #   donations_ids = donations.collect(&:id)

  #   execute(donations)
  # end

  # def self.dry_execute_all
  #   puts 'dry push donations to civi'
  #   donations = fetch_donations
  #   return if donations.empty?

  #   donations_ids = donations.collect(&:id)

  #   dry_execute(donations)
  # end

  # private

  # def self.execute(donations)
  #   push(donations)

  #   donations_ids = donations.collect(&:id)
  #   set_queued_for_import_at(donations_ids)
  # rescue Bunny::Exception, Bunny::ClientTimeout, Bunny::ConnectionTimeout
  #   Rails.logger.warn "Bunny error: QueueDonations.execute failed for ids #{donations_ids}"
  #   nil
  # end

  # def self.dry_execute(donations)
  #   push(donations)
  # rescue Bunny::Exception, Bunny::ClientTimeout, Bunny::ConnectionTimeout
  #   Rails.logger.warn "Bunny error: QueueDonations.dry_execute failed for ids #{donations_ids}"
  #   nil
  # end

  # def self.push(donations)
  #   connection = Bunny.new(
  #     host: Settings.integration.host,
  #     vhost: Settings.integration.vhost,
  #     user: Settings.integration.user,
  #     password: Settings.integration.password
  #   )
  #   connection.start
  #   channel = connection.create_channel
  #   exchange = channel.topic(Settings.integration.exchange, durable: true)

  #   donations.each do |donation|
  #     exchange.publish(
  #       prepare_donation_params(donation).to_json,
  #       routing_key: Settings.integration.routing_key
  #     )
  #   end

  #   connection.close
  # end

  # def self.set_queued_for_import_at(ids)
  #   timestamp = Time.current
  #   Qx.update(:donations)
  #     .where('id IN ($ids)', ids: ids)
  #     .set(queued_for_import_at: timestamp)
  #     .execute
  # end

  # def self.fetch_donations
  #   Donation
  #     .where('queued_for_import_at IS null')
  #     .includes(:supporter, :nonprofit, :tracking, :payment, :recurring_donation)
  # end

  # def self.prepare_donation_params(donation)
  #   nonprofit = donation.nonprofit
  #   tracking = donation.tracking
  #   campaign = donation.campaign
  #   recurring = donation.recurring_donation

  #   action_type = :donate
  #   action_technical_type = 'cc.wemove.eu:donate'
  #   action_name = "undefined_#{donation.supporter.locale}"
  #   external_id = campaign ? campaign.external_identifier : "cc_default_#{nonprofit.id}"

  #   data = {
  #     action_type: action_type,
  #     action_technical_type: action_technical_type,
  #     create_dt: donation.created_at,
  #     action_name: action_name || "slug-#{campaign.id}-#{donation.supporter.locale}",
  #     external_id: external_id || "cc_#{campaign.id}",
  #     contact: {},
  #     donation: {}
  #   }

  #   data[:contact] = supporter_data(donation.supporter)
  #   data[:donation] = donation_data(donation)
  #   data[:source] = tracking_data(donation.tracking) if donation.tracking
  #   data[:recurring] = recurring_data(donation.recurring_donation) if donation.recurring_donation

  #   data
  # end

  # def self.supporter_data(supporter)
  #   {
  #     language: supporter.locale,
  #     firstname: supporter.first_name,
  #     lastname: supporter.last_name,
  #     emails: [
  #       { email: supporter.email }
  #     ],
  #     addresses: [
  #       { zip: supporter.zip_code, country: supporter.country }
  #     ]
  #   }
  # end

  # def self.donation_data(donation)
  #   common_data = {
  #     amount: donation.amount / 100.0,
  #     currency: donation.nonprofit.currency,
  #     recurring_id: donation.recurring_donation ? "cc_#{donation.recurring_donation.id}" : nil,
  #     external_identifier: "cc_#{donation.id}",
  #     type: donation.recurring ? 'recurring' : 'single'
  #   }

  #   if donation.card_id
  #     data = common_data.merge(
  #       payment_processor: 'stripe',
  #       amount_charged: donation.payment.charge.amount / 100.0,
  #       transaction_id: donation.payment.charge.stripe_charge_id,
  #       status: donation.payment.charge.paid? ? 'success' : 'not_paid'
  #     )
  #   elsif donation.direct_debit_detail_id
  #     data = common_data.merge(
  #       payment_processor: 'sepa',
  #       amount_charged: 0,
  #       transaction_id: "cc_#{donation.id}",
  #       iban: donation.direct_debit_detail.iban,
  #       bic: donation.direct_debit_detail.bic,
  #       account_holder: donation.direct_debit_detail.account_holder_name,
  #       status: 'success'
  #     )
  #   end

  #   data
  # end

  # def self.recurring_data(recurring)
  #   {
  #     id: recurring.id,
  #     start: recurring.start_date,
  #     time_unit: recurring.time_unit,
  #     active: recurring.active
  #   }
  # end

  # def self.tracking_data(tracking)
  #   {
  #     source: tracking.utm_source,
  #     medium: tracking.utm_medium,
  #     campaign: tracking.utm_campaign,
  #     content: tracking.utm_content
  #   }
  # end
end