class WebhooksController < ApplicationController
  skip_forgery_protection

  before_action :authorize_request

  def lndhub
    begin
      payload = JSON.parse(request.body.read, symbolize_names: true)
      head :no_content and return unless payload[:type] == "incoming"
    rescue
      head :unprocessable_entity and return
    end

    user = User.find_by!(ln_account: payload[:user_login])
    notify = user.preferences[:lightning_notify_sats_received]
    case notify
    when "xmpp"
      notify_xmpp(user.address, payload[:amount], payload[:memo])
    when "email"
      NotificationMailer.with(user: user, amount_sats: payload[:amount])
                        .lightning_sats_received.deliver_later
    end

    head :ok
  end

  private

  # TODO refactor into mailer-like generic class/service
  def notify_xmpp(address, amt_sats, memo)
    payload = {
      type: "normal",
      from: Setting.xmpp_notifications_from_address,
      to: address,
      subject: "Sats received!",
      body: "#{helpers.number_with_delimiter amt_sats} sats received in your Lightning wallet:\n> #{memo}"
    }
    XmppSendMessageJob.perform_later(payload)
  end

  def authorize_request
    if !ENV['WEBHOOKS_ALLOWED_IPS'].split(',').include?(request.remote_ip)
      head :forbidden and return
    end
  end
end
