(function () {
  var paypalLibraryUrl = undefined
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
    
  
  if (paypalLibraryUrl === undefined) {
    return
  }
  // Preloading the SDK on every page is justified by the banner being shown on the product page.
  loadPaypalLibrary()

  const defaultPlaceholderClass = 'ep-app-area-placeholder'
  const defaultPlaceholderFadeDurationMs = 2500
  const defaultPaypalRatenkaufMinimumPrice = 99

  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)

    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
    }

    waitForBannerContainer(bannerContainerId, () => {
      showPlaceholder(bannerContainerId, 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)

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

    waitForBannerContainer(bannerContainerId, () => {
      showPlaceholder(bannerContainerId, 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 () {
    if (window.paypalRatenkaufLibrary !== undefined) {
      callPaypalLibrary()
      return
    }
    // Fallback if library did not preload for any reason. Not expected to happen.
    loadPaypalLibrary().addEventListener('load', () => {
      callPaypalLibrary()
    }, {
      once: true
    })
  }

  function waitForBannerContainer (bannerContainerId, callback) {
    var timer = setInterval(() => {
      var bannerContainer = document.getElementById(bannerContainerId)
      if (bannerContainer != null) {
        callback()
        clearInterval(timer)
      }
    }, 10)
    setTimeout(() => clearInterval(timer), 5000) // give up...
  }

  function showPlaceholder (bannerContainerId, amount) {
    var placeholderClass = getPlaceholderClass(bannerContainerId)
    var paypalRatenkaufMinimumPrice = getPaypalRatenkaufMinimumPrice(bannerContainerId)
    if (getPlaceholder(bannerContainerId, placeholderClass) == null) {
      var placeholder = document.createElement('span')
      placeholder.setAttribute('class', placeholderClass)
      if (amount < paypalRatenkaufMinimumPrice) {
        placeholder.classList.add('below-min-price')
      }
      var bannerContainer = document.getElementById(bannerContainerId)
      bannerContainer.insertBefore(placeholder, bannerContainer.firstChild)
    }
  }

  function getPlaceholderClass (bannerContainerId) {
    var bannerContainer = document.getElementById(bannerContainerId)
    var containerClassParameter = bannerContainer.getAttribute('data-ph-container-class')
    return containerClassParameter ? containerClassParameter : defaultPlaceholderClass
  }

  function getPlaceholderFadeDuration (bannerContainerId) {
    var bannerContainer = document.getElementById(bannerContainerId)
    var placeholderFadeDurationParameter = bannerContainer.getAttribute('data-ph-placeholder-fade-duration-ms')
    return placeholderFadeDurationParameter ? placeholderFadeDurationParameter : defaultPlaceholderFadeDurationMs
  }

  function getPaypalRatenkaufMinimumPrice (bannerContainerId) {
    var bannerContainer = document.getElementById(bannerContainerId)
    var ratenkaufMinPrice = bannerContainer.getAttribute('data-ph-placeholder-pp-rk-min-price')
    return ratenkaufMinPrice ? ratenkaufMinPrice : defaultPaypalRatenkaufMinimumPrice
  }

  function hidePlaceholder (bannerContainerId) {
    var placeholder = getPlaceholder(bannerContainerId, getPlaceholderClass(bannerContainerId))
    if (placeholder == null) {
      return
    }
    var placeholderFadeDuration = getPlaceholderFadeDuration(bannerContainerId)
    var timer = setInterval(() => {
      if (placeholder != null && isPaypalIframePresent(bannerContainerId)) {
        placeholder.classList.add('fading')
        setTimeout(() => placeholder.remove(), placeholderFadeDuration)
        clearInterval(timer)
      }
    }, 50)
  }

  function getPlaceholder(bannerContainerId, placeholderClass) {
    return document.querySelector(`#${bannerContainerId} .${placeholderClass}`)
  }

  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
  }
}())
