module Pay::LemonSqueezy

def self.api_key

def self.api_key
  find_value_by_name(:lemon_squeezy, :api_key)
end

def self.configure_webhooks

def self.configure_webhooks
  Pay::Webhooks.configure do |events|
    events.subscribe "lemon_squeezy.order_created", Pay::LemonSqueezy::Webhooks::Order.new
    events.subscribe "lemon_squeezy.subscription_created", Pay::LemonSqueezy::Webhooks::Subscription.new
    events.subscribe "lemon_squeezy.subscription_updated", Pay::LemonSqueezy::Webhooks::Subscription.new
    events.subscribe "lemon_squeezy.subscription_payment_refunded", Pay::LemonSqueezy::Webhooks::SubscriptionPayment.new
    events.subscribe "lemon_squeezy.subscription_payment_success", Pay::LemonSqueezy::Webhooks::SubscriptionPayment.new
  end
end

def self.construct_from_webhook_event(event)

def self.construct_from_webhook_event(event)
  data = event["data"]
  case data
  when Array
    data.map do |object|
      construct_from_webhook_event(object)
    end
  when Hash
    type = {
      "orders" => ::LemonSqueezy::Order,
      "subscriptions" => ::LemonSqueezy::Subscription,
      "subscription-invoices" => ::LemonSqueezy::SubscriptionInvoice
    }.fetch(data["type"])
    object = type.new(data)
    object.meta = event["meta"]
    object
  end
end

def self.enabled?

def self.enabled?
  return false unless Pay.enabled_processors.include?(:lemon_squeezy) && defined?(::LemonSqueezy)
  Pay::Engine.version_matches?(required: "~> 1.0", current: ::LemonSqueezy::VERSION) || (raise "[Pay] lemonsqueezy gem must be version ~> 1.0")
end

def self.owner_from_passthrough(passthrough)

def self.owner_from_passthrough(passthrough)
  GlobalID::Locator.locate_signed passthrough
rescue JSON::ParserError
  nil
end

def self.passthrough(owner:, **options)

def self.passthrough(owner:, **options)
  owner.to_sgid.to_s
end

def self.setup

def self.setup
  ::LemonSqueezy.config.api_key = api_key
end

def self.signing_secret

def self.signing_secret
  find_value_by_name(:lemon_squeezy, :signing_secret)
end

def self.store_id

def self.store_id
  find_value_by_name(:lemon_squeezy, :store_id)
end

def self.sync_order(order_id, object: nil)

An Order may have subscriptions or be a one-time purchase
def self.sync_order(order_id, object: nil)
  subscriptions = ::LemonSqueezy::Subscription.list(order_id: order_id).data
  subscriptions.each do |subscription|
    Pay::LemonSqueezy::Subscription.sync(subscription.id, object: subscription)
    ::LemonSqueezy::SubscriptionInvoice.list(subscription_id: subscription.id).data.each do |invoice|
      Pay::LemonSqueezy::Charge.sync_subscription_invoice(invoice.id, object: invoice)
    end
  end
  if subscriptions.empty?
    Pay::LemonSqueezy::Charge.sync_order(order_id, object: object)
  end
end