# frozen_string_literal: true

# This worker perform various requests to the Stripe API (payment service)
class StripeWorker
  require 'stripe/helper'
  include Sidekiq::Worker
  sidekiq_options queue: :stripe

  def perform(action, *params)
    return false unless Stripe::Helper.enabled?

    send(action, *params)
  end

  def create_stripe_customer(user_id)
    user = User.find(user_id)
    customer = Stripe::Customer.create(
      {
        description: user.profile.full_name,
        email: user.email
      },
      { api_key: Setting.get('stripe_secret_key') }
    )
    pgo = PaymentGatewayObject.find_or_initialize_by(item: user)
    pgo.gateway_object = customer
    pgo.save!
  end

  def delete_stripe_coupon(coupon_code)
    cpn = Stripe::Coupon.retrieve(coupon_code, api_key: Setting.get('stripe_secret_key'))
    cpn.delete
  rescue Stripe::InvalidRequestError => e
    STDERR.puts "WARNING: Unable to delete the coupon on Stripe: #{e}"
  end

  def create_or_update_stp_product(class_name, id)
    object = class_name.constantize.find(id)
    if !object.payment_gateway_object.nil?
      Stripe::Product.update(
        object.payment_gateway_object.gateway_object_id,
        { name: object.name },
        { api_key: Setting.get('stripe_secret_key') }
      )
    else
      product = Stripe::Product.create(
        {
          name: object.name,
          metadata: {
            id: object.id,
            type: class_name
          }
        }, { api_key: Setting.get('stripe_secret_key') }
      )
      pgo = PaymentGatewayObject.new(item: object)
      pgo.gateway_object = product
      pgo.save!
      puts "Stripe product was created for the #{class_name} \##{id}"
    end

  rescue Stripe::InvalidRequestError
    obj_id = object.payment_gateway_object.gateway_object_id
    STDERR.puts "WARNING: saved payment_gateway_object#id (#{obj_id}) does not match on Stripe, recreating..."
    product = Stripe::Product.create(
      {
        name: object.name,
        metadata: {
          id: object.id,
          type: class_name
        }
      }, { api_key: Setting.get('stripe_secret_key') }
    )
    pgo = PaymentGatewayObject.new(item: object)
    pgo.gateway_object = product
    pgo.save!
    puts "Stripe product was created for the #{class_name} \##{id}"
  end
end