(function () {
  var paypalLibraryUrl = undefined
  
    
  paypalLibraryUrl = "https://www.paypal.com/sdk/js?client-id=AUX_Mkpz1Vwo2plR1NePSdXAhjXPDS9PYgLijpfYAmHduLh7F1Sqv9cVYIGWCi4fLYrt14GMjq6XcVJN&merchant-id=Y9J6JXHS5MPP6&components=messages&currency=EUR"
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
  if (paypalLibraryUrl === undefined) {
    return
  }
  // Preloading the SDK on every page is justified by the banner being shown on the product page.
  loadPaypalLibrary()

  // This is used in a setTimeout call, need to consider this value when styling.
  const placeholderFadeDurationMs = 2500
  var currentProductPriceAmount = undefined

  return function () {
    if (window.eComEventTarget) {
      window.eComEventTarget.addEventListener('product', onProductEvent)
      window.eComEventTarget.addEventListener('cart:add', onCartAddEvent)
      window.eComEventTarget.addEventListener('cart', onCheckoutEvent)
    }
  }()

  function onProductEvent (event) {
    var pageViewType = 'product'
    var bannerContainerId = getBannerContainerId(pageViewType)

    if (!isPaypalIframePresent()) {
      showPlaceholder(bannerContainerId, pageViewType)
    }
    var product = event.detail.product.toJS()
    var cart = event.detail.cart.toJS()
    if (!product.price) {
      return
    }
    var amount = product.price.amount
    currentProductPriceAmount = amount
    if (cart.grandTotal) {
      amount += cart.grandTotal.amount
    }

    setBannerContainerInfo(bannerContainerId, pageViewType, amount)
    showRatenkaufBanner()
    hidePlaceholder(bannerContainerId)
  }

  function onCartAddEvent (event) {
    var pageViewType = 'product'
    var bannerContainerId = getBannerContainerId(pageViewType)

    var cart = event.detail.cart
    if (!cart.grandTotal) {
      return
    }
    var amount = cart.grandTotal.amount + currentProductPriceAmount

    updateBannerContainerAmount(bannerContainerId, amount)
  }

  function onCheckoutEvent (event) {
    var pageViewType = 'cart'
    var bannerContainerId = getBannerContainerId(pageViewType)

    showPlaceholder(bannerContainerId, pageViewType)
    var cart = event.detail.cart
    if (!cart.grandTotal || cart.grandTotal.amount <= 0) {
      return
    }
    var amount = cart.grandTotal.amount

    setBannerContainerInfo(bannerContainerId, pageViewType, amount)
    showRatenkaufBanner()
    hidePlaceholder(bannerContainerId)
  }

  function loadPaypalLibrary () {
    var paypalRatenkaufScriptElement = document.createElement('script')
    paypalRatenkaufScriptElement.setAttribute('data-namespace', 'paypalRatenkaufLibrary')
    paypalRatenkaufScriptElement.src = paypalLibraryUrl
    document.body.appendChild(paypalRatenkaufScriptElement)
    return paypalRatenkaufScriptElement
  }

  function callPaypalLibrary () {
    window.paypalRatenkaufLibrary.Messages({
      countryCode: getShopperLocale(),
    })
  }

  function showRatenkaufBanner (callback) {
    if (window.paypalRatenkaufLibrary !== undefined) {
      callPaypalLibrary()
      return
    }
    // Fallback if library did not preload for some reason. Not expected to happen.
    loadPaypalLibrary().addEventListener('load', () => {
      callPaypalLibrary()
    }, {
      once: true
    })
  }

  function showPlaceholder (bannerContainerId, pageViewType) {
    if (document.querySelector('#' + bannerContainerId + ' .paypal-placeholder') == null) {
      var bannerContainer = document.querySelector('#' + bannerContainerId)
      var placeholderContainer = document.createElement('span')
      placeholderContainer.setAttribute('class', 'paypal-placeholder')
      var placeholder = document.createElement('span')
      // Reuse FontAwesome font for spinner which is also used for loading indicator in epages-ui buttons
      placeholder.setAttribute('class', 'fa fa-spin fa-circle-o-notch')
      placeholder.style.color = '#263164'
      bannerContainer.style.position = 'relative'
      placeholderContainer.style.display = 'flex'
      placeholderContainer.style.justifyContent = 'center'
      placeholderContainer.style.alignContent = 'center'
      placeholderContainer.style.backgroundColor = '#e4e4e4b5'
      placeholderContainer.style.padding = '11px'
      placeholderContainer.style.width = '305px'
      placeholderContainer.style.position = 'absolute'
      placeholderContainer.style.transition = `opacity ${placeholderFadeDurationMs}ms`
      placeholderContainer.appendChild(placeholder)
      bannerContainer.insertBefore(placeholderContainer, bannerContainer.firstChild)
    }
  }

  function hidePlaceholder (bannerContainerId) {
    var placeholderContainer = document.querySelector('#' + bannerContainerId + ' .paypal-placeholder')
    if (placeholderContainer == null) {
      return
    }
    var timer = setInterval(() => {
      if (placeholderContainer != null && isPaypalIframePresent(bannerContainerId)) {
        placeholderContainer.style.opacity = '0'
        setTimeout(() => placeholderContainer.remove(), placeholderFadeDurationMs)
        clearInterval(timer)
      }
    }, 100)
  }

  function isPaypalIframePresent (bannerContainerId) {
    return document.querySelector('#' + bannerContainerId + ' iframe') != null
  }

  function getShopperLocale () {
    var countryCode = 'DE'
    if (document.documentElement && document.documentElement.lang) {
      countryCode = document.documentElement.lang.toUpperCase()
    }
    return countryCode
  }

  function getBannerContainerId (pageViewType) {
    return pageViewType === 'cart' ? 'ep-app-area-cart-view-cart-totals' : 'ep-app-area-product-view-price'
  }

  function setBannerContainerInfo (bannerContainerId, pageViewType, amount) {
    var bannerContainer = document.getElementById(bannerContainerId)
    bannerContainer.setAttribute('data-pp-message', '')
    bannerContainer.setAttribute('data-pp-placement', pageViewType)
    bannerContainer.setAttribute('data-pp-amount', amount)
    return bannerContainerId
  }

  function updateBannerContainerAmount (bannerContainerId, amount) {
    var bannerContainer = document.getElementById(bannerContainerId)
    bannerContainer.setAttribute('data-pp-amount', amount)
    return amount
  }
}())
